2013-03-27 63 views
12

由於JavaScript中的字符串是基本類型,是否將字符串傳遞給函數會創建它的本地副本?我很想知道這一點,因爲你不能在創建字符串後修改字符串,所以看起來JavaScript邏輯不會僅僅在內部將字符串地址傳遞給函數。是否將字符串傳遞給函數按值複製或通過引用傳遞它?

如果有人告訴我,我不應該擔心這個(與網頁開發人員交談時會發生這種情況),我正在研究HTML5遊戲,垃圾收集是一個主要問題,所以我真的需要知道。

+4

也許是一個愚蠢的問題,但你爲什麼不試試呢? – Uby 2013-03-27 16:46:04

+2

每個基元類型都按值傳遞。請參閱http://snook.ca/archives/javascript/javascript_pass – 2013-03-27 16:47:43

+0

@silentboy:字符串值可能會像原始對象一樣對待,但是我保證*您的字符串不會被值傳遞。 – 2013-03-27 16:51:32

回答

10

該字符串將通過引用傳遞。

字符串不可變,所以每當你嘗試改變它時,你會得到一個新的字符串(例如通過做value+="more")。

另見:What does immutable mean?

@ T.J。 Crowder:按價值vs按ref - 如果你正在看語言定義,你是正確的。但是我不認爲有一個實際的創建字符串的副本,因爲它會非常慢。此外,因爲字符串是不可變的原語,所以不需要複製它們,因爲它們不能改變。

+2

*「該字符串將通過引用傳遞。」*你說這是事實。你有什麼證據嗎?我相信這是真的(或者更確切地說,我相信對字符串的引用是通過值傳遞的,** JavaScript中沒有任何**是「通過引用傳遞」),但是不能引用某些內容,我會毫不猶豫地聲明它作爲禿頭的事實。 – 2013-03-27 16:58:17

+0

@ Chris:我不是說複製了字符串內容的副本。我相當肯定他們不是(正如我在我的回答中所說的),對這些內容的引用(通過值)被傳遞給函數。 – 2013-03-27 17:15:12

+0

我知道字符串是不可變的,我說在問題中,這就是爲什麼我首先問它。我明天可能會接受這個答案,除非有人可以提供參考。答案是基於常識的,但我認爲在涉及這些問題時很難要求更多。 – dreta 2013-03-27 22:59:58

5

我相信規範在這一點上保持沉默。然而,即使字符串在理論上是「原始的」,它也將是一個真正的白癡實現,它傳遞字符串的實際內容,而不是傳遞對內容中的內容的引用。我懷疑大多數實現將「原始」字符串視爲對待對象引用(在這方面,顯然不是在其他一些對象中,例如===),但不是用Object陷阱。

+0

'==='上的不錯點。 – Taurus 2017-11-01 20:20:03

+0

如果通過了對某個事物的引用,那麼在下面的例子中'b'是不是更合理一些'bar'屬性? 'var a =「foo」 var b = a; a [「bar」] =「baz」; console.log(b [「bar」]);'現在,我確定拳擊有一些東西給我造成困惑,這是什麼? – Taurus 2017-11-01 20:25:14

+0

@Taurus:這是JavaScript的一個令人困惑的部分,但它是由規範涵蓋的。 :-)請記住,JavaScript既有字符串*原語*又有單獨的字符串*對象*。 'a' [包含/引用] * primitive * string'「foo」'。語句'a [「bar」] =「baz」'從'a'獲取原始字符串,但由於它接着使用類似於對象的形式,因此會創建一個新的臨時字符串對象並將其用於表達式的該部分。該臨時字符串對象獲取'bar'屬性,但由於沒有保存... *(續)* – 2017-11-01 22:23:02