プログラム初心者の人から質問をもらいました。
「JavascriptやPHPで"=="と"==="の違いを明確に知りたい」
dotinstallを見て勉強していたところ、各所でこの記述が出てくるが、動画でされる説明は、
「"=="は簡単な比較判定で"==="は厳密な判定」
という説明だったが、「厳密な判定って何??????????」という疑問で先に進めなくなったとの事。
そらそーですよね。
今回の記事はプログラム初心者向けに書いているので、知っている人は読むだけ時間の無駄かもしれません。
厳密な判定の招待
"==" : 型は関係なく、内容を比較判定する。
1 == 1 => true
"1" == 1 => true
"01" == 1 => true
"1" == "01" => false
"===" : 型も含めて、比較判定する
1 === 1 => true
"1" === 1 => false
"01" === 1 => false
"1" === "01" => false
要するに型も含めた比較判定をするかどうかの差なんですが、同じ様な感覚で書くと結果が全く変わる場合があるので、内容を知らなければとんでもないしっぺ返しをくらうのである。
どちらを使えばいいか?
何故2種類の比較演算子が存在するのかというと、そもそもJavascriptやPHPなどのインタプリタ型のスクリプト言語はプログラミングを簡易にするために、型を意識ぜずに使えるプログラム言語として成り立ってきていた事を知らなければいけません。
変数を型宣言せずに利用できる言語では、便利に使える反面、厳密な判定に欠ける事からこうした機能が追加されてきた歴史があります。
例えば、PHPで入力して送信されてきたPOSTデータを、数値で判定したい場合、「POST,GET,REQUEST」の環境変数に入ってくるのは数字であっても文字列型になってしまうので、受信した際に型変換する処理をお作法としてしなければいけないのですが、それを便利にするために"=="が存在すると言う程度にわかって入ればいいでしょう。
基本的には"==="記述で行う事で、厳密なプログラムとして成り立つはずなので、こうしたスクリプト言語であっても型を意識したコードを書く事が重要としてプログラミングするのがいいと思います。
ただし、明らかに簡易に書く場合は、そこまで意識しなくてもいいのですが、上記の様な詳細を知っていて簡易に書くほうがより不具合を無くせます。
プログラム初心者の人は、こうした「何故???」に関してWEB検索するのも一苦労なのはよくわかりますが、型の感覚を身につけるにはやはり「C言語」を覚えるのがいいと思いますね。
実は大きく違う処理速度
"=="と"==="はどっちが処理が早いのか?
以前、プログラム初心者にこうした質問をされた事があり、調べて見たところびっくりする結果だったので、その内容を書いておきます。
比較演算を1000万回ぐらいのループで行う場合、どちらのスピードが早くなるのかをプログラムを書いて実験してみた。
var start = (+new Date());
var a = 0;
for(var i=0; i<10000000; i++){
if("1" == 1){
a+=i;
}
else{
a+=i;
}
}
console.log((+new Date()) - start +" : "+ a);
var start = (+new Date());
var a = 0;
for(var i=0; i<10000000; i++){
if("1" === 1){
a+=i;
}
else{
a+=i;
}
}
console.log((+new Date()) - start +" : "+ a);
それぞれ10回ずつ実行した結果は以下の通りです。
num : "==" | "==="
1 : 383 | 324
2 : 397 | 321
3 : 384 | 334
4 : 388 | 326
5 : 379 | 328
6 : 379 | 328
7 : 382 | 319
8 : 387 | 315
9 : 384 | 325
10 : 388 | 323
まず考えたのは、"=="のほうが"==="よりも1バイト少ないから、その分処理速度が早いのでは無いかと考えて見たが結果は逆でした。
おそらく"=="の処理は、一度左右の比較対象の型を比べて同じ型に揃えるという処理が入り、"==="はそうした処理を省いているので、若干早くなるのだと思われます。
膨大な回数の繰り返し処理などで、こうした手法で処理軽減する事ができますね。
下記のリファレンスページにもっと詳しい比較サンプルが載っているので参考にしてみてください。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Comparison_Operators
ちなみに、どっかのページに書いてましたが、javascriptのswitch文は、"==="判定がされているようですよ。
参考にどうぞ。
0 件のコメント:
コメントを投稿