javascript對象引用與賦值

javascript對象引用與賦值

<script type="text/javascript">

//例子一: 引用

var myArrayRef = new Array(0,1,2); //創建數組對象

var mySeconArrayRef = myArrayRef; // 對象複製.

myArrayRef[0] = 100; // 修改元素值

alert(mySeconArrayRef[0]);

/**

* 輸出 100; 學過其它語言的都應該知道這裏應該輸出的是0 爲什麼輸出的是100呢?

* 上面程序通過把myArrayRef對象複製給了mySeconArrayRef這時就存在了2個獨立的 但最初值是相同的對象

* 因爲是獨立的爲什麼修改myArrayRef會對別一個對象有影響呢?大家都知道只有當他們引用的是同一個對象時這時修改一個纔會

* 對別一個產生影響.但是在javascript語言中創建的對象myArrayRef值中其時保存的是對象的引用(也就是一個地址).

* 也就是 我用 new Array生成的保存在內存中而new Array把它所在的地方告訴了myArrayRef,myArrayRef又把這地址告訴了mySeconArrayRef

* 他們兩個都指向的是new Array生成對象的地址而不是把對象保存在myArrayRef中,所以通過其中的一個去修改值時其時是修改他們同指象的那對象.

*/

alert(mySeconArrayRef[0] );

//例子二: 賦值

var myVa = 'ABC'; //把ABC的值 賦予了myVa

var myVb = myVa; // myVa 賦值給 myVb

myVa = 'DEF'; //修改myVa

/**

* 輸出的是:ABC. 因爲是把值保存在了變量了 而不是保存的是引用地址,所以他們兩個是相對獨立的整體.

*/

alert(myVb);

</script>

如果真要複製對象互不影響,則要通過轉換賦值或者遍歷key:value來複制你中的方法和屬性。

注意:對象的子對象也是引用,所以遍歷賦值的時候要判斷,子元素是否是對象,如果子元素是對象,則繼續對子元素進行遍歷賦值。
轉換賦值方式:

複製代碼
var data = {a:1,b:2,c:3,d:[0,1,2,3]};
var str = JSON.stringify(data);
var data1 = $.parseJSON(str); //$爲jQuery對象需要引入jQuery包
data1["e"] = 4;
data1["d"][0] = 11;
console.log(data);
console.log(data1);
複製代碼

輸出結果:
{a1b2c3d: [0,1,2,3]}
{a1b2c3d: [11,1,2,3], e: 4}

相互沒有影響

 

當對象引用做爲函數參數傳遞時候,依然會相互影響,切記,如下示例:

 

 

複製代碼
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);
console.log(JSON.stringify(data));
複製代碼

輸出結果:

{"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}
{"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}
 
對象引用賦值後,如果將對象置空,相互間是不受影響的,如下:
var arr = {"a":"1","b":"2"};
var arr1 = arr;
arr = {};
arr["a"] = 2;
console.log(arr1);
console.log(arr);

輸出結果:{"a":"1","b":"2"},{"a":2}

轉載請註明:http://www.tea119.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章