笔记

65 阅读1分钟

前言

属性访问返回值有可能是属性中存储的 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 操作符来判断是否存在