什么是 Array-Like Objects
顾名思义, 就是 类数组的对象。类数组对象具有数组的属性length,但是没有 数组 的一些方法, 比如 push。如下
const arrayLike = {
0: "1",
1: "2",
length: 2
}
比如 arguments 就是一个 Array-Like Objects。
function sum() {
console.log(arguments)
}
sum( 1, 2, 3 )
那么我们怎么将 array-like 转换成 array 呢?
Array-Like 转 Array
方法一: 遍历迭代
因为 Array-Like Objects 是有长度的,所以我们可以对其进行遍历, 将其每一个元素塞进新的数组
function sum() {
let arr = []
for(let i = 0; i < arguments.length; i++) {
arr.push(arguments[i])
}
arguments = arr
arguments.push(4) // 此时的 argument 已经是数组了,可以进行数组的 push 操作
console.log(arguments) // [ 1, 2, 3, 4 ]
}
sum( 1, 2, 3 )
方法二: 使用 Array.prototype.slice.call()
function sum() {
arguments = Array.prototype.slice.call(arguments);
// arguments = [].slice.call(arguments);
arguments.push(4) // 此时的 arguments 已经是数组了,可以进行数组的 push 操作
console.log(arguments) // [ 1, 2, 3, 4 ]
}
sum( 1, 2, 3 )
同理,使用 Array.prototype.slice.apply()、Array.prototype.slice.bind() 也是一样的。
方法三: Array.from()
function sum() {
arguments = Array.from(arguments);
arguments.push(4); // 此时的 arguments 已经是数组了,可以进行数组的 push 操作
console.log(arguments); // [ 1, 2, 3, 4 ]
}
sum( 1, 2, 3 )
补充:
评论区小伙伴提出的 es6 解构也能实现,更简洁优雅
function sum() {
arguments = [ ...arguments];
arguments.push(4); // 此时的 arguments 已经是数组了,可以进行数组的 push 操作
console.log(arguments); // [ 1, 2, 3, 4 ]
}
sum( 1, 2, 3 )