2012-11-13 37 views
36

所以我們有一個情況,我們會有一些JSON,其中鍵是id(int),值是字符串。但是我們注意到大多數情況下,我們會根據字符串查找id,所以我們決定將其反轉,並將字符串作爲關鍵字,值爲id。因爲這樣,而不是通過每個項目和比較值,我們可以做var id = storage[text];。以下是我們所做的例子。JS對象中的鍵(字符串)的長度是否有限制?

這裏是舊的實現的例子:

var storage = { 
    0 : null, 
    1 : "Hello", 
    2 : "world!", 
    3 : "How are you?" 
} 

這裏是新實施的例子:據我所知,現在的字符串是關鍵

var storage = { 
    "null" : 0, 
    "Hello" : 1, 
    "world!" : 2, 
    "How are you?" : 3 
} 

和它的確定以獲得相同id爲相同的字符串。但是從現在開始,字符串可能會非常龐大​​(很少機會,但每個字符串最大可能爲1KB),是否存在JS或Android webview放置對象鍵的長度限制?

而且,這個實現有缺點嗎?到目前爲止我還沒有注意到任何問題,但你永遠不知道。

回答

35

我已經研究了一下。

MDN is silent關於這個問題,所以是規範(ES5,ES6)。他們只聲明屬性訪問者必須是一個字符串,沒有任何資格 - 換句話說,就規範而言沒有限制。這並不奇怪。

瀏覽器如何處理它,是另一回事。我已經設置了a test並在很多瀏覽器中運行它。 Chrome 40(桌面),Chrome 40(Android 5.1),Firefox 36,Opera 27和IE9 +可以處理最多2個字符的屬性名稱。 Safari 8(OS X Yosemite)甚至可以處理2 字符的屬性名稱。

對於除IE以外的所有瀏覽器,最大屬性長度與最大字符串長度相同。 IE9 +可以處理的字符的最大字符串長度,但與其他瀏覽器一樣,對象鍵的限制爲2 字符。

該測試在IE8和iOS的Safari上無法使用,可能是由於測試代碼導致的內存問題。

簡而言之,使用長屬性名稱是安全的,即使在極端情況下也是如此。只要字符串本身保持在瀏覽器可以處理的範圍內,您也可以將它們用作屬性名稱。

+10

現代瀏覽器的長鍵的任何* runtime *懲罰? –

+0

@AhmedFasih我還沒有測試過,所以我不確定。如果出現性能損失,我會假設它將與比較長字符串有關。如果在實踐中存在問題,我會感到很驚訝 - 除非密鑰是_huge_和衆多,並且您開始遇到內存限制,例如,在移動。 – hashchange

+4

ES7規範指定[元素的限制2^53 - 1]](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types-string -類型)。但我認爲它受限於堆最大尺寸 – mems

24

不,對字符串長度沒有限制(只要它適合內存),並且您的實現似乎也可以。使用例如「轉向」陣列進行轉換非常常見。布爾值。 對於字符串作爲鍵:字符串是存儲在某個地址的不可變符號,實際用作數組索引的是該地址(又名指針又稱爲引用),而不是字符串本身。

+6

「字符串是不可改變的符號」:你從哪裏學到的? – Andrew

+3

有趣。你可以添加一個參考或來源? – hashchange

+5

在很多語言中,字符串是不可變的。 Javascript是這些語言之一。 HTTPS://developer.mozilla。org/en-US/docs/Web/JavaScript/Data_structures#Primitive_values – hartz89

相關問題