2012-11-13 20 views
36

私たちはいくつかのJSONを持つケースがありました。ここでkeyは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。しかし、今のところ文字列は潜在的に非常に巨大(潜在的な可能性がありますが、おそらく1文字あたり最大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の最大文字列長を扱うことができます文字が、他のブラウザと同じように、オブジェクトキーの制限は2 にあります。

テストはIE8とiOSのSafariでは動作しませんでした。おそらくテストコードによってメモリの問題が発生したためです。

一言で言えば、極端な状態にしても、長いプロパティ名を使用することは安全です。文字列そのものがブラウザが処理できる範囲内にとどまっている限り、プロパティ名としても使用できます。

+10

現代のブラウザの長いキーのランタイム*ペナルティはどれですか? –

+0

@AhmedFasih私はそれをテストしていないので、私は確かに分かりません。パフォーマンスのペナルティがある場合は、長い文字列を比較する必要があると思います。実際に問題となる問題がある場合は、キーが非常に多く、数が多く、メモリの制約に遭遇しない限り、驚くでしょう。モバイル上で – 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はこれらの言語の1つです。 https://developer.mozilla。org/ja-ja/docs/Web/JavaScript/Data_structures#Primitive_values – hartz89

関連する問題