hasOwnProperty是否仍应与for..in语句一起使用

Gau*_*han 10 javascript

有很多博客说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方法.循环将遍历对象的所有可枚举属性,或者它继承自其构造函数的原型(包括覆盖内置属性的任何属性).

  • 当您无法完全控制页面中的代码时,`hasOwnProperty`并非无用且必要.假设有人在Cristoph的答案中修改了`Object.prototype` ..即使有一个简单的对象,你也会得到不可预知的结果而没有`hasOwnProperty`. (2认同)
  • 我想说的是,您无法完全控制的混乱代码与*使用 {} 创建基本对象或从 JSON 获取它*是不同的类别 (2认同)

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