偽數組和數組
記住一句話: 偽數組是一個Object,數組是Array。
對象和數組之間的關系
JavaScript的內置函數繼承與 Object.prototype
。
可以認為new Array()
和[]
創建出來的數組對象, 都擁有Object.prototype
屬性值。
var obj = {}; //擁有Object.prototype的屬性值
var arr = []; //由於Array.prototype的屬性繼承自Object.prototype, 那么它就是擁有兩個屬性
// 即Array.prototype和Object.prototype
注意: 對象沒有數組的Array.prototype屬性值
什么是數組
數組的基本特征: 索引(下標)取值
var obj = {};
var array = [];
obj[0] = "L";
array[0] = "L";
console.log(obj); // {0: "L"}
console.log(obj[0]); // L
console.log(array[0]); // L
console.log(obj.length); // undefined
console.log(array.length); // 1
- 數組取值是根據索引進行獲取值, 而對象是根據鍵值對進行取值
- 對象沒有數組的特性(索引),並且obj沒有保存屬性length,那么就是未定義,所以undefined
- 對於數組來講,length是數組的內置屬性,數組根據索引長度來更改length
什么是偽數組
- 具有length屬性,其他屬性(索引)為非負整數(對象中的索引會被當做字符串來處理,這里你可以當做是個非負整數串來理解)
- 不具有數組的方法
偽數組類似於Python中的字典
var fakeArray = {
"0":"胡珺",
"1":23,
length:2
};
for (var i=0;i<fakeArray.length;i++){
console.log(fakeArray[i])
}
常見的偽數組
- 函數內部的
arguments
- DOM對象列表(
document.getElementsByTags
) - jQuery對象(
$("div")
)
注意: 偽數組是一個對象
簡單的一個應用
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
}
;[].push.call(obj, 'd');
console.log([].slice.call(obj))
;[].forEach.call(obj, function (num, index) {
console.log(num)
})
差別
- 對象沒有數組的Array.prototype 的屬性值,類型是 Object ,而數組類型是 Array
- 數組是索引,對象是鍵值對
- 使用對象創建偽數組,偽數組可以使用部分方法