js對象引用和賦值


體驗更優排版請移步原文http://blog.kwin.wang/programming/js-object-reference-assign.html

 

先看一個簡單例子,

var obj = {
  a : 1
}
var obj1 = obj;

function test(b){
  b.a = 2
}
test(obj1);
console.log(obj.a);//2

由於js中對象屬於引用類型,var obj1 = obj 這一步相當於把obj的地址賦值給了obj1,他們兩個指向的都是原對象的地址,所以通過其中的一個去修改值時其實是修改他們指向的那個對象。例子中通過調用test方法改變了原對象的值,因此這里應該輸出2。

 

對於js的值類型和引用類型的區分,這里有個通俗的比喻,我們可以用“連鎖店”和“總店鑰匙”這兩個概念來幫助理解。

1.值類型賦值理解:相當於在一個新的地方按照連鎖總店的統一標准(統一店面理解為相同的變量內容)新開一個分店,這樣新開的店與總店互不影響、各自運營;

  var a='China'; 
  var b=a; 
  a='USA'; 
  console.log(b);  //China

2.引用類型賦值理解:相當於把連鎖總店的鑰匙(變量引用地址)復制一把給了另外一個老板,此時兩個老板同時管理總店,兩個老板的行為都有可能對總店的運營造成影響。

 

這里詳細說后者,

1.如果真要復制對象互不影響,則要通過轉換賦值或者遍歷key:value來復制你的方法和屬性。需要注意的是對象的子對象也是引用,所以遍歷賦值的時候要判斷,子元素是否是對象,如果子元素是對象,則要繼續對子元素進行遍歷賦值。

例:轉換賦值

  var data = {a:1,b:2,c:3,d:[0,1,2,3]};
  var str = JSON.stringify(data);
  var data1 = JSON.parse(str);
  data1["e"] = 4;
  data1["d"][0] = 11;
  console.log(data);//Object {a: 1, b: 2, c: 3, d: [0,1,2,3]}
  console.log(data1);//Object {a: 1, b: 2, c: 3, d: [11,1,2,3], e: 4}

2.當對象引用做為函數參數傳遞時,依然會相互影響,如下示例:

  var data = {a:1,b:2,c:3,d:{q:4,w:5,e:6}};
  var data1 = data;
  function con(data2){
    data2["r"] = 5;
    console.log(JSON.stringify(data2));
  }
  con(data1);//{"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}
  console.log(JSON.stringify(data));//{"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}

3.但是,對象引用賦值后,如果將對象置空,相互間是不受影響的,如下:

  var arr = {"a":"1","b":"2"};
  var arr1 = arr;
  arr = {};
  arr["a"] = 2;
  console.log(arr1);//Object {a: "1", b: "2"}
  console.log(arr);//Object {a: 2}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM