javascriptとPHPを使用してWEBサイトやサービスを作っている人は、どちらの言語でもif文の判定で"=="と"==="が使える事を知っていると思います。
値を比較して同じ値かどうかを判定するこの記号は「演算子」と呼ばれ、
"=="は「等価演算子」
"==="は「厳密等価演算子」
という名称なのだそうです。
厳密って何が厳密なのかというと、比較する変数の「型」を比較対象にするかどうかがポイントのようです。
使い分けよう"=="と"==="
基本的にjavascriptもPHPも型をそこまで意識しなくても有る程度のプログラムを組み上げる事ができます。
僕は個人的に、「型にゆるい言語」として勉強会などで説明するのですが、型を意識しないととんでもない不具合が生まれたりもするので、しっかり理解する必要があります。
var num = 0;
var str = "0";
console.log(num == str);
-> true
console.log(num === str);
-> false
上記は基本的な"=="と"==="の違いを表したサンプルプログラムですが、数値型と文字列型の違いを判定しているのがわかります。
普通にプログラミングをしていると、数値型と文字列型って勝手には切り替わらないはずですが、javascriptもphpも、それぞれ数値を使っているはずが、文字列になっているというケースが存在します。
Javascriptであれば、ページ内の数字が書かれている要素を取得した時に、
var num = document.getElementById("hoge").contentText;
というように書くと、numには文字列型で数値が入ります。
これを整数化するには、下記の方法で文字列から数値に型変換する事ができます。
num = Number(num);
num = parseInt(num , 10);
ちなみに、PHPは、file_get_contents()などで数値の書かれたファイルを読み込んだ時に、文字列型として読み込みます。
キチンと数値に型変換して利用しましょう。
どっちの処理速度が早いの?
以前所属していた開発チームで、部下からこんな質問をもらいました。
"=="と"==="を速度比較した事がなかったので、単純に"=="の方が"==="よりも、記述バイト数が少ないから・・・という理由だけで"=="の方が速度優位なのかと考えていたら、結果は逆でした。
やって見た方が分かりやすいので、下記のようなプログラムを書いて実験。
var sample = 0;
var num = 1;
var str = "1";
// 比較-1
// 数値 == 数値
var start_time1 = (+new Date());
for(var i=0; i<1000000; i++){
if(1 == num){sample++;}
}
console.log((+new Date()) - start_time1);
// 数値 === 数値
var start_time2 = (+new Date());
for(var i=0; i<1000000; i++){
if(1 === num){sample++;}
}
console.log((+new Date()) - start_time2);
// 比較-2
// 文字列 == 数値
var start_time1 = (+new Date());
for(var i=0; i<1000000; i++){
if("1" == num){sample++;}
}
console.log((+new Date()) - start_time1);
// 文字列 === 数値
var start_time2 = (+new Date());
for(var i=0; i<1000000; i++){
if("1" === num){sample++;}
}
console.log((+new Date()) - start_time2);
// 比較-3
// 数値 == 文字列
var start_time1 = (+new Date());
for(var i=0; i<1000000; i++){
if(1 == str){sample++;}
}
console.log((+new Date()) - start_time1);
// 数値 === 文字列
var start_time2 = (+new Date());
for(var i=0; i<1000000; i++){
if(1 === str){sample++;}
}
console.log((+new Date()) - start_time2);
// 比較-4
// 文字列 == 文字列
var start_time1 = (+new Date());
for(var i=0; i<1000000; i++){
if("1" == str){sample++;}
}
console.log((+new Date()) - start_time1);
// 文字列 === 文字列
var start_time2 = (+new Date());
for(var i=0; i<1000000; i++){
if("1" === str){sample++;}
}
console.log((+new Date()) - start_time2);
上記の実行結果は以下の通りです。
※型の違いも比較して見ました。
// 数値 === 数値
10 // ==
8 // ===
// 数値 === 文字列
16 // ==
7 // ===
// 文字列 === 数値
15 // ==
6 // ===
// 文字列 === 文字列
6 // ==
6 // ===
上記の結果から、"=="よりも、"==="の方が実行時間が早い事が分かります。
これは、"=="を行った時に型変換を処理せずに、相互に型を整える作業がシステム側で行われている為、その分の処理が遅延するという原因によるものでしょう。
この結果を元に考えると、"==="を常に使うという考えの方が、処理速度も早く、厳密に処理してくれることから、"=="は使わない方が懸命でしょうね。
ちなみに、計測はミリ秒での計測値なので、微量なのですが、チリツモで考えると、大きなプログラムで繰り返しが大きい場合などは、秒単位で処理結果が変わってくるかもしれませんね。
よくみると、数値と文字列の混在は一番スコアが悪く、数値だけよりも文字列だけの方がスコアが良いようですね。
この辺も、プログラムの処理速度向上のヒントになりそうですね。
0 件のコメント:
コメントを投稿