Object.is() 和 Object.assign()

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
    undefinednull 无法转换成对象,所以会报错
Object.assign(undefined) 
Object.assign(null)
// Uncaught TypeError: Cannot convert undefined or null to object

多个参数,非对象参数不在首位

  • Number, Boolean, undefined, null
    数值、布尔值、undefinednull 不在首参数时,不会报错,也不会产生效果
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

你可能感兴趣的:(Object.is() 和 Object.assign())