首页 > 解决方案 > 我们如何创建像“arguments”这样的类数组对象?

问题描述

const arrayLike = {
    0: 0,
    1: 1,
}

arrayLike[Symbol.iterator] = () => {
    let index = -1;
    return {
        next() {
            index ++;
            return {done: arrayLike[index] === undefined, value: arrayLike[index]}
        }
    }
}

arrayLike.length = 2


console.log(Array.from(arrayLike))  // [1, 2]
console.log(Array.prototype.slice.call(arrayLike)) // [1, 2]

我们可以添加一个长度属性或分配 Symbol.iterator 来创建一个类似数组的对象。

标签: javascriptarraysslice

解决方案


您需要使用 arrayLike 对象的调用上下文进行调用 .slice照原样,与

Array.prototype.slice(arrayLike)

.slice使用 的调用上下文进行调用Array.prototype,参数(开始切片的索引)为arrayLike. Array.prototype实际上不是数组,因此返回一个空数组。

另请注意,迭代器不是必需的。

const arrayLike = {
    0: 0,
    1: 1,
    length: 2,
};

console.log(Array.from(arrayLike))
console.log(Array.prototype.slice.call(arrayLike))

之后将 a 分配.length给对象可以正常工作:

const arrayLike = {
  0: 0,
  1: 1,
};
arrayLike.length = 2;

console.log(Array.from(arrayLike))
console.log(Array.prototype.slice.call(arrayLike))


推荐阅读