経緯
先日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'>