當變數A賦值給變數B時,會將棧中的值複製一份到為新變數分配的空間中。
如何理解? 複製代碼 代碼如下:var x = y = 1;
y = 2;
alert(x);
x的值為多少? 複製代碼 代碼如下:var obj = {};
var sub = {};
sub['id'] = 3;
obj['sub'] = sub;
sub['id'] = 4;
alert(obj['sub']['id']);
obj['sub']['id']的值又為多少?他們真的符合你的預期嗎?
我們分別運行2段代碼,發現第1段程式中x的值沒有改變,而第2段程式中的obj['sub']['id']的值卻改變了。同樣是一個賦值操作,同樣是修改另外一份拷貝的值,為什麼一段程式源變數沒變,一段程式源變數變化了呢?這個傳遞到底是按值傳遞還是按引用傳遞的呢?
李松峰翻譯的《JavaScript 進階程式設計 第二版》中給出了答案。
在開始的這2個例子中,事實上都複製了A的值給B,不同的是,在第一個例子中,A的值是int型的1,而在第二個例子中,A的值是一個地址指標,這個地址指標可以訪問到一個對象,複製之後,第1個例子中的B的值變成了新的int, 他的值為1,而第2個例子中B的值變成了新的地址指標,他的值為這個對象的地址。
下面的例子可以協助理解 複製代碼 代碼如下:function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);
可以看到的是,儘管調用了setName函數修改了變數的name屬性,但是person.name的值並沒有改變。這是因為在函數中,obj指向的地址被改變了,因此修改這個地址的name屬性,並不會對原地址的name屬性造成影響。從另一個方面,也印證了JavaScript的傳遞是按值傳遞。