ECMAScript6-对象新增方法

33 阅读2分钟

Object.is()

判断两个值是否为同一个值。=== 运算符(也包括 == 运算符)将数字 -0+0 视为相等,而将 Number.NaNNaN 视为不相等。

Object.is(NaN, NaN) // true
Object.is(undefined, undefined) // true
Object.is(true, true) // true
Object.is({},{}) // false

// 与 === 的差异
-0 === +0 // true
Object.is(-0, +0) // false

NaN === NaN // false
Object.is(NaN, NaN) // true

Number.NaN === NaN // false
Object.is(Number.NaN, NaN) // true

Object.assign()

基本用法

将所有可枚举属性的值从一个或多个源对象复制到目标对象,返回目标对象。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

const target = { a:1, b:2 }
const origin = { b:4, c:5 }
const returnedTarget = Object.assign(target, origin)
target // { a:1, b:4, c:5 }

Object.assign() 拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举属性 enumerable:false

Object.assign({b:'c'},Object.defineProperty({}, 'invisible',{
     enumerable:false,
     value:'hello'
  })
)
// { b:'c'}

如果赋值期间出错,则操作会中止并退出,同时抛出错误。Object.assign() 没有“回滚”之前赋值的概念,它是一个尽力而为、可能只会完成部分复制的方法。

浅拷贝

let obj1 = {
  person1:{name:'aaa'}
}
let obj2 = {name:'bbb'}
let obj = {};
Object.assign(obj, obj1, obj2)

obj.name = 'lxx'
obj.person1.name = 'xxx'

obj // obj中包含obj1和obj2的内容
obj1 // name属性被修改了
obj2 // name属性没有被修改

常见用途

合并多个对象

// ... 剩余参数
const merge = (target, ...sources) => Object.assign(target, ...sources)

为属性指定默认值

const DEFAULTS = {
  logLevel:0,
  outputFormat:'html'
}
function processContent(options) {
  options = Object.assign({}, DEFAULTS, options)
  console.log(options)
}

上面代码中 DEFAULTS 对象是默认值,options 对象是用户提供的参数。Object.assign() 方法将 DEFAULTSoptions 合并成一个新对象,如果两者有同名属性,则 options 的属性值会覆盖 DEFAULTS 的属性值。

由于存在浅拷贝的问题,DEFAULTS 对象和 options 对象的所有属性的值最好都是简单类型,不要指向另一个对象。否则,DEFAULTS 对象的该属性很可能不起作用。