2. key in obj 和 obj.hasOwnProperty(key)

2,179 阅读1分钟

有时候我们需要判断一个对象是否存在某个属性。而对象如果不存在该属性的键值则返回undefined,这时我们就需要使用 key in objobj.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测试

Chrome测试

firefox测试

firefox测试

由此可知,key in objobj[key] 在性能上没有明显的差距。

在键值比较多的情况下,firefox的表现好神奇(×,甚至比键值少的还快。。。

同时 key in obj 性能要好过 obj.hasOwnProperty(key).

资料

stackoverflow.com/questions/4…