2015-10-07 11 views
5

でのプロパティの割り当てとアクセスが質問

更新

、正確には、JavaScriptで有効なプロパティ名としての資格は何?物件割当の方法はさまざまですか?プロパティ名はプロパティへのアクセスにどのように影響しますか?有効なプロパティ名は、JavaScript

(以下見て)私の元の質問への回答は、いくつかのことを片付けるのを助けたが、また、ワームの新しい缶を開けました。 JavaScriptに少し慣れてきた今、私はと信じています。私は多くのことを理解することができました。

私はこの情報を1つの説明に集約するのが苦労していたので、元の質問を広げて答えようとすると助かりになるかもしれません。

元の質問もともと

は、MDN JavaScript guide (object literals)といくつかの混乱がありました。具体的には、プロパティ名が有効なJavaScript識別子でない場合は、引用符で囲む必要があると主張した理由がわかりました。しかし、彼らは、コード7を引用符なしでプロパティ名として使用できることを示すサンプルコードを提供しました。

結局のところ、ガイドは、単に一つの重要な部分をオフに左に、そしてPointyはそれ(太字の変化)更新:プロパティ名が有効なJavaScript識別子または数ではないであろう場合

、引用符で囲む必要があります。

また、プロパティ名が識別子に適用される「数字で始まることはできません」ルールから逸脱することが許可されているのかと思いました。その質問は、私が所有していた完全な誤解を実際に明らかにしてくれました。

+0

なぜ7が有効な識別子ではありません。ここで

は、いくつかの興味深い記事がありますか? – MinusFour

+0

@MinusFour: 'var 7 = 9;'は構文エラーです。 –

+0

そして私たちをさらに狂わせるために、プロパティ名として8進数を使うことができます: 'var x = {7:" a "、x010:" b "}; ' –

答えて

1

短い答え

オブジェクトのプロパティ名は、(空の文字列を含む)任意のvalid identifiernumeric literal、またはstring literalことができます。

これで、JavaScriptのプロパティ名について覚えておかなければならない複雑なことがいくつかあります(要約は下記にあり、explored more on my own)。

負の数負の数は、実際の式であるように見えるかもしれません何

- プロパティ名はサポートしていません何か。

var obj = { 
    -12: 'nope' // I am an invalid property name, because I am an expression. 
}; 

幸いにも、ブラケット表記は私たちの表現を処理します。

obj[-6] = 'yup'; // Successful property assignment. We're good here. 

解析&型キャストは

すべてのプロパティ名が格納される前に文字列に型変換されています。

var obj = { 
    lego: 'Everything is cool when you\'re part of a string.' 
}; 

for (var key in obj) console.log(key); // "lego" 

しかし、それ以前でさえ、使用されている構文に従って構文解析され、10進リテラルに変換されます。

var objValid = { 
    '022': 'alligator', // valid string literal 
    6: 'cow', // interpreted as decimal, evaluates to 6 
    .345: 'bear', // interpreted as floating-point; evaluates to 0.345 
    1.000: 'fox', // interpreted as floating-point, evaluates to 1 
    8.9890: 'owl', // interpreted as floating-point, evaluates to 8.989 
    000888: 'fish', // interpreted as decimal, evaluates to 888 
    0777: 'monkey', // interpreted as octal, evaluates to 511 
    0x00111: 'elephant', // interpreted as hexadecimal, evaluates to 273 
    0b0011: 'donkey', // interpreted as binary, evaluates to 3 
}; 

console.log(objValid['022']); // "alligator"; as expected 
console.log(objValid[022]); // undefined; 022 is an octal literal that evaluates to 18 before our lookup ever occurs 
console.log(objValid[6]); // "cow"; as expected 
console.log(objValid['6']); // "cow"; as expected 
console.log(objValid[0777]); // "monkey"; we're accessing the property name as it was assigned (before it was parsed and typecasted) 
console.log(objValid['0777']); // undefined; after parsing and typecasting, our property name seems to have disappeared 
console.log(objValid['511']); // "monkey"; there it is, we found it using the evaluation of our original assignment 
console.log(objValid[0x00111]); // "elephant"; we're accessing the property name as it was assigned (before it was parsed and typecasted) 
console.log(objValid['0x00111']); // undefined; after parsing and typecasting, our property name seems to have disappeared 
console.log(objValid['273']); // "elephant"; there it is, we found it using the evaluation of our original assignment 
console.log(objValid[0b0011]); // "donkey"; we're accessing the property name as it was assigned (before it was parsed and typecasted) 
console.log(objValid['0b0011']); // undefined; after parsing and typecasting, our property name seems to have disappeared 
console.log(objValid['3']); // "donkey"; there it is, we found it using the evaluation of our original assignment 

結論

あなたは、有効な(non-negative integer)配列インデックスで作業している場合を除き - 明示的に文字列として全ての数値プロパティ名を割り当てます。第一の質問には

2

回答:

はい、MDNガイドに与えられた文は、100%正確ではありませんが、あなたの毎日の仕事では原則としてそれに従う方が良いと思います。実際には、番号であるプロパティ名を作成する必要はありません。第二の質問には

回答:

プロパティ名は、その名前で結構です内の他の文字のない数である桁が、プロパティ名で始めることはできません。

この例外は、名前のプロパティがindexesと同じであるために存在します。

のは、これを試してみましょう:

var obj = {7: "abc"}; 
obj[7]; // works fine 
obj.7; // gives an error (SyntaxError) 

今すぐオブジェクトにArray.pushを呼び出し、何が起こるかを観察してみてください。

Array.prototype.push.call(obj, "xyz"); 
console.log(obj); 
console.log(obj[0]); 

// Prints 
Object {0: "xyz", 7: "abc", length: 1} 
"xyz" 

あなたはそのいくつかの新しいプロパティ(名前0と1とで別のを見ることができます名前length)がオブジェクトに追加されました。また、あなたは、配列のようなオブジェクトを使用することができます。

var obj = { "0": "abc", "1": "xyz", length: 2 }; 

Array.prototype.pop.call(obj); // Returns: "xyz" 
Array.prototype.pop.call(obj); // Returns: "abc" 

あなたがオブジェクトに配列のメソッドを使用することができ、これはDuck Typingと呼ばれています。

配列は、あらかじめ定義されたメソッドを持つオブジェクトに過ぎません。 MDNから

配列要素は、その長さは、プロパティであるのと同じ方法でオブジェクトのプロパティであるが、プロパティ名であるため、ドット表記を持つ配列の要素にアクセスしようとすると、構文エラーをスロー有効ではありません。 JavaScript配列とその原因となるプロパティには特別なものはありません。数字で始まるJavaScriptプロパティはドット表記では参照できず、かっこ表記を使用してアクセスする必要があります。

ここで、プロパティ名の番号が有効な理由を理解できます。これらは単にインデックスと呼ばれ、JavaScript配列で使用されます。 JavaScriptは他の言語との一貫性が必要であるため、インデックス/プロパティ名には数字が有効です。

これは明らかです。

関連する問題