javascript - 我们如何创建像“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 来创建一个类似数组的对象。
解决方案
您需要使用 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))
推荐阅读
- ruby-on-rails - 如何清理代码并消除 NoMethodError 异常
- c# - .NET 问题从单元测试中删除 TestContext
- c# - ASP.Net Core 3 MVC 中的多个绑定(前缀 =“...”)
- java - 如何根据客户端应用程序动态获取 EJB jar 中的数据源名称
- angular - 默认路由中带有占位符的角度路由
- java - 在测试用例中没有从 application.yml 文件中获取值?
- pandas - 使用 Altair 绘制多索引数据框
- python-3.x - 如何在从 python 调用时摆脱 VBS 命令外壳
- data-visualization - 在 Mapbox Studio 中排除指定区域之外的标签
- react-native - 我对 react native/expo 的初始设置表单 api-platform/client-generator 有问题