別のオブジェクトを引数マップとして使用してオブジェクトを構築したいと考えています。引数は必須ではありません。
次のことができないのはなぜですか:
var Key = function( args ) {
text in args && this.text = args.text;
};
メンバーを一行で初期化するには?私は本当に if() ... をしなければなりませんか?
ご協力いただきありがとうございます !
別のオブジェクトを引数マップとして使用してオブジェクトを構築したいと考えています。引数は必須ではありません。
次のことができないのはなぜですか:
var Key = function( args ) {
text in args && this.text = args.text;
};
メンバーを一行で初期化するには?私は本当に if() ... をしなければなりませんか?
ご協力いただきありがとうございます !
この問題の原因は、演算子の優先順位が目的の意味と一致しないことです。
その式ステートメント内で最も優先順位が高いのは.
演算子です。これはどの演算子よりも優先順位が高いため、あえて括弧を使用しません。
次に優先順位が高いのはin
演算子であるため、最初にそのオペランドでラップできます。
(text in args) && this.text = args.text;
その後、&&
演算子の優先順位が 2 番目に高いため、オペランドでラップすることができます。
((text in args) && this.text) = args.text;
そして今、私たちは問題を見ることができます。args.text
を式の結果に代入しようとして((text in args) && this.text)
いますが、これは解決可能な識別子への代入ではないため無効です。
演算子の優先順位を手動で強制する必要があることがわかったので、=
演算子が動作すると予想されるオペランドでラップし、括弧を調整でき&&
ます。
((text in args) && (this.text = args.text));
そして、優先順位の残りの部分が意図したとおりに自然にうまく機能したことがわかっているので、他の括弧を取り除くことができます。
text in args && (this.text = args.text);