PythonとJSのinの違いにつまづいた話
背景
以前私は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にも適用できます。
Discussion