有很多博客说hasOwnProperty每当使用for..in循环时都应该使用检查,但我不明白为什么会这样.有和没有检查我们得到相同的结果.
看看这个小提琴.
Den*_*ret 13
如果您使用{}JSON 创建基本对象或从JSON使用它JSON.Parse,hasOwnProperty则全局无用.
但是如果你正在扩展(使用原型)一个"类",那么它可以帮助你知道你是否正在访问你自己的"属性"(直接属性,包括直接函数).
请注意,基本对象至少有一个(非直接)属性,您可能会发现console.log({});或console.log({}.toString)但它不可枚举且在for... in循环中看不到:
for ... in循环不会迭代不可枚举的属性.从内置构造函数(如Array和Object)创建的对象继承了Object.prototype和String.prototype中不可枚举的非可枚举属性,例如String的indexOf方法或Object的toString方法.循环将遍历对象的所有可枚举属性,或者它继承自其构造函数的原型(包括覆盖内置属性的任何属性).
Chr*_*oph 10
如果没有hasOwnProperty您不知道该属性是您的对象的本机属性还是从其原型继承.
var obj1 = {a:"10",b:"20"};
Object.prototype.c = "prototype:30";
var i;
for(i in obj1) {
document.getElementById("div1").innerHTML += obj1[i]+" ";
}
// result 10 20 prototype:30
for(i in obj1) {
if(obj1.hasOwnProperty(i)) {
document.getElementById("div2").innerHTML += obj1[i] +" ";
}
}
// result 10 20
?
Run Code Online (Sandbox Code Playgroud)
在这种情况下从它的Prototype obj1继承属性,你会错误地在第一个循环中列出它.cObject
| 归档时间: |
|
| 查看次数: |
2555 次 |
| 最近记录: |