gpt4 book ai didi

javascript - 数组长度和 undefined index

转载 作者:行者123 更新时间:2023-12-02 23:47:56 25 4
gpt4 key购买 nike

我只是想了解 Javascript 数组是如何工作的,但我这里有一个复杂的问题。

首先我创建了我的数组:

var arr = [];

并在其中设置一些元素:

arr[5] = "a thing";
arr[2] = undefined;

我认为我应该有一个大小为 2 的数组,因为我在 2 个特定索引处只有两个对象。所以我用数组的 .length 属性对其进行了测试:

document.write(arr.length + "<br>");

有趣的是,结果是 6。但它必须包含两项。它的大小怎么可能是6?可能和我使用的最新索引有关,这里arr[5] = "a thing";

然后我尝试循环它:

var size = 0;
for(var x in arr){
size++;
}

并且 size 变量现在是 2。所以,我从中学到了什么:如果我使用 for in 循环,我将计算其中有多少个属性,不是它的最后一个索引。

但是,如果我尝试 document.write(arr[4]) (尚未设置),它会写入 undefined

那么为什么在 for..in 循环中计算的是 arr[2],而不是 arr[4]

让我回答我的问题:我在想什么 typeof undefined == undefined 这是令人惊讶的真实。但这是 JavaScript,我们需要使用他自己的规则来玩它:)

jsFiddle和下面的片段。

var arr = [];

arr[5] = "a thing";
arr[2] = undefined;
document.write(arr.length + "<br>");

var size = 0;
for(var x in arr){
size++;
}

document.write(size + "<br>");

document.write(arr[4] + "<br>");

最佳答案

注意:数组索引只不过是数组对象的属性。

引用 MDN 的 Relationship between length and numerical properties部分,

When setting a property on a JavaScript array when the property is a valid array index and that index is outside the current bounds of the array, the engine will update the array's length property accordingly.

引用 Array Objects 的 ECMA Script 5 规范,

whenever a property is added whose name is an array index, the length property is changed, if necessary, to be one more than the numeric value of that array index; and whenever the length property is changed, every property whose name is an array index whose value is not smaller than the new length is automatically deleted

因此,当您在索引 5 设置值时,JavaScript引擎将Array的长度调整为6 .

<小时/>

引用 Array Objects 的 ECMA Script 5 规范,

A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 232−1.

所以,就你而言24是有效索引,但只有 2是在数组中定义的。您可以这样确认

arr.hasOwnProperty(2)

数组中尚未定义其他索引。因此,您的数组对象称为稀疏数组对象

So why arr[2] is counted in for..in loop and not arr[4] is not counted?

for..in枚举对象的所有有效可枚举属性。就你而言,因为只有 2是数组中的有效属性,它将被计数。

但是,当您打印 arr[4] 时,它打印 undefined ,因为 JavaScript 将返回 undefined ,如果您尝试访问对象中未定义的属性。例如,

console.log({}['name']);
// undefined

同样,从4开始尚未在 arr 中定义, undefined已返回。

<小时/>

当我们讨论这个主题时,您可能也想阅读这些答案,

关于javascript - 数组长度和 undefined index ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com