95

そのため、キーが 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 Webview がオブジェクト キーに設定する長さ制限はありますか?

また、この実装には欠点がありますか? これまでのところ問題に気づいていませんが、あなたにはわかりません。

4

3 に答える 3

113

これについて少し調べてみました。

MDN はこの問題について沈黙しており、仕様 ( ES5ES6 ) も同様です。プロパティ アクセサーは文字列である必要があり、修飾は必要ないと述べているだけです。つまり、仕様に関する限り、制限はありません。それはほとんど驚くべきことではありません。

ブラウザがそれをどのように処理するかは別の問題です。テストをセットアップし、いくつかのブラウザーで実行しました。Chrome 40 (デスクトップ)、Chrome 40 (Android 5.1)、Firefox 36、Opera 27、IE9+ では、最大 2 27文字のプロパティ名を扱うことができます。Safari 8 (OS X Yosemite) では、2 30文字のプロパティ名も処理できます。

IE を除くすべてのブラウザーでは、プロパティの最大長は文字列の最大長と同じです。IE9+ は最大 2 30文字の文字列を処理できますが、オブジェクト キーの制限は、他のブラウザーと同様に2 27文字です。

このテストは、iOS の IE8 と Safari では機能しませんでした。おそらく、テスト コードが原因でメモリの問題が発生したためです。

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

于 2015-03-03T21:04:43.447 に答える
37

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

于 2012-11-13T20:11:41.080 に答える