JavaScript 類陣列物件與 arguments
在 JavaScript 中存在一種特殊的物件,我們稱之為類陣列物件,其性質與陣列相似。我們經常會遇到各種類陣列物件,最常見的便是 argumengs。
類陣列物件
所謂類陣列物件,就是指可以 通過索引屬性訪問元素 並且 擁有 length 屬性的物件。
一個簡單的類陣列物件是長這樣的
var arrLike = { 0: 'name', 1: 'age', 2: 'job', length: 3 }
而它所對應的陣列應該是這樣子的
var arr = ['name', 'age', 'job'];
我們說類陣列物件與陣列的性質相似,是因為類陣列物件在 訪問 、 賦值 、 獲取長度 上的操作與陣列是一致的。
陣列與類陣列物件的訪問
console.log(arr[0]); // name console.log(arrLike[0]); // name
陣列與類陣列物件的賦值
arr[0] = 'new name'; arrLike[0] = 'new name';
獲取陣列與類陣列物件的長度
console.log(arr.length); // 3 console.log(arrLike.length); // 3
可以看出,在訪問、賦值、獲取長度時,對類陣列物件的操作與對陣列是一致的。那麼,類陣列物件與陣列的區別是在哪裡呢?
類陣列物件與陣列的區別是 類陣列物件不能直接使用陣列的方法。
如下類陣列物件使用陣列方法時會報錯
arrLike.push('hobby');// Uncaught TypeError: arrLike.push is not a function
那麼我們希望類陣列物件能夠和陣列一樣使用陣列的方法,應該怎麼做呢?我們一般是通過 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
在實際的開發過程中,為了方便對資料的操作,我們還經常會通過 Array.prototype.slice 或 Array.prototype.splice 等方法把類陣列物件轉換成真正的陣列。
// 使用 call console.log(Array.prototype.slice.call(arrLike,0)); console.log(Array.prototype.splice.call(arrLike,0));// 會改變原先的類陣列物件
// 使用 apply console.log(Array.prototype.slice.apply(arrLike,[0])); console.log(Array.prototype.splice.apply(arrLike,[0]));// 會改變原先的類陣列物件
需要注意的是,Array.prototype.slice 方法不會改變原先類陣列物件,而 Array.prototype.splice 會改變原先的類陣列物件,這一點跟陣列呼叫 slice 或 splice 方法時的行為是一致的。
arguments
在函式體中定義了 Arguments 物件,其包含函式的引數和其它屬性,以 arguments 變數來指代。
舉個例子
function fn(name, age, job) { console.log(arguments); } fn('ttsy', '25', 'front end')
在控制檯上我們可以看到上述函式列印的結果如下

可以看到 arguments 中包含了函式傳遞的引數、length、和 callee 屬性。
length 屬性表示的是實參的長度,即呼叫函式的時候傳入的引數個數。
function fn(name, age, job) { console.log(arguments.length);// 2 } fn('ttsy', '25')
callee 屬性則指向的函式自身,我們可以通過它來呼叫自身函式。
arguments 是一個經典的類陣列物件,我們可以通過上述的 Function.call 或者 Function.apply 方法來間接呼叫陣列的方法,也可以直接通過 Array.prototype.slice 或 Array.prototype.splice 等方法把類陣列物件轉換成真正的陣列。