js中的深拷貝和淺拷貝

一、基本數(shù)據(jù)類型

  1. 占用內(nèi)存大小固定,存在棧內(nèi)存中,在被復(fù)制時,復(fù)制的是值,修改被復(fù)制的變量,原變量并不會受到影響。
var a= 1;
var b= a;
b = 3;
console.log(a, b);   //1    3

二、引用數(shù)據(jù)類型

1. 引用數(shù)據(jù)類型的值是對象,存在堆內(nèi)存上,引用類型的變量實際上存的是指針,指向堆上的對象,在復(fù)制時,復(fù)制的是指針,修改其中一個變量,另一個也會被改變。

var A= {a:1};
var B= A;
B.a = 3;
console.log(A.a, B.a);  //3   3

以上就是淺拷貝

2. 怎樣深拷貝,使拷貝后變量間不影響

a. 數(shù)組用slice、concat解決,返回新數(shù)組

var arr = [0,1,2];
var copyArr = arr.concat();
copyArr[0] = 100;
console.log(copyArr[0], arr[0]);    //100  0

b. 對象,

按照實現(xiàn)原理,遍歷源對象的每個屬性,拷貝給新對象的屬性*

var obj = {name:'a', age: 20};
var newObj = new Object();
newObj.name = obj.name;  
newObj. age = obj. age;  
newObj.name = 'c';
console.log(obj, newObj );      //{name: "a", age: 20} {name: "c", age: 20}

實現(xiàn)方法:

function deepCopy(source){
  var result = {};
  for(let key in source){
      if(typeof source[key] === object){
          deepCopy(source[key])
    }else{ result[key] =source[key] }
  }
}

js提供的方法:Object.assign() 方法用于將所有可枚舉屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(returnedTarget, target, source);  //{a: 1, b: 4, c: 5} {a: 1, b: 4, c: 5} {b: 4, c: 5}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容