JavaScript数组中空项和未定义的区别是什么?

15

考虑以下 JavaScript 代码(在 Node REPL 中):

> let a = new Array(10)
undefined
> a
[ <10 empty items> ]
> a.map(e => 1)
[ <10 empty items> ]
> let b = new Array(10).fill(undefined)
undefined
> b
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> b.map(e => 1)
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> 

当我创建一个空数组时,我会得到“空项”,它们似乎与undefined的行为不同。 有人能解释一下它们之间的区别吗?


在第一种情况下,可能只设置了长度。 - Giorgi Moniava
1
一个空的插槽不会在您的数组对象上设置“index-key”,因此某些方法将无法使用。 - Kaiido
@Mihai,您的编辑并未反映原始问题的标题或正文内容。 - Kaiido
2个回答

11
当我创建一个空数组时,我会得到'空项',它们似乎与未定义的行为不同。有人能解释一下其中的区别吗?
这是因为Array(10)没有填充数组,而只是将length属性设置为10。因此,使用Array构造函数创建的数组仅是具有长度属性但未填充任何项的对象。

9
那是因为undefined是一个值,而当你创建一个数组时,例如像这样:
var array = [];
array.length = 10;
console.log(array);
>(10) [empty × 10] // in google chrome

创建了10个空槽。 空槽与未定义值不同,最重要的区别在于空槽不可枚举。
var mappedArray = array.map(x => 1);
console.log(mappedArray);
>(10) [empty × 10] // in google chrome

由于map函数枚举原始数组中的值并返回相同长度的数组,因此它对具有10个空槽的数组没有影响。

请注意,不同浏览器中的空槽命名不同。


5
正式名称为“省略符号”Ellision http://www.ecma-international.org/ecma-262/6.0/#sec-array-initializer - Kaiido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接