要点
- JavaScriptの空配列は、
Boolean()でもif文でも真として扱われた(出典: 自社の実測(2026-10-25)) - Pythonの空リストは、
bool()でもif文でも偽として扱われた(出典: 自社の実測(2026-10-25)) - 要素数が0かを調べる書き方では、両言語で空であることを判定できた(出典: 自社の実測(2026-10-25))
- 空文字列と数値の0は両言語で偽だったが、空の辞書とオブジェクトでは結果が分かれた(出典: 自社の実測(2026-10-25))
空配列をif文に渡すと何が困るのか
空配列とは、要素数が0の配列のことだ。
配列に要素がある場合だけ処理したいとき、配列をそのままif文の条件に書くと、JavaScriptとPythonでは結果が異なる。今回の比較では、Pythonの対象は空のリストである。同じ[]という見た目でも、条件としての扱いまで同じではない。
JavaScriptの空配列は、Boolean()でもif文でも真として扱われた。Pythonの空リストは、bool()でもif文でも偽として扱われた。
出典: 自社の実測(2026-10-25)
そのため、Pythonのリストで使っていた条件式をJavaScriptの配列にも当てはめると、「要素があるときだけ処理する」という意図から外れる。JavaScriptでは、空配列をそのまま条件にしても偽にはならない。
この違いは、既定値を選ぶコードにも現れる。たとえば、次の書き方だ。
const items = data.list || DEFAULT_LIST;
data.listが空配列の場合、この式では既定値のDEFAULT_LISTに切り替わらない。空配列が真と評価されるためだ。「配列に要素が1件もなければ既定値を使う」という条件を、この式だけでは表せない。
確認したいのが「条件式として真になるか」なのか、「要素数が0か」なのかで、必要な判定は異なる。JavaScriptの空配列は、要素数が0であっても、条件式では真として扱われる。
公式資料は空の値をどう説明しているか
MDNの「Truthy」には、次の記述がある。
all objects are truthy
出典: MDN「Truthy」(取得日: 2026-10-25)
同ページでは、空配列も真として扱われる例に含まれる。JavaScriptでは配列もオブジェクトの一種として扱われ、真偽判定では配列の要素数を見ない。中身が空であることは、配列を偽と評価する理由にはならない。
一方、Python公式リファレンスの「Truth Value Testing」では、偽と評価される値として空のシーケンスが挙げられており、その例に空文字列、空タプル、空リストが含まれる。
出典: Python公式リファレンス「Truth Value Testing」
Pythonは、リストなどのシーケンスについて、長さが0であることを偽と定めている。JavaScriptの配列では要素数を見ずに真となるのに対し、Pythonの空リストでは長さが0であることが真偽の判定に関わる。
この規定に照らすと、Pythonの空リストが偽になることと、JavaScriptの空配列が真になることは、それぞれの資料に沿った結果である。同じ空の状態でも、両言語で条件式の評価が一致するわけではない。
ただし、配列で結果が異なるからといって、空文字列や数値の0まで逆になるわけではない。今回の実測でも、空文字列と数値の0については、両言語で偽という結果が得られた。
出典: 自社の実測(2026-10-25)
空配列・空文字列・0の実測結果を比べる
実測日は2026-10-25(JST)。環境として記録されているのは、Python 3.9.0とNode.js v22.23.4である。
版の確認には、次のコマンドを使用している。
python3 --version
# Python 3.9.0
node --version
# v22.23.4
その環境で確認された真偽変換の結果を並べると、次のようになる。
| 比べる対象 | Pythonの式 | 結果 | JavaScriptの式 | 結果 |
|---|---|---|---|---|
| 空リスト/空配列 | bool([]) |
False |
Boolean([]) |
true |
| 空の辞書/空のオブジェクト | bool({}) |
False |
Boolean({}) |
true |
| 空文字列 | bool("") |
False |
Boolean("") |
false |
| 数値の0 | bool(0) |
False |
Boolean(0) |
false |
出典: 自社の実測(2026-10-25)
JavaScriptの空配列については、真偽値への変換だけでなく、if文の分岐も確認している。実測したコードと結果は次のとおりだ。
const a = [];
console.log(Boolean(a)); // true
if (a) {
console.log("真");
} else {
console.log("偽");
}
// 真
Boolean(a)の結果はtrueで、if (a)でも「真」を表示する分岐に入った。空配列であっても、そのまま条件にすると真として扱われることが確認できる。
Pythonの空リストでは、同じ比較が次の結果になった。
a = []
print(bool(a)) # False
if a:
print("真")
else:
print("偽")
# 偽
bool(a)の結果はFalseで、if a:でも「偽」を表示する分岐に入った。今回の空リストと空配列の比較では、変換関数の結果だけでなく、条件分岐の結果も異なっている。
ほかの空の値と数値の0については、次のコードで真偽変換を確認した。
print(bool({})) # False(空の辞書)
print(bool("")) # False(空文字列)
print(bool(0)) # False
console.log(Boolean({})); // true(空のオブジェクト)
console.log(Boolean("")); // false(空文字列)
console.log(Boolean(0)); // false
空文字列と数値の0は両言語で偽だったが、空の辞書とオブジェクトでは結果が分かれた。Pythonの空の辞書はFalse、JavaScriptの空のオブジェクトはtrueとなった。
したがって、今回の測定では、空リストと空配列に加えて、空の辞書と空のオブジェクトでも食い違いが確認された。一方、空文字列と数値の0については一致している。
空かどうかを知りたいときは要素数を使う
配列やリストが空であることを判定したいなら、要素数が0かどうかを条件にする。今回の実測では、Pythonのlen(a) == 0とJavaScriptのa.length === 0を確認した。
Pythonでは、次の結果になった。
a = []
print(len(a) == 0) # True
JavaScriptでは、次の結果になった。
const a = [];
console.log(a.length === 0); // true
要素数が0かを調べる書き方では、両言語で空であることを判定できた。PythonではTrue、JavaScriptではtrueとなり、いずれも「要素数が0である」という条件が成り立っている。
ここで、真偽変換と要素数の比較を並べると、違いがはっきりする。
| 調べること | Pythonの空リスト | JavaScriptの空配列 |
|---|---|---|
| 値をそのまま真偽値に変換する | bool(a) → False |
Boolean(a) → true |
| 要素数が0かを調べる | len(a) == 0 → True |
a.length === 0 → true |
出典: 自社の実測(2026-10-25)
Pythonの空リストに対するbool(a)はFalseだが、len(a) == 0はTrueだった。前者はリスト自体の真偽を調べ、後者は「空である」という条件が成り立つかを調べている。
JavaScriptでは、空配列に対するBoolean(a)もa.length === 0もtrueとなる。ただし、同じ結果であっても判定している内容は異なる。空かどうかを確かめる目的には、要素数を比較する式が対応する。
空のオブジェクトを判定する場合にも、オブジェクト自体の真偽に任せず、Object.keys(obj).lengthのように明示的に調べる方法がある。今回、空判定の回避策として実測したコードは、上に示したリストのlen()と配列の.lengthである。
GoとMapは今回の実測比較に含めない
Goには、PythonやJavaScriptのように値をtruthy/falsyとして扱う概念がない。if文の条件には、bool型の式を書く必要がある。
空のスライスについては、次のように長さを比較して判定する。
var s []int
if len(s) == 0 {
// 空の場合の処理
}
これはGoでの書き方を示す参考例であり、今回の実測結果ではない。PythonやJavaScriptで行った「空の値をそのまま条件に渡す」という比較には、Goを含めていない。
また、JavaScriptのMapオブジェクトについても、今回は測っていない。表にあるBoolean({})は空のオブジェクトに対する結果であり、Mapで実測した結果ではない。
今回確認した対象は、空リスト・空配列、空の辞書・空のオブジェクト、空文字列、数値の0である。要素数による空判定については、Pythonの空リストとJavaScriptの空配列を対象にした。
出典: 自社の実測(2026-10-25)。Goのコードは実測対象外の参考例。
自分の環境で確かめる手順
PythonとNode.jsを使える環境では、まず次のコマンドで版を確認する。
python3 --version
node --version
続いて、上に示したPythonとJavaScriptのコードをそれぞれ実行すると、真偽変換、if文の分岐、要素数による空判定を確認できる。比較する内容は、次の三つだ。
- 空の値を
bool()またはBoolean()に渡した結果。 - 空の値をそのまま
if文の条件にしたときの分岐。 len(a) == 0またはa.length === 0で要素数を比較した結果。
2026-10-25の実測では、JavaScriptの空配列は真、Pythonの空リストは偽だった。一方、要素数が0かを調べる式では、両言語とも空であることを判定できた。
出典: 自社の実測(2026-10-25)
実際のコードで「配列に要素が1件もなければ既定値を使う」という処理を書く場合も、この違いが関わる。data.list || DEFAULT_LISTでは、JavaScriptの空配列から既定値へ切り替わらない。空であることを条件にしたい箇所では、配列の.lengthやリストのlen()で要素数を明示的に判定する。

コメント