1

オブジェクトのキーは常に文字列であると私は理解しています。ただし、キーとして使用すると数値は文字列に変換されると思います。つまり、ある種の禁止値型ではないことを意味します。文字列キーの前後に引用符を使用しないため、次のように記述します。

{
    a: "a_value",
    b: "b_value", [...]
}

...私はそのようなものを読む方が簡単かもしれないと思いました:

{
    1: "first_value",
    4: "whatever", [...]
}

だから私の質問は:数値をキーとして使用することは本当に悪い習慣と考えられていますか、それとも少なくとも目的や読みやすさのためにそれを行うことができますか?

ありがとう。

4

2 に答える 2

2

任意の値を1つのキャッチでJavaScriptオブジェクトのプロパティとして使用できます。前述[ToString]のように、値に対して呼び出されてプロパティ名1を取得します。

したがって、オブジェクトリテラル{1: "hi"}は。と同等{"1": "hi"}です。

現在、許可されているObject Initialiser構文は{PropertyName: AssignmentExpression, ..}、PropertyNameがIdentifierName()、StringLiteral()、またはNumericLiteral( )のみである場合です。他の値は引き続きキーとして使用できます。オブジェクト初期化構文を使用して宣言されていないだけです。x"1"1

無効なリテラルの例、および通常のプロパティ割り当てを使用してそれを書き換える方法:

x = {/regex/: "y"};        // invalid - only Name/String/Number allowed
x = {}; x[/regex/] = "y";  // "okay" - but very suspect!

そうは言っても、配列を扱う場合を除いて、「整数プロパティ」を使用したことがあるとは言えません。これは、疑わしい場合でも、間違いではありません。


1これはプロパティアクセス(例)に適用されますが、IdentifierNamesは式として扱われないobj[x] = yため、オブジェクト初期化子には直接適用されません。ただし、すべてのプロパティ名が文字列であるという最終結果は引き続き適用されます。

于 2013-03-27T00:21:28.117 に答える
2

プロパティ名は文字列でなければならないのは正しいですが、変換は自動的に行われます。つまり、o = {1: "test""}と同じですo = {"1": "test"}。同様にo[45]o[45] = "hi"両方とも、を使用してプロパティ名を変換しますtoString()

これが簡単なデモンストレーションです。ここで、toString()それを明確にするためにオーバーライドしました。

var o = {xyz: 100, toString: function() { console.log("someone string'd me"); return "ooo"; }}
var x = {};

x[o] = "test";
// console says "someone stringed me"

console.log(x["ooo"]);
// console says "test";

console.log(x[o]);
// console says "someone string'd me", then "test"

プロパティとして使用されるたびoに、を使用して暗黙的に文字列に変換されることがわかりますo.toString()。したがって、明確にするために、数値キーの使用は問題ではありません。実際、テスト["hi", "ol", "dad"]["1"]して、["hi"、 "ol"、 "dad"][1]`と同じものであることがわかります。

于 2013-03-27T00:27:08.170 に答える