根据ECMAScript,null
和undefined
数据类型彼此分开。
但是最近我看到了一个叫做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]
这之间的空东西是什么?如果一切相同,开始b
和c
的初始化有什么区别(我在说[empty*3]
和[undefined,undefined,undefined]
)。
在[此处]建议答案:What's the difference between empty items in a JavaScrip array and undefined?并未正确解释其确切含义。是的,它不能是undefined
,因为undefined
是一个值,但是null
怎么办?如果不是null
,为什么不是数据类型为空?
答案 0 :(得分:0)
empty
不是一种类型。这只是描述那里什么都没有的一种方法。不是undefined
或null
。完全缺乏价值。当它试图向您展示数组的表示时,您只会看到它。如果您实际查看这些索引,它将返回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]
但这很少有关系。