[undefined]和[,]有什么区别?

8
在Chrome 21中,将[,]输入控制台会输出:

[undefined x 1]

而将[undefined]输入,则会输出:

[undefined]

[undefined][undefined x 1]之间有什么区别? [undefined x 1]表示什么意思?

4
我相信,您需要阅读这个链接(https://dev59.com/E2gv5IYBdhLWcg3wVPTU)。 - Vladislav Qulin
2
控制台输出不是数据,也不是*(必然的)*JavaScript符号或语法。它是数据的视觉表示,由控制台开发人员决定其外观。有时它很有帮助,有时它可能会让人感到困惑或误导。 - user1106925
4个回答

11

[,] 是一个稀疏数组。它的长度为 1,但没有值(0 in [,] === false)。也可以写成 new Array(1)

[undefined] 是一个长度为 1 的数组,在索引 0 处的值为 undefined

当访问属性 "0" 时,两者都会返回 undefined - 第一个是因为该属性未定义,第二个是因为该值为 "undefined"。然而,这两个数组是不同的,所以它们在控制台输出中的结果也不同。


5

[,]创建一个长度为1,没有索引的数组。

[undefined]创建一个长度为1,索引为0,值为undefined的数组。

undefined × x是Chrome中用于具有非连续索引的稀疏数组:

var a = [];

a[8] = void 0; //set the 8th index to undefined, this will make the array's length to be 9 as specified. The array is sparse
console.log(a) //Logs undefined × 8, undefined, which means there are 8 missing indices and then a value `undefined`

如果您在稀疏数组上使用 .forEach,它会跳过不存在的索引。
a.forEach(function() {
    console.log(true); //Only logs one true even though the array's length is 9
});

如果您使用正常的.length循环:

for (var i = 0; i < a.length; ++i) {
    console.log(true); //will of course log 9 times because it's only .length based
}

如果你期望.forEach的行为与非标准实现相同,那么就需要注意一个问题。

new Array(50).forEach( function() {
    //Not called, the array doesn't have any indices
});

$.each( new Array(50), function() {
    //Typical custom implementation calls this 50 times
});

0

这很奇怪,在Chrome 21上[]输出的仍然是[]

无论如何,[a, b, c, ...]是Javascript中的数组表示法,因此您基本上是定义了一个没有值的数组。

然而,为了使数组生成更容易,可以接受一个结尾的,。所以Chrome告诉你的是数组中有一个未定义的值。请参见代码示例。

[,,]
> [undefined x2]
[1,2,]
> [1, 2]
[1,2,,]
> [1, 2, undefined × 1]
[1,2,,,]
> [1, 2, undefined × 2]
[1,2,,3,4,,,6]
> [1, 2, undefined × 1, 3, 4, undefined × 2, 6]

1
这些值是未定义的,因为它们不存在;它们没有被设置为 undefined。而 JavaScript 可以完美地处理这样的数组。 - pimvdb
什么是未定义的定义?问题到底出在哪里? - dualed
问题在于措辞不够准确。如果您不介意的话,我已经进行了编辑。 - pimvdb
问题在于描述不存在的东西总会有许多可能的观点来看待文本... 我添加了一个额外的例子,应该可以非常清楚地说明我的意思 ;) - dualed

-1

看起来这只是一种简写方式,用于显示重复的“undefined”值。例如:

> [,,,]
  [ undefined x 3 ]

但是,[][undefined]完全不同。如果我是你,我会再仔细检查一下。


请再仔细阅读我的问题。我在问的是[,],而不是[] - Randomblue
@Randomblue 嗯,是的,因为你编辑了它... :-\ - nickf
@nickf:标题(正确的)没有被编辑。将问题中的[,]替换为[]并不是很有意义。 - Randomblue

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