1. 程式人生 > >關於 = 的賦值與引用

關於 = 的賦值與引用

關於 = 的賦值與引用

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.prototypeobj.__proto__依舊保持原樣。