javascript - (new Array(10)).map(function() { return 1;}) 返回 [, , , , , ...] ... 为什么?

标签 javascript

<分区>

我希望以下代码返回 [1,1,1,1...]

(new Array(10)).map(function() { return 1;})

但它返回 [, , , , , ...]

此外, (new Array(10)).length == 10(new Array(10))[0] == undefined 为真。

对于 z = function(){return 0;}; 表达式 z(undefined) === 0 也为真。

但我注意到 [,,,,,,,,,,].map(function() { return 1; }) 也返回 [,,,,. ...]

谁能解释一下为什么?

最佳答案

So. I would expect the following code to return [1,1,1,1...].

(new Array(10)).map(function() { return 1;}) But it returns [, , , , , ...].

是的,因为 new Array(10) 创建了一个没有元素 的数组,length 为 10,map只迭代实际存在的元素。 (是的,这令人惊讶。:-))

Moreover, (new Array(10)).length == 10 and (new Array(10))[0] == undefined are true.

再次正确,因为(再次)new Array(10) 没有在数组中放置任何元素,所以访问 [0] 给你 undefined

JavaScript 的标准数组 aren't really arrays at all , 它们可以有一个正数的 length 而没有任何条目。它们是“稀疏”数组的一种形式。

让我们举一个更简单的例子:

var a = new Array(10);
a[2] = 1;

该数组包含一个 元素,即索引2 处的元素。索引 0 处没有元素,索引 1 处没有元素,索引 3 处及以上没有元素。它只是有差距。你可以通过询问来判断:

console.log(0 in a); // "false"
console.log(1 in a); // "false"
console.log(2 in a); // "true"

JavaScript 中的标准数组只是具有分配给 length 的特殊行为的对象,分配给一类属性名称(松散的数字名称)的特殊行为,并且由 Array 支持。原型(prototype).

这完全不同于较新的“类型化”数组,Int32Array 等,它们是传统意义上的真正数组。

关于javascript - (new Array(10)).map(function() { return 1;}) 返回 [, , , , , ...] ... 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646371/

相关文章:

javascript - 带有 sIDE 3 的文本渐变

javascript - 可变变量可以通过 jQuery 中的闭包访问

javascript - jQuery 子窗口通知父窗口

javascript - 过滤和克隆对象属性

javascript - Select2 将复制选项选择到禁用字段

javascript - JQuery UI 自动完成 : . 数据(...)未定义 [但仅当我添加第二个自动完成框时]

javascript - Vis.js:如何在事件处理程序内访问网络?

javascript - AngularJS 如何从父组件触发子组件中的函数?

javascript - Angular 'For loop' 未按顺序显示

javascript - 如何让 Gridster 更快地响应移动设备上的拖动事件