前言
属性访问返回值有可能是属性中存储的 undefined,也可能是因为属性不存在所以返回 undefined。
var obj = {
a: undefined,
}
console.log(obj.a); // undefined
console.log(obj.b); // undefined
区分方法
1. 通过运算符 in 判断。
console.log("a" in obj); // true
console.log("b" in obj); // false
指定的属性在指定的对象或其原型链中,则
in运算符返回true。
2. 使用 hasOwnProperty 方法判断属性是否存在。
obj.hasOwnProperty('a'); // true
obj.hasOwnProperty('b'); // false
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
两者的区别:
in操作符会检查属性是否在对象及其[[Prototype]]原型链中。hasOwnProperty(..)只会检查属性是否在obj对象中,不会检查[[Prototype]]链。
注意
in语法
prop in object
in右操作数必须是一个对象值。- 一个属性是从原型链上继承来的,
in运算符也会返回true。 in右操作数为数组的时候,prop为数组的索引。- 当用
Object.defineProperty将属性的枚举属性enumerable设为false时,在for..in循环中不会出现,但是我们任然可以通过in操作符来判断是否存在