对象的扩展和新增方法
对象的扩展和新增方法
  对象的简洁语法
    属性有了简洁语法
      function f(x, y) {
return {x, y};
}
    方法也有了简洁语法
      const o = {
method() {
return "Hello!";
}
};
  属性名可用表达式
    obj['a' + 'bc'] = 123;
    let propKey = 'foo';
let obj = {
[propKey]: true,
['a' + 'bc']: 123
};
  方法的 name 属性
    函数的name属性，返回函数名
    对象方法也是函数，因此也有name属性
      const person = {
sayName() {
console.log('hello!');
},
};
person.sayName.name // "sayName"
    如果对象的方法使用了取值函数（getter）和存值函数（setter），则name属性不是在该方法上面，而是该方法的属性的描述对象的get和set属性上面，返回值是方法名前加上get和set
      const obj = {
get foo() {},
set foo(x) {}
};
obj.foo.name
// TypeError: Cannot read property 'name' of undefined
const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');
descriptor.get.name // "get foo"
descriptor.set.name // "set foo"
    特殊情况
      bind方法创造的函数，name属性返回bound加上原函数的名字
      Function构造函数创造的函数，name属性返回anonymous。
      如果对象的方法是一个 Symbol 值，那么name属性返回的是这个 Symbol 值的描述
  属性可枚举性
    对象的每个属性都有一个描述对象（Descriptor），用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象
    描述对象的enumerable属性，称为“可枚举性”
    如果该属性为false，就表示某些操作会忽略当前属性
    目前，有四个操作会忽略enumerable为false的属性
      for...in循环：只遍历对象自身的和继承的可枚举的属性。
      Object.keys()：返回对象自身的所有可枚举的属性的键名。
      JSON.stringify()：只串行化对象自身的可枚举的属性。
      Object.assign()： 忽略enumerable为false的属性，只拷贝对象自身的可枚举的属性。
    ES6 规定，所有 Class 的原型的方法都是不可枚举的
    所以，尽量不要用for...in循环，而用Object.keys()代替
  属性的遍历（5种方法）
    for...in
      for...in循环遍历对象自身的和继承的可枚举属性（不含 Symbol 属性）
    Object.keys(obj)
      Object.keys返回一个数组，包括对象自身的（不含继承的）所有可枚举属性（不含 Symbol 属性）的键名。
    Object.getOwnPropertyNames(obj)
      返回一个数组，包含对象自身的所有属性（不含 Symbol 属性，但是包括不可枚举属性）的键名
    Object.getOwnPropertySymbols(obj)
      Object.getOwnPropertySymbols返回一个数组，包含对象自身的所有 Symbol 属性的键名
    Reflect.ownKeys(obj)
      返回一个数组，包含对象自身的（不含继承的）所有键名，不管键名是 Symbol 或字符串，也不管是否可枚举
    5种方法都遵循几个规则
      首先遍历所有数值键，按照数值升序排列。
      其次遍历所有字符串键，按照加入时间升序排列。
      最后遍历所有 Symbol 键，按照加入时间升序排列。
  super 关键字
    ES6 新增了super关键字，指向当前对象的原型
    注意，super关键字表示原型对象时，只能用在对象的方法之中，用在其他地方都会报错
      const obj = {
foo: 'world',
find() {
return super.foo;
}
};
  链判断运算符
    ES2020 引入了“链判断运算符”（optional chaining operator）?.
  Null 判断运算符
    ES2020 引入了一个新的 Null 判断运算符??
    只有运算符左侧的值为null或undefined时，才会返回右侧的值
  对象的新增方法
    Object.is()
      用于判断两个值是否相等
      该方法用于优化===的两个问题：NaN不等于NaN、+0等于-o
    Object.assign()
      assign用于把多个对象合并到到一个对象上，第一个参数是要把其他对象合并到的对象target，剩下其他参数是要被合并的对象，返回target
    Object.getOwnPropertyDescriptors()
      返回某个对象属性的描述对象
    __proto__属性，Object.setPrototypeOf()，Object.getPrototypeOf()
      设置和获取对象的原型对象
    Object.keys()，Object.values()，Object.entries()
      Object.keys方法，返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历（enumerable）属性的键名
      Object.values方法返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历（enumerable）属性的键值
      Object.entries()方法返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历（enumerable）属性的键值对数组
    Object.fromEntries()
      用于将一个键值对数组转为对象