2016-03-30 12 views
2

読書デビッド・フラナガンさんDefinitive Guideの(第6版)、これにつまずい:strictモードでJS:厳密でないモードで同じ名前の2つ以上のオブジェクトプロパティ?

を、それが同じ名前で 二つ以上のプロパティを定義するオブジェクトリテラルの構文エラーです。 (非厳密モードでは、エラー は発生しません)

例はありません - それは可能ですか?私は

var obj = {prop: 'foo', prop: 'bar'}; 

を試してみました...もちろん、私は両方の厳格かつ非厳密モードでは、唯一つのプロパティ( Object {prop: "bar"})で終わります。

これは実装に依存しますか?この本は2011年版で、ECMAScript 5がそこにあります。

私は新しい本を読むべきですか?

+1

これは奇妙です。間違いなく、ES5仕様(https://es5.github.io/#Cおよびhttps://es5.github.io/#x11.1.5)に基づく厳密なモード制限の1つです。私はES6が今それを持ち上げているかどうかをチェックしています(おそらく計算されたプロパティの場合)。 – Ryan

+0

エラーが発生していない場合は、構文エラーが発生していません。オブジェクトは同じ名前の複数のプロパティを持つことはできません。 – thangngoc89

+0

@ thangngoc89両方のモードで構文エラーは発生しません。なぜどんなアイデア? – montrealist

答えて

2

本は正しいです。 ES5の仕様では、オブジェクトリテラルに同じ名前の複数のプロパティを定義するのは構文エラーです。

この辺りsection 11.1.5を参照してください:

を以前は未定義でない場合は、次の条件のいずれかが

と有益Annex C真であるならば、SyntaxError例外をスロー:

厳密なモードコードに、任意のデータプロパティ(11.1.5)の複数の定義を持つObjectLiteralが含まれている場合は、SyntaxErrorです。あなたがテストしている

実装はも右ある、しかし、現在のECMAScript仕様として、この制限をドロップES2015は、です!それはAnnex Cまたはそれ以外のどこにも掲載されていません。

私は推測しなければならないとしたら、それはこの除去の理由は、計算されたプロパティとの整合性だったので、これらのリテラルは常に同等になることを次のようになります。

({ a: 1, ['a']: 2 }) 
({ a: 1, a: 2 }) 

しかし、うん、みんなの権利。 \ o/

+0

はい、IIRC、計算されたプロパティは、彼らは恐ろしい理由ではありませんが、理由がありました。 – Bergi

+0

ありがとうございました - 私は全く手がかりがありませんでした。私は頼んだことが良いことです。 – montrealist

関連する問題