2012-09-26 63 views
7

空字符或空終止符(\0)將用於終止連續的字符序列。我發現在C中,我可以將字符添加到一個隨機位置的字符串中,並從該位置切斷字符串。例如:爲什麼不在字符串中任意放置空終止符會終止它?

char * s = "Hello\0World"; 

將導致s等於該字符串"Hello"。然而,在JavaScript中,情況並非如此:

var s = "Hello\0World"; 

以上將無法按預期工作。 s將等於字符串"HelloWorld"

爲什麼不能正常工作?

+0

I認爲Javascript不是C.所以字符串中的空字節只是一個字符串中的空字節。 –

+1

大多數語言都遵循Pascal將字符串表示爲具有整數長度的數組(因此允許空字符)的傳統。 C在這個意義上實際上是奇怪的。 – hugomg

回答

8

JavaScript不使用NULL終止字符串,而C使用。

Javascript字符串是通過分別跟蹤字符和長度來存儲的,而不是試圖假定NULL標記字符串的結尾。

+0

JS用於字符串的是什麼? – 0x499602D2

+0

它用'''將它們分開.... – Nanne

2

在Javascript中,a字符串中的字節只是NULL字節。 如果你想截斷字符串

var s = "Hello\0World".split("\0").shift(); 

但在這種情況下,我認爲這沒有必要去打擾空字節:)

4

的C字符串仍然指向的地址在內存中的「Hello \ 0World」存儲,只有大多數字符串處理函數認爲0字符串結束。對於某些函數,您必須傳遞一個字符串長度參數,但大多數情況下只是讀取它們直到找到空字節。在內存中,字符串實際上是「Hello \ 0World \ 0」。

JavaScript引擎無法通過查找空字節來確定字符串長度,因爲在這種情況下,您將無法在字符串中使用空字節。在規格中可能有一些關於此的內容。引擎必須單獨存儲字符串的長度,然後在訪問字符串時從內存中讀取許多字符。

如何正確解析和存儲緩衝區的大小是腳本語言通常試圖隱藏用戶的東西。這是腳本編寫的一半目的,不要求程序員擔心將0添加到創建的字符緩衝區和/或單獨存儲字符串長度,以便字符串處理函數不會在緩衝區外打印一串隨機字符以查找空字節。 。

那麼JavaScript字符串究竟如何表現呢?我不知道,這可能要由引擎來深入描述其屬性。只要你像規範說明的那樣與對象接口,它可以以任何方式實現,使用緩衝區和長度的結構,使用0的轉換字符,使用鏈接的字符列表等等。