我正在根据这个博客条目做一些小实验。
我正在 Google Chrome 的调试器中进行这项研究,困难的部分来了。
我发现我无法删除局部变量(因为它们不是对象属性)。我知道我可以从名为“arguments”的数组中“读出”传递给函数的所有参数。我什至知道我无法删除数组的元素,只能实现
array[0]
具有未定义的值。
有人可以向我解释一下嵌入图像上的
undefined x 1
意味着什么吗?
当我覆盖函数
foo
以返回 arguments[0]
时,我会得到通常的“正常”未定义。
这只是一个实验,但看起来很有趣,有人知道
undefined x 1
指的是什么吗?
这似乎是 Chrome 在数组(和类数组对象)中显示未初始化索引的新方法:
> Array(100)
[undefined × 100]
这肯定比打印
[undefined, undefined, undefined,...]
或者之前的方式更好。
尽管如此,如果只有一个
undefined
值,他们可能会删除 x 1
。
较新版本的 Chrome 使用
empty
而不是 undefined
以使区别更加清晰。
例如,在 DevTools 控制台中输入
[,,undefined,,]
会导致:
▼(4) [empty × 2, undefined, empty]
2: undefined
length: 4
▶__proto__: Array(0)
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]
。
既然你删除了一个元素,那么: 如果你从数组中删除一个元素,数组就会变得稀疏。
这是它的样子,将此代码输入 chrome devtools 控制台:-
arr = new Array(4);
arr[2] = "adf";
console.log(arr); // [undefined × 2, "adf", undefined × 1]
看到*2代表的前两个连续的“undefined”,说明那里有两个连续的undefined
这也发生在我身上。在另一个浏览器中打开相同的内容并将数组输出/记录到控制台。只要它在 crome 和 firefox 中都以相同的方式工作(就像访问元素工作正常,即使输出具有 undefinedx1),我认为这是 Chrome 中的某种错误,没有在内部刷新某些内容。你实际上可以这样测试:
我正在向数组添加元素,并触发 console.log() 来记录该元素,以检查它是否未定义。它们都被定义了。
在push()之后我记录了数组,似乎当这种情况发生时,它总是最后一个在Chrome上未定义x 1。
然后我尝试记录更多次,也稍后记录,但结果相同。
但是,当我通过索引访问该元素(为了输出)时,它返回了正确的值(有趣)。
之后我再次记录该数组,它说最后一个索引未定义x 1(我刚刚成功直接访问了该索引!)。
然后我在数组上做了一个 for 循环,记录或使用每个元素,一切都显示得很好。
然后再次登录阵列,仍然有问题。
我最初使用的代码检查了未定义,但它们没有触发,但我在控制台中看到所有这些未定义,这让我很烦恼(没有双关语)。
还值得一读:仅使用 Array.push 时数组中的统一变量?我也在代码中使用 pop() ,这是一个合理的解释,控制台日志实际上代表了不同的时间状态(当代码已“停止”)。