主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScript: 型をちょっとは気にする

                
tags: JavaScript
 一般的には(JavaScriptを作ったCrockfordさん、JsLint、その他のブログなどなど)では厳密等価演算子の仕様が推奨されている。けど個人的に思うところを。

 JavaScriptは動的型付けの言語であり、CやC#ほどには型を意識する必要はない。型の異なる値の演算も勝手に整合を取って実行してくれるようになっているから、ますます型を意識する必要は少なくなっている。数値を文字列にして結合したいときも、型変換を書かずともやってくれる。便利。
"Hail " + 2 + " U!"; // "Hail 2 U!"


 JavaScriptを好まないという意見の中に、”==”を使った等価比較があいまいというものがある。そこで目にしたのが下記。
0 == "0"; // true
0 == ""; // true

型が違うのに等価判定がでている。だから”===”を使って等価比較をしろ、でもいちいち”===”を使うのは面倒で、”==”を使いたいと書かれている。
 一見するとこの等価判定はおかしいかもしれない。だがそもそも型が違う値を比較するのはどうなんだろう。上記のようなことをCやC#でやろうとするとエラーが出るはずだ。C#で確認したところ、「整数型と文字列型で等価比較すんな」というコンパイルエラーが出た。
 最初に文字列と数値の結合で触れたとおり、JavaScriptでは異なる型の値に演算を適用すると、勝手に型変換をして、型の整合を取って演算をしてくれる。今回の等価判定を検証する。式の左辺が0でNumber型なので右辺をそれに合わせてNumber()でキャストしてみる。Number("0")もNumber("")も数値0を返した。この結果から、異なる型同士の演算においては暗黙の型変換をしているJavaScriptでは、型が異なる等価比較演算でも値次第で等価判定が返ってくるケースがあるのは妥当だと考えられる。
 そもそもは異なる型の値を比較することが基本的には悪手なんじゃないだろか。JavaScriptでは文字列型と数値型の各種演算(比較、結合など)ができるようになっているが、あくまで異なる型を暗黙の型変換で同一の型にそろえたうえでそれらを行っている。本来は異なる型の値は比較しようがない。他言語でも通じるお堅いマナーに従うなら、比較も同一型の値でおこなうべきかと思う。同一型なら等価演算子”==”で十分に足りるだろう。
 それでも型が違うかもしれない値の等価比較をしたければ、それがnullやundefinedでなければたいていは特殊なケースなはずだからJavaScriptの仕様通り”===”を使えばいいんじゃないだろか。これを使っていれば、「ああ、この等価比較は異なる型の値の比較になっているかもしれないな」と一目でわかる。CやC#と比べると、型と値を同時に等価比較をしてくれる厳密等価演算子”===”は便利なところがある。


 ある動的型付け言語を学んでいるとき、変数の型チェックはしなくていいのかと気にしたことがあった。動的型付けだからって、ほいほい一つの変数の型を変えていいのかとか。でstackoverflowでその疑問に対する高評価の回答を見つけたが、そんなことはパフォーマンスを落とすだけでやる必要がないと書かれていた。ただしその続きに、「どの型の変数が来るかわかっていないなら、それは設計の段階で誤ったプログラミングをしている」と書かれていた。動的言語だからって、あまりに型を気にせずに奔放にやるとまともに動かなくなっていく。型を気にしてプログラミングをしていればその点でバグが入ることは防げるし、他の言語を使う必要に迫られたときも学習がちょっとは楽になるもので損するようなことではないだろう。


****************「厳密等価演算子”===”のほうがパフォーマンスいいからつねに厳密等価演算子を使っておけ」
 パフォーマンスからも厳密等価演算子を使わない理由はないと書いているところも結構ある。が、型をそろえている限りは等価演算子と厳密等価演算子のあいだでパフォーマンスを気にするほどの差は出ない。出てくる微々たる差は等価演算子のほうが優っているという結果を示すし。
http://jsperf.com/triple-equals-vs-twice-equals
 さらに言えば等価比較一回当たりで差が出たとしてもナノ秒からマイクロ秒程度の桁の差だ。パフォーマンスだけで考えると、積極的に厳密等価演算子を使おうとするほどの差は生まれない。ただ色々なところでのコーディング規約で厳密等価演算子を使えとなっているので、それに従う意味で厳密等価演算子を使った方がいいだろう。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。