hasOwnProperty验证

for..in…时,注意 hasOwnProperty 验证

1
2
3
4
5
6
7
8
9
10
11
12
var obj = { a: 10, b: 20 };

// 注意词句代码
Object.prototype.c = 30;
var item;
for (item in obj) {
console.log(item);
console.log(obj[item]);
}

// 输出: a b c
// 输出:10 20 30

以下代码中,注意中间标注释的句子。这句代码加与不加,会对下面的 for..in..循环产生影响。加上了就输出“c”,不加就不输出“c”。道理很简单,for..in..循环不光能遍历 obj 对象本身就有的属性,还能遍历 obj 原型中的属性。
要想屏蔽掉原型中的属性,就用 hasOwnProperty 函数,如下:

1
2
3
4
5
6
for (item in obj) {
if (obj.hasOwnProperty(item)) {
//if (Object.prototype.hasOwnProperty.call(obj, item)) {
console.log(item);
}
}

这两句 if 判断语句,都可以用,效果是一样的。第一个代码可读性好,第二个效率相对较高。建议,没有特殊情况,用第一个即可。