🤔

空配列や空オブジェクトの真偽判定のプログラミング言語ごとの違い

2024/11/23に公開

私は現在、業務で主にTypeScriptを使っています。
以下のようなコードを、nullや空文字などのfalsyな値の対策でよく書くと思います。

hoge && console.log("hogeはtruthyです");

空配列や空オブジェクトはtruthyなので、falsyと勘違いして上記のようなコードを書くと、意図しない挙動をすることがあるわけですが、
他の言語でも空配列や空オブジェクトはtruthyとして扱われるのか疑問に思って少し調べてみました。

JavaScriptの場合

先述の通り、truthyです。
以下のコードを動作させればわかります。

const emptyObject = {};
// 2つとも実行される
[] && console.log("空配列はtruthy")
emptyObject && console.log("空オブジェクトはtruthy")

Rubyの場合

空配列、空オブジェクトのいずれもtruthyのようです。
以下のコードを実行して調べました。

empty_array = []
empty_object = {}

# 空配列がtruthyかどうかを検証
if empty_array
  puts "空配列はtruthy"
else
  puts "空配列はfalsy"
end

PHPの場合

空配列、空オブジェクトのいずれもfalsyのようです。
以下のコードを実行して調べました。

<?php

$emptyArray = [];
$emptyObject = new stdClass();

// 空配列がtruthyかどうかを検証
if ($emptyArray) {
    echo "空配列はtruthy!";
} else {
    echo "空配列はfalsy!";
}

// 空オブジェクトがtruthyかどうかを検証
if ($emptyObject) {
    echo "空オブジェクトはtruthy!";
} else {
    echo "空オブジェクトはfalsy!";
}
?>

Pythonの場合

空のリスト、空の辞書ともにfalsyのようです。
以下のコードで検証しました。

empty_list = []
empty_dict = {}

# 空のリストがtruthyかどうかを検証
if empty_list:
    print("空のリストはtruthy!")
else:
    print("空のリストはfalsy!")

# 空の辞書がtruthyかどうかを検証
if empty_dict:
    print("空の辞書はtruthy!")
else:
    print("空の辞書はfalsy!")

まとめ

今回検証した結果をまとめると、以下のようになります。

言語 空配列・空オブジェクトの評価
JavaScript true
Ruby true
PHP false
Python false

なぜ言語ごとに評価が分かれるのかという話になると、
思想の違いとしか言いようがないのかもしれません、、、

空であろうがオブジェクトである以上trueであるとするのか、
感覚的にfalseだからfalseとするのかの差のような気がしてます。。。

一つ言えるのは、思ったよりも言語仕様に違いがあって興味深かったです。
(PHPやPythonはあまりしっかり使ったことがないので、、、)

Discussion