美文网首页
Object.is() 和 Object.assign()

Object.is() 和 Object.assign()

作者: RQrry | 来源:发表于2019-07-17 14:54 被阅读0次

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

相关文章

  • ES6中对象新增的方法

    一、概览 Object.is() Object.assign() Object.getOwnPropertyDes...

  • Object.is() 和 Object.assign()

    Object.is() Object.is()接受两个参数,如果这两个参数类型相同且具有相同的值,则返回 true...

  • 2019-03-04

    对象的新增方法 1、Object.is( ) 2、Object.assign( ) 常见用途 Object.ass...

  • 对象的扩展

    属性的简结表示法 属性名表达式 Object.is() Object.assign() Object.keys()...

  • ES6对象的新增方法

    Object.is()Object.assign() 1.Object.is() ES5 比较两个值是否相等,只有...

  • JS对象常用办法

    Object.assign()用于克隆 Object.is()用于判断两个值是否相同 Object.keys()用...

  • 对象的扩展

    属性的简洁表示法 属性名表达式 方法的 name 属性 Object.is() Object.assign() 属...

  • 对象

    1、属性的简洁表示法(浅拷贝);2、属性名表达式;3、Object.is();4、Object.assign();...

  • 对象扩展

    Object.is(v1, v2) 判断2个数据是否完全相等 Object.assign(target, sour...

  • ES6语法 | Object

    1. Object.is() 比较两个值是否相等 2. Object.assign() 合并对象 3. Objec...

网友评论

      本文标题:Object.is() 和 Object.assign()

      本文链接:https://www.haomeiwen.com/subject/vdkqlctx.html