JavaScript中“空”和“未定义”之间的区别?

时间:2018-08-20 17:44:51

标签: javascript arrays

根据ECMAScript,nullundefined数据类型彼此分开。 但是最近我看到了一个叫做empty的东西。让我们首先重新生成它(我将从基础知识开始):

let a = new Array() //返回[] length = 0

let b = new Array(3) //返回[empty*3] length = 3

let c = new Array(3).fill() //返回[undefined,undefined,undefined] length = 3

现在,什么? 看到所有定义的元素都是未定义的,应该是

  • a[0]=undefined
  • b[0]=undefined
  • c[0]=undefined

主要内容: 如果假设将元素添加到c的位置5,即a[5]=4 那么c将是[undefined,undefined,undefined,empty,4]

这之间的空东西是什么?如果一切相同,开始bc的初始化有什么区别(我在说[empty*3][undefined,undefined,undefined])。

在[此处]建议答案:What's the difference between empty items in a JavaScrip array and undefined?并未正确解释其确切含义。是的,它不能是undefined,因为undefined是一个值,但是null怎么办?如果不是null,为什么不是数据类型为空?

2 个答案:

答案 0 :(得分:0)

empty不是一种类型。这只是描述那里什么都没有的一种方法。不是undefinednull。完全缺乏价值。当它试图向您展示数组的表示时,您只会看到它。如果您实际查看这些索引,它将返回undefined

答案 1 :(得分:0)

数组是对象。那意味着你的数组

  [undefined,undefined,undefined,empty,4]

可以写成这样的对象:

 {
  0: undefined,
  1: undefined,
  2: undefined,
  // 3 doesnt exist at all
  4: 4,
  length: 5,
 }

因此undefined实际上是一个存在并保存值的插槽,而3甚至不是键值对。由于访问undefined中不存在的密钥不会导致现实世界的差异:

    array[2] // undefined
    array[3] // undefined

但是使用map遍历一个数组,其他遍历将跳过空数组,因此,在迭代之前,您应该使用.fill

检测差异的唯一方法是检查密钥是否存在:

  2 in array // true
  3 in array // false

要将empty转到undefined,可以设置密钥:

  array[3] = undefined;

并要将undefined转换为empty,必须删除密钥:

  delete array[3]

但这很少有关系。