LoginSignup
3

More than 1 year has passed since last update.

JavaScriptの論理演算子の返り値は論理値ではない

Posted at

経緯

先日JavaScriptで以下のような記述を見かけた.

len = (obj.arr || []).length

今までC++をメインに使っており,論理演算子の返り値は論理値(Boolean型)であると思い込んでいたが,どうやらJavaScriptでは仕様が違うらしい.

C++の場合

100 && 200を出力してみる.

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

int main() {
    int x = 100, y = 200;
    cout << (x && y) << endl; 

    // 完全な型名の取得
    const type_info& id = typeid(x && y);
    int stat;
    char *name = abi::__cxa_demangle(id.name(),0,0,&stat);

    cout << name << endl;
}

以下が出力.bool型である.

1
bool

JavaScriptの場合

x = 100
y = 200
console.log(x && y)
console.log(typeof(x && y))

以下が出力.yの中身が返ってきている.

200
number

リファレンスに書いてあった

expr1 && expr2
expr1 が true に変換できる場合は expr2 を返し、それ以外の場合は expr1 を返します。

一般的には Boolean (論理) 値で使用されます。その場合は論理値を返します。ただし && 演算子は実際には指定されたオペランドのうち一つの値を返すので、この演算子が論理値以外で使用された場合は、論理値以外の値を返すことになります。

expr1 || expr2
expr1 が true に変換できる場合は expr1 を返し、それ以外の場合は expr2 を返します。

Pythonの場合

ちなみに,Pythonもこの仕様のようだ.

x = 100
y = 200
print(x and y)
print(type(x and y))
200
<class 'int'> 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3