ECMAScript中所有函數的參數都是按值傳遞的?

ECMAScript中所有函數的參數都是按值傳遞的?

前段時間翻《JavaScript高級程序設計》,無意間發現了這樣的一段描述:ECMAScript中所有函數的參數都是按值傳遞的。而作者給出的解釋是:

//這裏代碼並不完全是照搬書上的,所以可能不一致,但是意義是一樣的
var people = new Object();
function setName(data){
	data.name = "data";
	data = new Object();
	data.name = "new Object";
	return data;
}
var result = setName(people);
console.log('people.name : ' + people.name);//people.name : data
console.log('result.name : ' + result.name);//result.name : new Object

我在很久前看到這裏的時候就偏執的認爲是書上寫錯了,而後就沒有去深究了。最近再次看到這裏,還是倍感困惑,不過這次不同的是,我下定決心一定要弄清楚。

JavaScript中的變量類型主要有兩大類,一種是基礎類型(Null、Undefined、Number、Boolean、String、Symbol、BigInt),一種是引用類型(Object)。
JavaScript中對變量存儲有兩種方式,一種是棧,一種是堆(本篇主要是解答ECMAScript中所有函數的參數都是按值傳遞的,關於堆棧等知識點不作詳述,如果影響不了解此知識點而導致對本文無法進行閱讀,建議自行補充此方面知識點)。基礎類型的是存在棧裏面的,而引用類型的是存在堆裏面的,對這個值的引用是存在棧裏面的。
如果按照這樣理解,所謂的按值傳遞就是錯的,但是真的是錯的嗎?我們繼續往下面看。
作者說所有函數的參數都是按值傳遞的,我理解的作者在這裏想表達的值,是變量的值,而不是存儲在堆裏面的值

var obj = new Object();
function func(data){
//code
}

就如同這裏的代碼一樣,值,也就是變量的值,指的還是存儲在棧中的引用

看到這裏,也許有些人會覺得我在玩文字遊戲,別急,我將繼續展示出證據證明我理解的正確性。

在書上還有這樣一句話,有不少開發人員在這一點上可能會感到困惑,因爲訪問變量有按值和引用兩種方式,而參數只能按值傳遞。其實這裏也是對我造成困擾最嚴重的地方,如果用JavaScript來理解這句話,確實會照成很大的困擾,因爲這裏的不少開發人員指的根本就不是JavaScript開發人員(或者說使用沒有指針的語言的開發人員

//js
var num = 3;
var obj = new Object();

變量num的值是3,變量obj的值是new出來的Object對象存儲在堆內存中的地址值,那變量num和變量obj的值的引用是什麼呢?

我開始也理解錯了這裏的含義,直到我看到了這篇博客1下面的一個評論。如果按照c/c++的思想來理解,確實就可以解釋的通了。

//c
int num = 3;
int *numAddress;
numAddress = #

變量num的值是3,變量num的值的引用(應該叫指針)是numAddress

JavaScript是沒有二級指針的,也就是沒有引用的引用,所以所有函數的參數都是按值(相對於變量)傳遞。

本人才疏學淺,有什麼錯誤,還望不吝賜教。


  1. https://blog.csdn.net/weixin_39728230/article/details/80607294 ↩︎

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