Object.is()
Object.is()
接受两个参数,如果这两个参数类型相同且具有相同的值,则返回 true
Object.is()
方法用来比较两个值是否严格相等,运行结果与 ===
基本一致
区别
===
+0 === -0 // true
NaN === NaN // false
Object.is()
Object.is(+0, -0) // false
Object.js(NaN, NaN) // true
Object.assign()
Object.assign()
方法用于对象的合并,将源对象 (source) 的所有可枚举属性,复制到目标对象 (target)
const target = {a: 'a'};
const source1 = {b : 'b'};
const source2 = {c : 'c'};
Object.assign(target, source1, source2);
target // {a:"a", b:"b", c:"c"}
同名属性
Object.assign()
参数对象中有同名属性时,后面的属性会覆盖前面的属性
const target = {a: 'a', b: 'a'};
const source1 = {b : 'b', c : 'b'};
const source2 = {c : 'c'};
Object.assign(target, source1, source2);
target // {a:"a", b:"b", c:"c"}
只有一个参数
参数是对象
只有一个参数且参数是对象时,Object.assign()
会直接返回该参数
const obj = {a: 'a'};
Object.assign(obj) === obj // true
参数不是对象
只有一个参数且参数不是对象,Object.assign()
会先将参数转成对象,然后返回
-
Array
数组转为对象,其属性名为0、1、2
Object.assign([1,2,3]) // [1,2,3]
// typeof 为 "Object"
-
Number
,String
,Boolean
数值、字符串、布尔值转成对应的包装对象
Object.assign('a') // "a"
Object.assign(1) // 1
Object.assign(true) // true
// typeof 均为 "Object"
-
undefined
,null
undefined
和null
无法转换成对象,所以会报错
Object.assign(undefined)
Object.assign(null)
// Uncaught TypeError: Cannot convert undefined or null to object
多个参数,非对象参数不在首位
-
Number
,Boolean
,undefined
,null
数值、布尔值、undefined
、null
不在首参数时,不会报错,也不会产生效果
let obj = {a: 'a'};
Object.assign(obj, 1) === obj // true
Object.assign(obj, true) === obj // true
Object.assign(obj, undefined) === obj // true
Object.assign(obj, null) === obj // true
-
String
字符串的包装对象会产生可枚举属性,以字符数组的形式合入目标对象
let obj = {a: 'a'};
const str = 'str';
Object.assign(obj, str);
obj // {0: "s", 1: "t", 2: "r", a: "a"}
-
Array
将数组视为属性名为0、1、2的对象
let obj = {a: 'a'}
const arr = [1,2,3];
Object.assign(obj, arr);
obj // {0: 1, 1: 2, 2: 3, a: "a"}
首参也为数组时
Object.assign([1, 2, 3], [4, 5])
// [4,5,3]
浅拷贝
Object.assign()
实行的是浅拷贝
源对象的某个属性值是对象,目标对象拷贝这个对象的引用
const obj1 = {a: 1, b: [0,1,2]};
const obj2 = Object.assign({}, obj1);
obj1.a = 3;
console.log(obj2); // { a: 1, b: [ 0, 1, 2 ] }
obj1.b[0] = 5;
console.log(obj2); // { a: 1, b: [ 5, 1, 2 ] }
深拷贝 JSON.parse(JSON.stringify(obj))
const obj1 = {a: {b: 1}};
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
const obj2 = deepCopy(obj1);
obj1.a.b = 2;
obj2.a.b // 1