JavaScript:为什么这两个看似等效的程序的控制台输出略有不同?

dou*_*Ort 4 javascript

这个程序:

 var arr = [];
    arr[100] = "foo";
    console.log(arr);
Run Code Online (Sandbox Code Playgroud)

输出:

(101) [undefined × 100, "foo"]
Run Code Online (Sandbox Code Playgroud)

但是,这个程序:

var arr = [];
for(var i = 0; i < 101; i++) {
arr[i] = (i === 100 ? "foo" : undefined);
}
console.log(arr);
Run Code Online (Sandbox Code Playgroud)

输出这个("foo"当然最终有):

(101) [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined…]
Run Code Online (Sandbox Code Playgroud)

我可能会挑剔,但我只是想确定,为什么输出不同?两个阵列不应该相同吗?

在Chrome版本58中运行.

lla*_*ama 5

他们不等同.

第一个是稀疏的,只有一个成员在索引处100.第二个有101个成员,其中大多数是价值undefined.

稀疏数组是指成员少于.length建议的数组.所以,如果你有一个数组,其中.length101所有指标有一个值,它不是稀疏的,但如果有"洞"里的实际索引/值丢失,这是一个稀疏数组.

要检查是否数组是稀疏的,你可以比较其.length.length结果的Object.keys.

var isSparse = arr.length !== Object.keys(arr).length;
Run Code Online (Sandbox Code Playgroud)

要检查是否实际定义了单个成员,请使用in运算符:3 in arr.hasOwnProperty()方法:arr.hasOwnProperty(3)