关于赋值、浅拷贝、深拷贝

75 阅读1分钟

面试的时候,自己每次对于浅拷贝和深拷贝都是一知半解,所以特地写一篇文章来记录一下 赋值相对于值类型数据,拷贝相当于引用数据类型

一、赋值

赋值就是直接把b赋值给a,let a = b。如果b是值类型;则一切正常,如果是引用类型,则改变b中的值,a中的值也会相应改变。

二、浅拷贝

浅拷贝则是第一级的数据不会受b影响,但是第二级之后的数据会受到影响,常见方法有解构赋值。

  let b = { a1: 1, a2: 2, a3: { b1: 3, b2: 4 } }
  let a = { ...b }
  b.a1 = 'a1'
  b.a3.b1 = 'b1'
  console.log(a)
  { a1: 1, a2: 2, a3: { b1: 'b1', b2: 4 } } 
  console.log(b)
  { a1: 'a1', a2: 2, a3: { b1: 'b1', b2: 4 } }

三、深拷贝

由此可知,浅拷贝是无法全面应用的,所以需要深拷贝,深拷贝则是将每一项的值重新引用。

  • JSON.parse(JSON.stringify(obj))
  • 递归
function cloneDeepDi(obj){
    const newObj = {};
    let keys = Object.keys(obj);
    let key = null;
    let data = null;
    for(let i = 0; i<keys.length;i++){
    key = keys[i];
    data = obj[key];
    if(data && typeof data === 'object'){
        newObj[key] = cloneDeepDi(data)
    }else{
        newObj[key] = data; }
    }
    return newObj
}