JavaScript 中的“undefined x 1”是什么?

问题描述 投票:0回答:5

我正在根据这个博客条目做一些小实验。

我正在 Google Chrome 的调试器中进行这项研究,困难的部分来了。

What the heck is this?!

我发现我无法删除局部变量(因为它们不是对象属性)。我知道我可以从名为“arguments”的数组中“读出”传递给函数的所有参数。我什至知道我无法删除数组的元素,只能实现

array[0]
具有未定义的值。

有人可以向我解释一下嵌入图像上的

undefined x 1
意味着什么吗?

当我覆盖函数

foo
以返回
arguments[0]
时,我会得到通常的“正常”未定义。

这只是一个实验,但看起来很有趣,有人知道

undefined x 1
指的是什么吗?

javascript arrays properties sparse-matrix
5个回答
40
投票

这似乎是 Chrome 在数组(和类数组对象)中显示未初始化索引的新方法:

> Array(100)
[undefined × 100]

这肯定比打印

[undefined, undefined, undefined,...]
或者之前的方式更好。

尽管如此,如果只有一个

undefined
值,他们可能会删除
x 1


8
投票

较新版本的 Chrome 使用

empty
而不是
undefined
以使区别更加清晰。

例如,在 DevTools 控制台中输入

[,,undefined,,]
会导致:

▼(4) [empty × 2, undefined, empty]
   2: undefined
   length: 4
  ▶__proto__: Array(0)

2
投票

Google Chrome 似乎选择使用此 undefined x n 表示法来显示

稀疏数组
。 如果不是稀疏数组,会显示
[undefined, undefined]

var arr = new Array(2);
console.log(arr);

var arr2 = [];
arr2[3] = 123;
console.log(arr2);

var arr3 = [,,,];
console.log(arr3)

var arr4 = [,];
console.log(arr4)

var arr5 = [undefined, undefined]
console.log(arr5)

var arr6 = [undefined]
console.log(arr6)

arr1 到 arr4 都是稀疏数组,而 arr5 和 arr6 不是。 Chrome 会将它们显示为:

[undefined × 2] 
[undefined × 3, 123] 
[undefined × 3] 
[undefined × 1] 
[undefined, undefined] 
[undefined] 

注意稀疏数组的

[undefined x 1]

既然你删除了一个元素,那么: 如果你从数组中删除一个元素,数组就会变得稀疏。


2
投票

这是它的样子,将此代码输入 chrome devtools 控制台:-

arr = new Array(4);
arr[2] = "adf";
console.log(arr);    // [undefined × 2, "adf", undefined × 1]

看到*2代表的前两个连续的“undefined”,说明那里有两个连续的undefined


0
投票

这也发生在我身上。在另一个浏览器中打开相同的内容并将数组输出/记录到控制台。只要它在 crome 和 firefox 中都以相同的方式工作(就像访问元素工作正常,即使输出具有 undefinedx1),我认为这是 Chrome 中的某种错误,没有在内部刷新某些内容。你实际上可以这样测试:

  1. 我正在向数组添加元素,并触发 console.log() 来记录该元素,以检查它是否未定义。它们都被定义了。

  2. 在push()之后我记录了数组,似乎当这种情况发生时,它总是最后一个在Chrome上未定义x 1。

  3. 然后我尝试记录更多次,也稍后记录,但结果相同。

  4. 但是,当我通过索引访问该元素(为了输出)时,它返回了正确的值(有趣)。

  5. 之后我再次记录该数组,它说最后一个索引未定义x 1(我刚刚成功直接访问了该索引!)。

  6. 然后我在数组上做了一个 for 循环,记录或使用每个元素,一切都显示得很好。

  7. 然后再次登录阵列,仍然有问题。

    我最初使用的代码检查了未定义,但它们没有触发,但我在控制台中看到所有这些未定义,这让我很烦恼(没有双关语)。

还值得一读:仅使用 Array.push 时数组中的统一变量?我也在代码中使用 pop() ,这是一个合理的解释,控制台日志实际上代表了不同的时间状态(当代码已“停止”)。

© www.soinside.com 2019 - 2024. All rights reserved.