数组和伪数组
伪数组是一个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")
)
差别
- 对象没有数组的Array.prototype 的属性值,类型是 Object ,而数组类型是 Array
- 数组是索引,对象是键值对
- 使用对象创建伪数组,伪数组可以使用部分方法
伪数组转真数组
1. [].slice.call(obj)
等于Array.protype.slice.call(obj), slice会把通过索引位置获取新的数组,该方法不会修改原数组,只是返回一个新的子数组.call会把this的指向改为传进去的obj
2. Array.form(obj)
ES6语法, var newArr=Array.from(obj)
3. 扩展运算符
ES6语法, var newArr= [...obj]