首頁  >  文章  >  web前端  >  Javascript 賦值機制詳解_基礎知識

Javascript 賦值機制詳解_基礎知識

WBOY
WBOY原創
2016-05-16 16:30:451352瀏覽

今天回答了一個關於 Javascript 的問題,涉及到了賦值問題,因此想把這個問題好好總結下。

複製程式碼 程式碼如下:

var a = 'test';
var b = function() {};
b.a = 'test';
function change(m, n) {
    m = 'change';
    n.a = 'change';
}
change(a, b);

執行上述程式碼後,變數 a 和 b 的值會改變嗎?

原始值與引用值

在先前的文章中介紹過原始值和參考值,原始值指的Undefined, Null, Boolean, Number, String 等,它們存放在堆疊中,而引用值則集成自Object,它被存放在堆中。
這裡要把兩者區分清楚:

複製程式碼 程式碼如下:

var a = 'test';
var b = new String('test');
var A = 'true';
var B = new Boolean('true');

以上四個變量,a 和 A 為原始值,而 b 和 B 則為引用值。

賦值機制

清楚了原始值和引用值的差異後,就可以具體介紹 Javascript 的賦值機制:

在 Javascript 中,對於原始值類型的變量,每次賦值都將產生一份拷貝,而對於引用值,則正如其名,是透過引用賦值,指向同一個儲存物件的記憶體。
原始值的賦值:

複製程式碼 程式碼如下:

var a = 1;//原始值
var b = a;//產生一份拷貝給變數 b
b = 2;//與 a 無關
alert(a);//輸出 1

引用值的賦值:

複製程式碼 程式碼如下:

var A= new Object();//引用值
A.x = 1;
var B = A;//引用賦值,指向同一個記憶體處
B.x = 2;//修改 B 會影響 A
alert(A.x);//輸出 2

參數傳遞

現在我們來看看傳遞兩種類型的值給函數形參時時怎麼處理的。
1.傳遞原始值

複製程式碼 程式碼如下:

var a = 1;
function test(m) {
    m = 2;
}
test(a);
alert(a);//輸出 1

輸出為1,所以我們知道函數只是將變數的值傳遞進去了,所以在函數體內的 m 得到傳來的值1,再被賦值為2,這個過程不影響外部的變數 a。

2.傳遞引用值

複製程式碼 程式碼如下:

var A= new Object();
A.x = 1
function test(M) {
    M.x = 2;
}
test(A);
alert(A.x);//輸出 2

輸出為2,所以我們知道函數將變數的位址傳遞進去了,所以函數體內的 M 得到傳遞來的位址,因此屬性 x 被賦值為2的同時也會影響指向相同記憶體位址的 A。

總結

現在再回到開頭的問題:

複製程式碼 程式碼如下:

var a = 'test';
var b = function() {};
b.a = 'test';
function change(m, n) {
    m = 'change';
    n.a = 'change';
}
change(a, b);

變數 a 為原始值,變數 b 為引用值,傳遞進函數體內一個為值,一個為位址,所以函數運行後,變數 a 不會改變,而變數 b 的值會改變。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn