美文网首页
es6 Object.assign/...扩展符/contact

es6 Object.assign/...扩展符/contact

作者: 无名程序猿 | 来源:发表于2019-07-30 10:51 被阅读0次

1、对象合并

  • Object.assign({}, obj1, obj)
    const obj = { a: 1, b: 2, c: 3, d: { e: 5 } };
    const obj1 = { d: '' };
    const obj2 = Object.assign({}, obj1, obj); //{ ...obj };
    obj2.a = 4;
    console.log(obj2); //{d: {…}, a: 4, b: 2, c: 3}
 // 注意:Object.assign({}, obj1, obj) 参数顺序不同结果不同
    const obj = { a: 1, b: 2, c: 3, d: { e: 5 } };
    const obj1 = { d: '' };
    const obj2 = Object.assign({}, obj, obj1); //{ ...obj };
    obj2.a = 4;
    console.log(obj2); //{a: 4, b: 2, c: 3, d: ""}

如果两个对象中有重复数据,合并结果以第三个参数为主;
应用场景分析:在筛选条件对象合并,就会导致已选和默认数据合并出现丢失的情况。这种情况下就得单独赋值,来解决这一问题。

  • “...”扩展运算符
    const obj = { a: 1, b: 2, c: 3, d: { e: 5 } };
    const obj1 = { ...obj, d: '' };
    console.log(obj1); // {a: 1, b: 2, c: 3, d: ""}
// 位置不同:
    const obj = { a: 1, b: 2, c: 3, d: { e: 5 } };
    const obj1 = { d: '', ...obj };
    console.log(obj1); // {d: {…}, a: 1, b: 2, c: 3}

2、浅拷贝

  • “=” 赋值
    实现浅拷贝方法 “=”,等号赋值就是浅拷贝。
// 实例:
    // 基本数据类型
    let a = 1;
    const b = a;
    a = 3;
    console.log(b);//1
    // 引用数据类型
    let a = [1, 2, 3, 4];
    const b = a;
    a[0] = 0;
    console.log(b); //[0, 2, 3, 4]

注意:“=”
基本数据类型,实现复制不受原数据改变的影响。
引用数据类型,受原数据改变的影响。(原因:引用数据存放堆内存,赋值后只是存储的指针赋值给变量)
拓展:
基本数据类型: Null、Undefined、Boolean、Number、String
引用数据类型:Object 例如: Object 、Function、Array

  • Object.assign({}, obj)
 // 对象为普通类型数据  深拷贝
    const obj = { a: 1, b: 2, c: 3 };
    const obj1 = Object.assign({}, obj);
    obj1.b = 4;
    console.log(obj); // {a: 1, b: 2, c: 3 }
// 对象含有引用类型数据  浅拷贝
    const obj = { a: 1, b: 2, c: 3, d: { e: 5 } };
    const obj1 = Object.assign({}, obj);
    obj1['d'].e = 4;
    console.log(obj); //{a: 1, b: 2, c: 3, d: {e: 4}}
  • Object.assign([], Arr)
    // 普通类型数据
    const arr = [0, 1, 2, 3, 4];
    const arr1 = Object.assign([], arr);
    arr1[0] = 5;
    console.log(arr); //[0, 1, 2, 3, 4]
  // 二维数组中存在引用
    const arr = [0, 1, 2, 3, 4, [5, 6, 7]];
    const arr1 = Object.assign([], arr);
    arr1[5][3] = 8;
    console.log(arr); //[0, 1, 2, 3, 4, [5, 6, 8]]
    // [{}]
    const arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
    const arr1 = Object.assign([], arr);
    arr1[1].id = 0;
    console.log(arr); //[{ id: 1 }, { id: 0 }, { id: 3 }, { id: 4 }]
  • Array.concat()

// 基本数据类型
 const arr = [1, 2, 3, 4];
    const arr1 = arr.concat();
    arr1[0] = 0;
    console.log(arr); //[1, 2, 3, 4]
// 引用数据类型
    //  修改数组中单独一项的值,深拷贝失效
    const arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
    const arr1 = arr.concat();
    arr1[1].id = 0;
    console.log(arr); //[{ id: 1 }, { id: 0 }, { id: 3 }, { id: 4 }]
   // 只修改数组每一项,不对每一项的引用类型数据修改,深拷贝生效
    const arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
    const arr1 = arr.concat();
    arr1.push({ id: 5 });
    console.log(arr); //[{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }]

3、深拷贝

  • 对象
    for遍历、JSON.parse(JSON.stringify(obj1))、"..." 运算符、Object.assign()
    let obj1={count:1,name:'grace',age:1};
    let obj2 = copyObj(obj){
    let res = {};
    for(let key in obj){
       res[key]=obj[key];
    }
    let obj1={count:1,name:'grace',age:1};
    let obj2 = JSON.parse(JSON.stringify(obj1));
   const arr = { id: 2, name: 2 };
    const arr1 = { ...arr };
    arr1.id = 0;
    console.log(arr); // { id: 2, name: 2 }
    const obj = { a: 1, b: 2, c: 3 };
    const obj1 = Object.assign({}, obj);
    obj1.b = 4;
    console.log(obj); // {a: 1, b: 2, c: 3 }

注意 Object.assign、“...”运算符 对于含有引用类型值的对象无法深拷贝

    const arr = { id: 2, name: 2, arr3: { id: 3, name: 3 } };
    const arr1 = { ...arr };
    arr1['arr3'].id = 0;
    console.log(arr); // { id: 2, name: 2, arr3: { id: 0, name: 3 } }
  • Array
    循环遍历、arr.slice(0) 、 arr.concat()、arr1 = [...arr]
    const arr = [1, 2, 3, 4];
    const arr1 = arr.slice(0);
    arr1[0] = 0;
    console.log(arr); //[1, 2, 3, 4]
    // .concat()
    const arr = [1, 2, 3, 4];
    const arr1 = arr.concat();
    arr1[0] = 0;
    console.log(arr); //[1, 2, 3, 4]
    // ...扩展运算符
    const arr = [1, 2, 3, 4];
    const arr1 = [...arr];
    arr1[0] = 0;
    console.log(arr); //[1, 2, 3, 4]

注意 arr.concat() 、“...”运算符对于含有引用类型值的对象无法深拷贝

相关文章

网友评论

      本文标题:es6 Object.assign/...扩展符/contact

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