JavaScript 類數(shù)組對象與 arguments

在 JavaScript 中存在一種特殊的對象,我們稱之為類數(shù)組對象,其性質與數(shù)組相似。我們經(jīng)常會遇到各種類數(shù)組對象,最常見的便是 argumengs。

類數(shù)組對象

所謂類數(shù)組對象,就是指可以通過索引屬性訪問元素并且擁有 length 屬性的對象。

一個簡單的類數(shù)組對象是長這樣的

var arrLike = {
  0: 'name',
  1: 'age',
  2: 'job',
  length: 3
}

而它所對應的數(shù)組應該是這樣子的

var arr = ['name', 'age', 'job'];

我們說類數(shù)組對象與數(shù)組的性質相似,是因為類數(shù)組對象在訪問、賦值獲取長度上的操作與數(shù)組是一致的。

數(shù)組與類數(shù)組對象的訪問

console.log(arr[0]); // name
console.log(arrLike[0]); // name

數(shù)組與類數(shù)組對象的賦值

arr[0] = 'new name';
arrLike[0] = 'new name';

獲取數(shù)組與類數(shù)組對象的長度

console.log(arr.length); // 3
console.log(arrLike.length); // 3

可以看出,在訪問、賦值、獲取長度時,對類數(shù)組對象的操作與對數(shù)組是一致的。那么,類數(shù)組對象與數(shù)組的區(qū)別是在哪里呢?

類數(shù)組對象與數(shù)組的區(qū)別是類數(shù)組對象不能直接使用數(shù)組的方法。

如下類數(shù)組對象使用數(shù)組方法時會報錯

arrLike.push('hobby');  // Uncaught TypeError: arrLike.push is not a function

那么我們希望類數(shù)組對象能夠和數(shù)組一樣使用數(shù)組的方法,應該怎么做呢?我們一般是通過 Function.call 或者 Function.apply 方法來間接調用。

// 使用 call
Array.prototype.push.call(arrLike, 'hobby');
console.log(arrLike); // { '0': 'name', '1': 'age', '2': 'job', '3': 'hobby', length: 4 }
var arrLikeStr = Array.prototype.join.call(arrLike, '&')
console.log(arrLikeStr); // name&age&job&hobby
// 使用 apply
Array.prototype.push.apply(arrLike, ['hobby']);
console.log(arrLike); // { '0': 'name', '1': 'age', '2': 'job', '3': 'hobby', length: 4 }
var arrLikeStr = Array.prototype.join.apply(arrLike, ['&'])
console.log(arrLikeStr); // name&age&job&hobby

在實際的開發(fā)過程中,為了方便對數(shù)據(jù)的操作,我們還經(jīng)常會通過 Array.prototype.slice 或 Array.prototype.splice 等方法把類數(shù)組對象轉換成真正的數(shù)組。

// 使用 call
console.log(Array.prototype.slice.call(arrLike,0));
console.log(Array.prototype.splice.call(arrLike,0));  // 會改變原先的類數(shù)組對象
// 使用 apply
console.log(Array.prototype.slice.apply(arrLike,[0]));
console.log(Array.prototype.splice.apply(arrLike,[0]));  // 會改變原先的類數(shù)組對象

需要注意的是,Array.prototype.slice 方法不會改變原先類數(shù)組對象,而 Array.prototype.splice 會改變原先的類數(shù)組對象,這一點跟數(shù)組調用 slice 或 splice 方法時的行為是一致的。

arguments

在函數(shù)體中定義了 Arguments 對象,其包含函數(shù)的參數(shù)和其它屬性,以 arguments 變量來指代。

舉個例子

function fn(name, age, job) {
    console.log(arguments);
}

fn('ttsy', '25', 'front end')

在控制臺上我們可以看到上述函數(shù)打印的結果如下

可以看到 arguments 中包含了函數(shù)傳遞的參數(shù)、length、和 callee 屬性。

length 屬性表示的是實參的長度,即調用函數(shù)的時候傳入的參數(shù)個數(shù)。

function fn(name, age, job) {
    console.log(arguments.length);  // 2
}

fn('ttsy', '25')

callee 屬性則指向的函數(shù)自身,我們可以通過它來調用自身函數(shù)。

arguments 是一個經(jīng)典的類數(shù)組對象,我們可以通過上述的 Function.call 或者 Function.apply 方法來間接調用數(shù)組的方法,也可以直接通過 Array.prototype.slice 或 Array.prototype.splice 等方法把類數(shù)組對象轉換成真正的數(shù)組。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容