gpt4 book ai didi

javascript - for (var i in yourObjects) { ... } 和 .hasOwnProperty() ... 讨论

转载 作者:行者123 更新时间:2023-11-30 07:43:03 27 4
gpt4 key购买 nike

var yourObjects = [ 

{ object: {obj1:"aa"}, direction: 'top' },
{ object: "obj2", direction: 'left' },
{ object: "obj3", direction: 'bottom' }

];

for (var i in yourObjects) { alert(i); }

对此进行了长时间的讨论。使用 for in 迭代一个对象返回对象的所有属性和方法,所以通常 .hasOwnProperty()应该使用方法。但是当我们迭代一个数组时,实际上 for in 会迭代数组的索引(如果是关联数组,则为键)。我在我拥有的所有浏览器中都尝试过。但是当在 jsfiddle 中尝试时......它不一样......返回数组具有的所有方法。

所以我的问题是:使用 for in 迭代数组是否安全?

在您的浏览器和 jsfiddle 中尝试这段代码,然后告诉我您的想法。

最佳答案

不在数组上使用 for-in 的原因不止一个。

请记住,在 JavaScript 中,数组只是对象的一种类型,因此对数组执行 for-in 与对普通对象执行 for-in 没有什么不同对象。

在您的 jsFiddle 中,您可能在左侧选择了一个库来扩充 Array.prototype,这将是这些方法的来源。

但还有另一个原因。 for-in 不保证枚举属性的顺序。因为没有约束,它可以乱序枚举您的索引,并且完全符合 ECMAScript。

此外,还有类似数组的集合,例如 NodeLists,它们也不应该使用 for-in,因为它们包含除了 DOM 元素之外还可以枚举的默认属性。

一个简单的事实是,在 JavaScript 中,for-in 不是基于索引的枚举的合适工具。


对于对象,只有在有特定需要时才需要使用 hasOwnProperty

有人建议它必须用在所有对象上。那是一种极度偏执的心态。该方法是一个 guard ,应该在有意义的狭窄情况下使用。

大多数时候使用它没有任何意义,只要您遵守良好的编程习惯即可。这包括不在 Object.prototype 上放置可枚举属性。对编程环境的要求是简单合理的。

确实有意义的时间是当您枚举从自定义构造函数创建的对象时,该构造函数的 .prototype 扩展了可枚举属性。在这种情况下,它是一个合适的守卫。

在普通对象上使用它是大材小用,而更合理的方法是对您的环境不改变 Object.prototype 的简单要求。

关于javascript - for (var i in yourObjects) { ... } 和 .hasOwnProperty() ... 讨论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594277/

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