javascript - Javascript:'new Array(4)' 与 Array.apply(null, {length: 4}) 有何不同?
问题描述
我想生成一个给定长度的空数组并用一些数字填充它。生成具有四个连续数字元素的数组的一种方法是:
var x = Array.apply(null, {length: 4}).map(function(item, index){return index;})
但是当我看到时,Array.apply(null, {length: 4})
我想我可以用它来代替它,new Array(4)
但事实并非如此。进行快速测试会产生以下结果:
>> console.log((new Array(4)))
<< [ <4 empty items> ]
>> console.log(Array.apply(null, {length: 4}))
<< [ undefined, undefined, undefined, undefined ]
这意味着我可以.map
后者但不能前者。
那么两者之间有什么区别new Array
,Array.apply(null, {})
我认为它们都创建了一个给定长度的数组对象?
解决方案
apply
将上下文作为第一个参数,将一个类似数组的参数列表作为第二个参数。然后它Array
以可迭代对象作为参数调用函数 ()。
Array.apply(null, [1, 2])
// Same as
Array(1, 2)
// Or
[1, 2]
现在,如果您将对象作为类数组传递,它仍然会像这样迭代它:
function apply(context, args) {
for(var i = 0; i < args.length; i++) {
/*...*/ args[i];
}
}
因此,如果您通过{ length: 4 }
它,它将迭代四次并undefined
作为参数,因此它会产生如下结果:
Array.apply(null, { length: 4 })
// Same as
Array(undefined, undefined, undefined)
因此,数组槽不是空的,而是未定义的,并且由于map
只跳过空槽,它将遍历第二个数组的每个条目。
顺便说一句,同样可以实现更具可读性:
Array.from({length: 4 }, (_, i) => i)
// [0, 1, 2, 3]
推荐阅读
- ruby-on-rails - 如何翻译 ActiveStorage 属性
- javascript - 为什么调用不带参数的函数时会出现未定义的错误?
- machine-learning - scikitlearn 删除频率较低的分类类
- python - Web Scraping Asp.NET 网站使用 Beautiful Soup 和 Python
- c - 在我的代码中对引用调用和值调用感到困惑
- jquery - GSAP 每秒帧数 (fps) 更改 onStart() 和 onComplete()
- c# - .Net Standard 中的 CryptographicBuffer 等效项?
- database - 在 Oracle Database 12c 中查看用户活动历史记录
- spring-boot - Spring Boot Xss 不适用于请求标头
- javascript - 为什么“错误”变量重新分配在 catch{} 块内没有功能范围?