JSオブジェクトのキー(文字列)の長さに制限はありますか?


84

そのため、キーがid(int)で、値が文字列であるオブジェクトがある場合がありました。しかし、ほとんどの場合、文字列に基づいてidを検索することに気付いたので、それを逆にして文字列をキーにし、値はidです。その方法では、各項目を調べて値を比較する代わりに、次のことを実行できますvar id = storage[text];。以下は私たちがしたことの例です。

古い実装の例を次に示します。

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 Webビューがオブジェクトキーに課す長さの制限はありますか?

また、この実装には欠点がありますか?今のところ問題はありませんが、わかりません。

回答:


96

私はこれを少し調べました。

MDNはこの問題について沈黙しており、仕様(ES5ES6も沈黙しています。彼らは、プロパティアクセサは文字列でなければならず、資格がないことを述べているだけです。言い換えれば、仕様に関する限り制限はありません。それは驚くことではありません。

ブラウザがそれをどのように処理するかは別の問題です。テストを設定し、いくつかのブラウザで実行しました。クロム40(デスクトップ)、クロム40(アンドロイド5.1)は、Firefox 36、オペラ27、およびIE9 +は2つのまでのプロパティ名を扱うことができる27文字。サファリ8(OS Xヨセミテは)でも、2つのプロパティ名扱うことができる30の文字が。

IEを除くすべてのブラウザで、プロパティの最大長は文字列の最大長と同じです。IE9 +は〜2の最大文字列長扱うことができる30文字を、しかし、オブジェクトキーの制限は2つのである27だけで、他のブラウザのように、文字。

iOSのIE8とSafariでは、おそらくテストコードによって引き起こされたメモリの問題が原因で、テストが機能しませんでした。

一言で言えば、極端な場合でも、長いプロパティ名を使用しても安全です。文字列自体がブラウザが処理できる範囲内にある限り、プロパティ名としても使用できます。


17
任意のランタイム最近のブラウザで長いキーのペナルティ?
Ahmed Fasih 2015年

@AhmedFasihまだテストしていないので、よくわかりません。パフォーマンスが低下する場合は、長い文字列を比較する必要があると思います。実際に重要な問題がある場合は驚きます-キーが巨大で多数であり、モバイルなどでメモリの制約にぶつかり始めない限り。
hashchange 2015

7
ES7仕様では、「要素」の2 ^ 53-1の制限が指定されています。しかし、ヒープの最大サイズによって制限されていると思います
mems 2017年

6
MDNはこの問題について沈黙しています…」。もうありません。;-)
RobG 2017

2
したがって、実際のサイズは2 ^ 27 = 0.125 GB、および2 ^ 30 = 1GBです。私のためのたくさんのこと:)
ソリンC

34

いいえ、文字列の長さに制限はありません(メモリに収まる限り)。実装も問題ないようです。ブール値などの「向きを変えた」配列を使用することは、実際には非常に一般的です。キーとしての文字列について:文字列は特定のアドレスに格納される不変の記号であり、配列のインデックスとして実際に使用されるのは、文字列自体ではなく、そのアドレス(別名ポインタ)です。


7
「文字列は不変の記号です」:これはどこで学びましたか?
アンドリュー

4
面白い。おそらく参照やソースを追加できますか?
hashchange 2015

8
多くの言語では、文字列は不変です。Javascriptはそれらの言語の1つです。developer.mozilla.org/en-US/docs/Web/JavaScript/...
hartz89

3
他の人のためにいくつかのマイナーな明快さを追加するだけです。これは、文字列を変更するアクションを実行できないことを意味します。新しい文字列を操作して返すことはできますが、実際に文字列を変更することはできません
Patrick

受け入れられた答えはより実用的ですが、これが本当の答えです。
theUtherSide 2018年

5

ECMAScript 2016のように見えますが、この質問に対する決定的な答えがあります。よるとString.lengthです上のMDNのWebドキュメント

ECMAScript 2016(ed。7)は、最大長2 ^ 53-1要素を確立しました。以前は、最大長は指定されていませんでした。

これは、ECMAScript®2016言語仕様でも指定されています。

文字列型は、最大長2 53-1要素までの0個以上の16ビット符号なし整数値(「要素」)のすべての順序付けられたシーケンスのセットです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.