javascript 空配列はPythonと真偽が逆になる?

要点

  • 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()で要素数を明示的に判定する。

コメント

タイトルとURLをコピーしました