🐬

PythonとJSのinの違いにつまづいた話

2023/06/17に公開

背景

以前私はPythonを数年業務で使っているのですが、
最近転職によりJavaScriptをメインで仕事をするようになりました。

今回遭遇したミスはJavaScriptをしっかり勉強した方にとってはおそらくとても初歩的なものなのですが、
最初のプログラミング言語にPythonを選んだ方なら、つまづく可能性がある話だと思います。
個人的な能力にもよるのですが、私の場合原因究明までに数十分の時間を溶かしてしまったので、
記事にして共有させていただくことにしました。

現象

まず、Pythonでは、ある配列の中に特定の値があるかどうかを確認するために、変数名 in  配列名 といった書き方を用います。たとえば下記のような書き方です。

a = [1, 3, 5]
b = 5
print(b in a)

>>> True

当たり前ですが、この出力はTrueを返します。

さて、JavaScriptの予約後にinがあるのを知っていた私は、
jsの配列に特定の値があるかを判定するために、
なんの疑いもなく同様の書き方でコードを書いてしまいました。

const a = [1, 3, 5]
const b = 5
console.log(b in a)

>>> False

するとどうでしょう!!
配列の中に5という値があるにもかかわらず、
b in a の結果はFalseを返します。

in句の意味の違い

pythonの in を配列に用いた場合、
「値」が配列に存在するかを判定します。

一方で、jsの in を配列に用いた場合、
「index」が配列に存在するかを判定します。

つまり先ほどのjsの例ですと、
b = 5 という5番目のindexが、aという配列に存在するかという判定をしていることになります。

配列aの長さは3なので、indexのmaxは2であり、5番目のindexが存在していないことから、
Falseが返ってきたということになります。

そもそもjsのin句はObjectに対して適用し、
Object内に特定のkeyが存在するかを判定します。
配列のkeyはindexと捉えることができるため、
配列に適用するとこのような挙動になるのです。

ちなみに、Pythonでもdictに対してinを適用すると、
dictの中にkeyがあるかどうかを判定してくれます。

まとめ

最後に、PythonとJavaScriptでinの挙動の違いをまとめておきます。

ObjectType Pytohn JavaScript
Dict / Object keyの存在判定 keyの存在判定
List / Array 値の存在判定 index(key)の存在判定

※ ご存知の通り、pythonのinはstrやtupleにも適用できます。

GitHubで編集を提案

Discussion