对象的新增方法

143 阅读1分钟
  • Object.is() 用来比较两个值是否严格相等
Object.is('foo', 'foo') // true
Object.is({}, {}) // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
+0 === -0 //true
NaN === NaN // false
ES5 可以通过下面的代码,部署Object.is。
Object.defineProperty(Object, 'is', {
  value: function(x, y) {
    if (x === y) {
      // 针对+0 不等于 -0的情况
      return x !== 0 || 1 / x === 1 / y;
    }
    // 针对NaN的情况
    return x !== x && y !== y;
  },
  configurable: true,
  enumerable: false,
  writable: true
});
  • Object.assign()
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
Object.assign(target, source1, source2);
将source1、source2复制到target上,同名属性,会被后面的覆盖。
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)
注意点
(1)浅拷贝
(2)同名属性的替换
(3)数组的处理
Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3]
Object.assign把数组视为属性名为 0、1、2 的对象
(4)取值函数的处理
Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。
常见用途
(1)为对象添加属性
将x属性和y属性添加到Point类的对象实例
class Point {
  constructor(x, y) {
    Object.assign(this, {x, y});
  }
}
(2)为对象添加方法
Object.assign(SomeClass.prototype, {
  someMethod(arg1, arg2) {
    ···
  },
  anotherMethod() {
    ···
  }
});
(3)克隆对象
(4)合并多个对象
(5)为属性指定默认值
  • Object.getOwnPropertyDescriptors()
返回指定对象所有自身属性(非继承属性)的描述对象
  • Object.keys(),Object.values(),Object.entries()
Object.entries()键值对数组
将对象转为真正的Map结构
const obj = { foo: 'bar', baz: 42 };
const map = new Map(Object.entries(obj));
map // Map { foo: "bar", baz: 42 }
  • Object.fromEntries()
将一个键值对数组转为对象
Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
])
// { foo: "bar", baz: 42 }