有时候我们需要判断一个对象是否存在某个属性。而对象如果不存在该属性的键值则返回undefined,这时我们就需要使用 key in obj 或obj.hasOwnProperty(key)来判断。那么二者有什么不同呢,在性能方面又表现得怎么样?
寻找范围不同
key in obj 会沿着对象的原型链寻找所有的键值。
obj.hasOwnProperty(key) 则只会寻找对象自身的属性(不包括原型链)。
const base = {
protoKey: undefined
};
const obj = Object.create(base);
obj.test = undefined;
/*
obj : {
test: undefined,
<prototype>: {
protoKey: undefined,
}
} */
"test" in obj; // true
"protoKey" in obj; //true
obj.hasOwnProperty("test"); // true
obj.hasOwnProperty("protoKey"); // false
性能
前三个是增加了 1个键值的普通对象。
后三个是增加了1000个键值的普通对象。
Chrome测试
firefox测试
由此可知,key in obj 和 obj[key] 在性能上没有明显的差距。
在键值比较多的情况下,firefox的表现好神奇(×,甚至比键值少的还快。。。
同时 key in obj 性能要好过 obj.hasOwnProperty(key).