类数组对象
定义:
- 可以通过索引属性访问元素并且拥有length属性的对象
示例:
var arrLike = {
0: 'name',
1: 'age',
2: 'job',
length: 3
}
为什么叫「类数组」:
- 在访问、赋值、获取长度上的操作与数组是一致的
- 区别:
- 类数组不能直接使用数组的方法,会报错
- 类数组如何调用数组的方法:
- Array.prototype.push.call
- Array.prototype.push.apply
类数组对象 -> 数组对象
终于到了题目的内容,类数组对象 -> 数组对象的方法大概可以分为4类:
1. 使用生成新数组的数组操作方式:slice/splice/concat
原理很简单,通过对类数组进行操作,获取到生成的新数组,比如slice从0开始,这其中又分为:
- 不改变原类数组:
- Array.prototype.slice
- Array.prototype.concat(只能使用apply)
- 原类数组清空:
- Array.prototype.splice ```javascript // call Array.prototype.slice.call(arrLike, 0); // 不改变原类数组 Array.prototype.splice.call(arrLike, 0); // 原类数组清空
// apply Array.prototype.slice.apply(arrLike, [0]); // 不改变原类数组 Array.prototype.splice.apply(arrLike, [0]); // 原类数组清空 Array.prototype.concat.apply([], arrLike);
<a name="35nzN"></a>
#### 2. 使用 Array.from (ES6)
到了es6,问题就更简单了,Array 提供静态方法 from 专门用于「从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。」,只要对类数组对象操作一下就行了。
```javascript
Array.from(arrLike)
3. 直接遍历对象赋值
不把类数组对象当成数组,而是当成一个普通对象来处理。
var a = Object.keys(arrLike)
.map(key => key !== 'length' ? arrLike[key] : null)
.filter(val => !!val)
4. (arguments专用) 使用扩展运算符
与普通的类数组不同,arguments可以通过扩展运算符…来转换成数组,这可能是因为他Symbol(Symbol.iterator) 的属性进行遍历。
function func(...arguments) {
console.log(arguments); // [1, 2, 3]
}
func(1, 2, 3);