JavaScript

論理演算子について

JavaScript(ECMAScript)の論理演算子(「&&」及び「||」)は、常に2つのオペランドのどちらかを返します。論理値を返すとは限りません。このことはStandard ECMA-262(ECMAScript言語仕様)のP.58に記載されています。

  • Standard ECMA-262
    ECMAScript Language Specification 3rd edition (December 1999)

    詳細は割愛しますが、注記(NOTE)で次のように明記されています。

        NOTE
        The value produced by a && or || operator is not necessarily of type Boolean. The value produced will
        always be the value of one of the two operand expressions.

    (意訳:&& または || 演算子によって生成される値がBoolean型である必要はない。生成される値は常に2つのオペランド式の一方となる。)

    ECMA-262はISO/IECとしても公開されているようです。

    • ISO/IEC 16262:2002
      http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=33835

メモ

私の参考にしている書籍や各リファレンス・サイトでは、論理演算子は論理値を返すことになっていますが、最新の言語仕様ではオペランドの一方を返すことになっていて、各ブラウザもこれに対応しています。

JavaScriptの論理演算子は条件演算子( ? : )で書いたほうが理解しやすいかもしれません。Aが2回評価されるかもしれない点を除けば、等価と言って良いと思います。

A && B A ? B : A
A || B A ? A : B

一般的に、論理演算子が使われる文脈では戻り値が論理値であろうと期待する文になっているため、演算子では論理値として評価されないかもしれない2つ目のオペランドも、文脈による型変換の結果、自然に論理値として評価されます。

    if (A && B) ...

Aが論理値としてtrueと評価されるとき、戻り値Bは、論理積演算子(&&)では論理値として評価されませんが、if構文の文脈によって論理値として評価されます。

大体のところを言うと、JavaScriptの論理演算子は制御文に近いものでしょう。

    (   confirm("山椒は小粒?") &&
        confirm("ぴりりと辛い?") &&
        (alert("よくできました(^o^)/"), true) &&
        ((style || this).background = "beige") &&
        ((style || this).borderStyle = "solid") &&
        ((style || this).borderColor = "beige") &&
        (disabled = true) &&
        (value = "よくできました(^o^)/")
    ) || alert("残念!");

(2007/12/22 初稿)