12

リソースに非常に制約のある組み込みデバイス ( http://www.espruino.com )用の JavaScript インタープリターを作成していますが、JavaScript を正しく実装したと思うたびに、自分が間違っていることに気付きます。

今の私の質問は について[]です。JavaScript の最も基本的な部分の 1 つを正しく実装するにはどうすればよいでしょうか?

JavaScript の仕様を調べましたが、適切な部分が見つからない可能性がありますが、有用な答えが見つかりません。

以前は、整数用と文字列用の 2 つの「マップ」が事実上あると想定していました。また、配列の長さは、最大の整数に 1 を加えた値でした。ただし、クロムの jsconsole によると、これは間違っているようです。

var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6

だけでなく:

var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6

それで...素晴らしい-すべてが文字列に変換され、整数を表す最大値の文字列(プラス1)が長さを取得するために使用されますか? 違う。

var a = [];
a["05"] = 42;
a.length; // 0

"05"8 進数でも有効な整数です。では、なぜ長さに影響しないのでしょうか?

文字列を整数に変換し、文字列に戻すときに一致することを確認する必要がありますか?

配列またはオブジェクトにアイテムを格納および取得するために使用される正確なアルゴリズムへの参照を持っている人はいますか? とてもシンプルなはずですが、実際はそうではないようです。

4

4 に答える 4

4

MDNを参照

必須ではありませんが、JavaScript 配列のインデックスを引用することもできます (たとえば、years[2] の代わりに years["2"])。いずれにせよ、年数の 2[2] は、暗黙的な toString 変換を通じて、最終的に JavaScript エンジンによって強制的に文字列に変換されます。このため、"2" と "02" は年オブジェクトの 2 つの異なるスロットを参照し、次の例は true をログに記録します。

console.log(years["2"] != years["02"]);

したがって、配列オブジェクトにプロパティを設定しa["5"]ながら配列にアクセスしています。a["05"]

于 2013-04-11T19:28:20.413 に答える
3

配列は単なるオブジェクトです。つまり、配列の要素とは見なされない追加のプロパティを持つことができます。

角かっこの引数が整数の場合、それを使用して配列への代入を実行します。それ以外の場合は、文字列として扱い、配列オブジェクトのプロパティとして格納します。

delnan のコメントと DCoder のコメントに基づいて編集します。これは、JavaScript が配列の適切なインデックスであるかどうかを判断する方法です (単なるプロパティではなく): http://www.ecma-international.org/ecma-262/5.1/#sec -15.4

于 2013-04-11T19:27:37.383 に答える
1

配列もオブジェクトです。

こうすることで

a["05"] = 5;

あなたは次と同じことをしています:

a.05 = 5;

ただし、ドットの後に指定されたプロパティは数字で始めることはできないため、上記は構文エラーになります。

したがって、これを行う場合:

a = [];
a["05"] = 5;

まだ空の配列aがありますが、 namedのプロパティに05は値があります5

が等しい場合にのみ、数値x は配列インデックスです(したがって、その要件が満たされない場合)。ToString(ToUint32(x))x"05"

于 2013-04-11T19:44:37.003 に答える