web-dev-qa-db-ja.com

論理演算子(||、&&など)の複合代入演算子がないのはなぜですか?

ECMA-262のパート11.13によると、複合代入演算子の完全なリストは次のとおりです:*= /= %= += -= <<= >>= >>>= &= ^= |=

パート11.11によると、ToBoolean(a)がtrueの場合、var c = a || baの値をcに入れ、そうでない場合はbの値をcに入れます。そのため、論理ORは、合体演算子としてよく使用されます。

function (options) {
    options = options || {};
}

上で示したように、合体を使用して変数のデフォルト値を指定します:a = a || b

複合代入演算子||=は本当に便利なようで、上記のコードをより簡潔で簡潔に記述できます:a ||= b。ただし、それはありません(ただし、*=+=、およびその他の複合代入演算子はあります)。

問題は、なぜですか?

21
penartur

考えられる理由の1つは、論理演算子_&&_および_||_に「短絡」動作があることです。 _&&_および_||_の右側のオペランドは、必要でない限り評価されません。おそらくこの理由から、言語設計者はa ||= f()のような式の意味が明確ではないと判断したため、そのような演算子は省略したほうがよいでしょう。

12
kevin cline

「なぜこの言語機能が実装されなかったのか」に関するすべての質問に対する一般的な答えは、言語を設計したチームが、利益がコストを上回らないと決定したというものです。

コストにはさまざまな形があります。言語機能の実装には時間と労力が必要ですが、複雑さの本質的なコストもあります。その機能は、潜在的な利点に比例して、言語をより複雑または曖昧にしますか?

架空の||=演算子は、他の複合代入演算子とは根本的に異なる何かを行います。他の演算子は本質的に純粋に数学ですが、これは異なります。それは1つの値を別の値に置き換えます(説明したコンテキストで)。

これがambiguity(演算子は、コンテキストに応じてtwo異なる関数を実行します) )、なぜそれが言語に含まれていないのかを理解することは難しくありません。あなたはその変化を述べていますが

function (options) {
    options = options || {};
}

function (options) {
    options ||= {};
}

null結合を実行することは価値のある機能ですが、その利点は私にはあまり明確ではありません。値の置換が行われる場合、視覚的表示を提供するために、等号の右側に両方の値を置くことが論理的(かつ明確)に見えますそのような置換が発生する可能性があること。

C#は別のパスをとり、nullの合体には 特定の演算子 を使用します。

8
Robert Harvey

そのとおりです||=は便利な構成です。 Perlに存在します。

実際、Perlは これらすべて を使用可能にします。

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

これらのいくつかは素晴らしいです(.=は文字列の末尾に何かを追加します)、それ以外の場合(&&= ???変数と変数の両方がtrueの場合、変数は右側に設定されると思います。しかし、なぜこれを行うのですか?)

言語に含まれるものは、実際にはその設計哲学の特徴です。

3
user82096