Object.is()
判断两个值是否为同一个值。===
运算符(也包括 ==
运算符)将数字 -0
和 +0
视为相等,而将 Number.NaN
与 NaN
视为不相等。
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()
方法将 DEFAULTS
和 options
合并成一个新对象,如果两者有同名属性,则 options
的属性值会覆盖 DEFAULTS
的属性值。
由于存在浅拷贝的问题,
DEFAULTS
对象和options
对象的所有属性的值最好都是简单类型,不要指向另一个对象。否则,DEFAULTS
对象的该属性很可能不起作用。