hasOwnProperty() method in JavaScript
由于最近工作中写 JavaScript 的时间比较多,以前觉得这个语言挺恶心的。写多了发现它的一些 best practice 后慢慢觉得如果我们在写代码中尽量使用这个语言的 good part
而摒弃一些 bad part
的话,JavaScript 的代码也能变得漂亮优美起来。所以先从读一些优秀的 JavaScript 开源代码做起,最近在读代码中经常见到对一个 Object 像下面那样循环
var man = {
hands: 2,
legs: 2,
heads: 1
}
for (var key in man) {
if (man.hasOwnProperty(key)) {
// do something about man[key]...
}
}
一直对为什么要使用 hasOwnProperty
方法来判断 key 是否存在感到疑惑。后来再查询了一些资料之后,才知道这个还是和 JavaScript 的 prototype
有关系。假如我们在代码中的某个地方加入了这样一段 Object.prototype.clone = function () { ... };
。
这时我们在上述代码中打印一下相应的 property 会发现是如下的情况:
// with hasOwnProperty
for (var i in man) {
if (man.hasOwnProperty(i)) {
console.log(i, ":", man[i]);
}
}
/*
result in the console
hands:2
legs:2
heads:1
*/
// without hasOwnProperty
for (var i in man) {
console.log(i, ":", man[i]);
}
/*
result in the console
hands:2
legs:2
heads:1
clone:function()
*/
看到了区别了吧,这也就是 hasOwnProperty
的使用场景。所以它并不一定总是必须的,但是如果当你对对象的原型链并不清楚的时候,使用 hasOwnProperty
check 一下是很有必要的,这样可以避免很多预料外的 bug。