關於 = 的賦值與引用
阿新 • • 發佈:2018-12-10
關於 = 的賦值與引用
var a = 10;
var b = a;
b++;
console.log(a); // 10
// 變數a,b均為基本資料型別; 顯然a不會隨著b的改變而改變;
var a = [1,2,3];
var b = a;
b.push(4);
console.log(a);// [1,2,3,4]
console.log(a == b); // true
// 變數a,b均為複雜資料型別;a隨著b發生了改變
結論:
-
當 ‘ = ’ 右邊是物件 / 函式時, ‘ = ’ 表示引用,也就是說此時左右兩邊指向同一個記憶體地址,任意一邊的改變都會引起另一個的改變。
-
當 ‘ = ‘ 右邊不是物件 / 函式時, ’ = ‘ 表示賦值,左右兩邊賦值完後毫不相干。
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
console.log(a); // [1,2,3]
console.loga(a == b); // false
注意:這裡的變數 a 、b 依舊是引用關係, 而變數 b 是重新賦值,所以a和b指向不同的物件,a不受b重新賦值的影響。
//程式碼一 function Fn() {} var obj = new Fn(); Fn.prototype.x = 10; console.log(obj.x); // 10 //程式碼二 function Fn() {} var obj = new Fn(); Fn.prototype = { x: 10 }; console.log(obj.x); // undefined
程式碼解讀: 建立obj例項的時候,
obj.__proto__
和Fn.prototype
指向同一個物件(同一個地址),程式碼一 中Fn.prototype
是添加了x屬性,也就是修改了這個相同的物件屬性,obj.__proto__
也會跟著改變,程式碼二中則是對Fn.prototype
進行了重新賦值,所以改變的只有Fn.prototype
,obj.__proto__
依舊保持原樣。