我订阅了常见的成语:
for(var key in obj){
if(obj.hasOwnPropery(key)){
// do stuff
}
}
但如果我这样做:
var obj = {a: 'a', b: 'b'};
循环时是否需要担心obj
具有“a”和“b”以外的属性?
或者上面的习语主要是针对您开发人员没有创建的对象?
我订阅了常见的成语:
for(var key in obj){
if(obj.hasOwnPropery(key)){
// do stuff
}
}
但如果我这样做:
var obj = {a: 'a', b: 'b'};
循环时是否需要担心obj
具有“a”和“b”以外的属性?
或者上面的习语主要是针对您开发人员没有创建的对象?
从技术上讲是的,Object.prototype
可以修改(出于好的或坏的原因)。这些显示为可枚举属性(将在枚举时显示)。
当Object.prototype
被修改时,它会影响对象的所有实例,所以你obj
的包含在其中。例如,如果其他一些脚本/库执行此:
Object.prototype.keyLength = function () {
var count = 0;
for (var key in this) {
if (this.hasOwnProperty(key)) count++;
}
return count;
};
那么这将是迭代你的结果obj
(不使用hasOwnProperty
):
a
b
keyLength
(不一定按这个顺序)
如果您使用hasOwnProperty
,您只会看到“a”和“b”。
修改Object
原型并不理想(出于多种原因),但“更安全”的方式是使用Object.defineProperty
- https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty . 您可以将其描述为可枚举或不可枚举。这是一种较新的方法,因此它在浏览器中并不全局可用。当然,您不能强制其他库使用它,因为您无法控制它们。但如果可以的话,建议您自己使用。
您的用途hasOwnProperty
是确保您正在查看的密钥是实际属性而不是原型链上的属性并且不可枚举。这确实解决了prototype
“问题”。仅供参考 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty