JavaScrip数组中的空项与未定义的区别是什么?

时间:2018-05-14 08:32:00

标签: javascript arrays undefined

考虑以下JavaScript代码(在节点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 ]
> 

当我创建一个空数组时,我会得到空白项目&#39;它似乎与undefined的行为不同。有人可以解释一下有什么区别吗?

2 个答案:

答案 0 :(得分:6)

  

当我创建一个空数组时,我会得到“空项目”   表现与undefined不同。有人可以解释一下是什么   差?

那是因为Array(10)没有填充数组。但它只是将长度属性设置为10。因此,使用Array构造函数创建的数组只是一个具有length属性的对象,但没有填充任何项目。

答案 1 :(得分:1)

那是因为undefined是一个值,而当您创建一个数组时,例如:

var array = [];
array.length = 10;
console.log(array);
>(10) [empty × 10] // in google chrome

创建了10个空插槽。 空槽与未定义的值不同,最重要的区别是空槽不是Enumerable。

var mappedArray = array.map(x => 1);
console.log(mappedArray);
>(10) [empty × 10] // in google chrome

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

请注意,在不同的浏览器中,空插槽的名称会有所不同。