2014-12-13 56 views
1

在我的數據結構類中,我瞭解到在引擎蓋下字符串實際上是字符數組,這意味着字符串必須是引用變量而不是基本變量。然而,在JS中,情況並非如此 - 在JS中字符串確實被認爲是原始類型。更令人驚訝的是,JS是用C語言編寫的,與Python和Ruby相同 - 兩種處理字符串都是引用變量。JS:字符串真的是原始類型嗎?如果是這樣,這怎麼可能?

字符串真的是原始類型嗎?如果是這樣,這怎麼可能?

+4

這裏給出的鏈接是怎樣的? – raina77ow 2014-12-13 12:50:28

+1

JS爲什麼寫在C中令人驚訝?爲什麼C處理字符串的方式會影響寫在其中的語言如何處理字符串? – JJJ 2014-12-13 12:59:07

+2

JavaScript(ECMAScript,真的)是*語言規範*。你用什麼語言來實現它沒有任何意義。 – Tomalak 2014-12-13 13:04:48

回答

3

是的,字符串真的是原始的。那麼,那些不是對象的是。用於創建編譯器或解釋器的語言不需要對正在編譯或解釋的語言如何執行任何操作產生任何影響。

人們有時會被這樣一個事實困惑,即雖然它們是原始的,但它們有屬性(如length)和方法(如toLowerCase),這使得它看起來像是對象。所以我們來探討一下。

當你看到訪問字符串的屬性的表達,也許是方法:

str = str.toLowerCase(); 

...發生的事情是字符串原始提升爲String對象,然後該對象的方法使用,然後臨時對象被扔掉。這是建立在語言,在§11.2.1和(更多的點)§8.7.1覆蓋(在turgid散文),在步驟1它使用抽象ToObject方法。

這適用於大多數基元(字符串,數字和布爾值)。另外兩個(nullundefined)沒有等效的對象。

當你的屬性賦值給原始字符串時,此行爲甚至可以工作,但由於創建的臨時對象被丟棄,屬性立即消失。例如,這是有效的,並會運行:

var str = "foo"; 
str.someSpecialProperty = "bar"; 
console.log(typeof str.someSpecialProperty); // "undefined" 

...但對象屬性添加到立即消失,使之有效地無操作,因此在財產被在年底未知的(因爲它不是在第二個創建的臨時對象)。


當我說:「嗯,這是不是對象的有」我的意思是,你可以明確地創建一個字符串對象

var strObj = new String(); 

這是一個對象,而不是原始:

var str = "foo"; 
 
snippet.log("typeof str = " + typeof str);  // "string" 
 
var strObj = new String("foo"); 
 
snippet.log("typeof strObj = " + typeof strObj); // "object"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

想要做到這一點非常罕見,但您可以。

+0

是的,所謂的**自動裝箱** – Leo 2014-12-13 12:56:24

+0

@Leo:它與Java的自動裝箱*相似,但略有不同,我從來沒有聽說過這個術語適用於JavaScript。 – 2014-12-13 12:57:27

+0

語言規範不使用該短語。當有人試圖向人們(熟悉其他OOP語言)向人們解釋它時,通常使用它,儘管不是100%準確:) – Leo 2014-12-13 13:04:34

相關問題