gpt4 book ai didi

javascript - Javascript 数组中的 length 属性

转载 作者:行者123 更新时间:2023-11-28 13:24:48 27 4
gpt4 key购买 nike

为什么数组的 length 属性不会在 for in 循环中迭代?我有以下代码:

var a = new Array();
for (i in a) {
if (i === 'length')
alert(i)
};

以上不会导致任何警报。但是,如果我将“长度”字符串更改为“克隆”,则会发出警报。我不明白这一点,因为“length”和“clone”似乎都是 Array 对象的成员,如下所示:

console.dir(a)

搜索Google,我只找到了使用hasOwnProperty方法的建议。这没有任何帮助,只会导致两种情况都不会发出警报。

最佳答案

for (i in a) Javascript 中的结构列出了标记为 enumerable 的 Javascript 对象的属性。 。它列出了对象的所有可枚举属性,无论它们是直接在对象上还是通过原型(prototype)继承。 “可枚举”是属性的特定特征。您可以拥有可枚举或不可枚举的对象属性。

.length属性未标记为可枚举,因此不会使用 for (i in a) 显示结构。如果您自己创建一个属性 Object.defineProperty() ,您可以控制可枚举属性(以及其他几个属性)。如果您只是直接添加属性而不使用 Object.defineProperty() 指定其自定义属性,那么该属性默认是可枚举的。

For a variety of reasons ,您永远不应该尝试使用 for (i in a) 迭代数组的元素。结构。该结构明确设计为列出 Javascript 对象的可枚举属性,该对象将包含所有 Array 元素,但也可能包含其他可枚举属性(如您所见)。数组元素应该用以下方式枚举:

for (var i = 0, len = array.length; i < len; i++) {
// array[i]
}

array.forEach(function(val, index, array) {
// code here
});
<小时/>

至于您对.clone的观察,这不是 Array 对象的标准属性。我猜测它可能已被某些第三方库添加到数组原型(prototype)中,并且它显然被标记为可枚举,这解释了为什么它显示在您的 for (i in a) 中循环。

<小时/>

.hasOwnProperty()通常用于过滤掉原型(prototype)上的属性,因此您只需迭代直接应用于对象的属性(不是从原型(prototype)继承),这解释了为什么它会过滤掉 .clone属性(如果它在原型(prototype)上)。

无论如何,如果您的目标是迭代数组的元素(而不是添加到 Array 对象的任何自定义属性),那么您应该使用上述两种迭代方法之一,然后您就不会担心.hasOwnProperty()或原型(prototype)或 Array 对象本身的其他可枚举属性。

关于javascript - Javascript 数组中的 length 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30011660/

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