【发布时间】:2017-05-23 04:42:58
【问题描述】:
什么时候不需要hasOwnProperty?
JavaScript: The Good Parts 一书包含以下内容,其中说“它通常是必要的”:
另一种形式(称为
for in)枚举对象的属性名称(或键)。 在每次迭代中,来自 object 的另一个属性名称字符串被分配给 变量。通常需要测试object.
hasOwnProperty(variable)来判断是否 属性名称确实是对象的成员,或者是在原型上找到的 链。for (myvar in obj) { if (obj.hasOwnProperty(myvar)) { ... } }
更具体地说,我想枚举一个简单的类字典对象的属性,该对象是使用 Javsacript 对象文字语法创建的,例如:
var foo = { 'bar': 'baz' };
或使用JSON.parse创建的类似对象:
var foo = JSON.parse("{ 'bar': 'baz' }");
当我对foo 对象执行for in 时,我应该使用hasOwnProperty 吗?
假设这个 javascript 作为复杂网页的一部分在随机浏览器中运行。
答案是,“实际上可能/通常没有必要。理论上,如果某些框架或库通过更改 Object.prototype 添加属性,则可能是必要的,但像这样更改 Object.prototype 将是一个侵入性的坏事任何受人尊敬的框架都不太可能做的实践”?
【问题讨论】:
-
您可以使用
Object.keys(obj).forEach(key => ...),因为它只会获得自己的属性。 -
如果您认为需要支持 IE8 或更早版本,我也会推荐
Object.keys- 使用适当的 polyfill -
我相信某些网页确实更改了
Object.prototype,或类似的重要内容。我曾经发现当我的 JavaScript 在 SalesForce 中运行时,for.. in迭代的不仅仅是我的数据结构的预期项目(虽然不记得这是一个数组还是对象)。 -
@Birchlabs 是的,但是在 ES5+ 中,该代码应该使用
Object.defineProperty来使这些添加不可枚举,以便它们不 i> 在你做for ... in时出现 -
@ChrisW 上面写着“不要扩展
Object.prototype”。那是正确的,但现在(正确完成)它是完全安全的。