数据属性和访问器属性

数据属性

  • value: 就是属性的值
  • writable: 决定属性能否被赋值
  • enumerable: 决定for in能否枚举到该属性
  • configurable: 决定该属性能否被删除或者改变特征值

访问器属性

  • getter: 函数或者是undefined, 在取属性值时被调用
  • setter: 函数或者undefined, 在设置属性值时被调用
  • enumerable: 决定for in能否枚举该属性
  • configurable: 决定该属性能否被删除或者改变特征值
var obj = {};
obj.a = 12;

Object.getOwnPropertyDescriptor(obj, 'a'); // 查看属性

Object.defineProperty(obj, 'a', {writable: false}); // 修改属性

var o = {get a() {return 1;}};
o.a; // 因为get关键字, o.a每次都会返回1

判断对象的属性是否存在

使用点或者方括号

  • obj.x === undefined
  • obj[x] === undefined

使用这个方法, 如果对象自身和其原型链上都不存在该属性的话, 会返回undefined, 注意如果对象的原型链上有该属性, 则会返回该属性. 这个方法的局限性在于不能用在对象的属性存在并且属性值为undefined

使用in关键字

'x' in obj

如果指定的属性存在指定的对象或其原型链中, 则返回true

使用hasOwnProperty(), getOwnPropertySymbols()

obj.hasOwnProperty('x')

只有对象自身存在该属性时, 才会返回true

Object.keys()

let obj = {
  a: 12,
  b: 22,
  c: 456
};

Object.keys(obj).indexOf('d') === -1