前提,Object的属性划分

// 原型属性
let myObj = Object.create({}, {
  getFoo: {
    value: function () {
      return this.foo;
    }
  }
});
// 对象自身可枚举属性
myObj.enumType = 'Enumerable properties of the object itself';
Object.defineProperty(myObj, 'enumType1', {
  enumerable: true,
  value: 'enumType1'
});
// 对象自身不可枚举属性
Object.defineProperty(myObj, 'type', {
  enumerable: false,
  value: 'cannot be enumerated'
});
// symbol属性
myObj[Symbol('symbol')] = 'symbol type';

const object = {
  a: 'a',
  c: 'c',
  b: 'b',
  3: 3,
  1: 1,
  2: 2,
  '-1': 'string1',
  '0': 0
};

class Person {
  constructor(name, age) {
    // 可枚举属性
    this.name = name;
    this.age = age;
    this[Symbol('symbol')] = 'symbol type';
  }
  run() {
    console.log(this.name + ': run')
  }
}
// 原型链属性
Person.prototype.say = () => {
  console.log(this.name + 'say')
}
const person1 = new Person('zs', 30);

控制台打印myobj
控制台打印object

  1. ES5.1新增:Object.keys();
  • 方法会返回:一个由一个给定对象的自身可枚举属性组成的数组,Symbol属性过滤不会进行输出
  • 属性顺序:数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致;(0以上整数按顺序排列,其他字符串按给定属性顺序排列)
console.log(Object.keys(myObj)); //  ['enumType', 'enumType1']
console.log(Object.keys(object)); // ['0', '1', '2', '3', 'a', 'c', 'b', '-1']
console.log(Object.keys(person1)) // ['name', 'age']
  1. ES5.1新增:Object.getOwnPropertyNames()
  • 方法会返回:一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
  • 属性顺序:数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致;(0以上整数按顺序排列,其他字符串按给定属性顺序排列)
console.log(Object.getOwnPropertyNames(myObj)); //  ['getFoo', 'enumType', 'enumType1', 'type']
console.log(Object.getOwnPropertyNames(object)); // ['0', '1', '2', '3', 'a', 'c', 'b', '-1']
console.log(Object.getOwnPropertyNames(person1)) // ['name', 'age']
  1. ES6新增:Object.getOwnPropertySymbols()
  • 返回值:一个给定对象自身的所有 Symbol 属性的数组
console.log(Object.getOwnPropertySymbols(myObj)); //  [Symbol(symbol)]
console.log(Object.getOwnPropertySymbols(object)); // []
console.log(Object.getOwnPropertySymbols(person1)) // [Symbol(symbol)]
  1. ES6新增:Reflect.ownKeys
  • 返回值:一个由目标对象自身的属性键组成的数组,包含可枚举,不可枚举,Symbol属性
console.log(Reflect.ownKeys(myObj)); //  ['getFoo', 'enumType', 'enumType1', 'type', Symbol(symbol)]
console.log(Reflect.ownKeys(object)); // ['0', '1', '2', '3', 'a', 'c', 'b', '-1']
console.log(Reflect.ownKeys(person1)) // ['name', 'age', Symbol(symbol)]
  1. ES1st新增:for…in
  • 以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。
for (const key in myObj) {
  console.log(key + ':' + myObj[key])
}
for (const key in person1) {
  console.log(key)
}

forIn遍历
forIn遍历2

// 去掉原型链上的属性
for (const key in person1) {
  // Object.prototype.hasOwnProperty.call(person1, 'bar');
  if (person1.hasOwnProperty(key)) {
    console.log(key)
  }
}

总结:

方法基本属性原型链不可枚举Symbol
Object.keys()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()
for…in
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐