(今日应做的事没有做,明天再早也是耽误了。——裴斯泰洛齐)
in
早期的in用来判断属性是否在指定的对象或原型链上。比如以下代码
const json = {
name: '张三'
};
console.log('name' in json); // true 显式属性
console.log('toString' in json); // true 每一个对象的原型上都有toString方法
Object.prototype.state = () => { };
console.log('state' in json); // true 对自定义的扩展方法,也可以进行检测
可以看出,in方法不仅能对属性进行检测,还能对原型上的方法进行检测。检查方法是优势也是劣势,因为在实际编码中,有些属性和方法的名称可能相同,这就导致对同名的属性进行判断时,会出现意想不到的结果
hasOwnProperty
相比较in,hasOwnProperty更为严格,只检测对象的属性,比如以下代码
const json = {
name: '张三'
};
console.log(json.hasOwnProperty('name')); // true 显式属性
console.log(json.hasOwnProperty('toString')); // false
Object.prototype.state = () => { };
console.log(json.hasOwnProperty('state')); // false
对于原型的方法和自定义方法都返回false
所以in和hasOwnProperty还是要分场景使用,in用来检测方法,hasOwnProperty用来检测属性