WebEngine

だらだらと綴る技術系メモ

今さらながら == と === の挙動の違いをチェック

そもそもコレなんて呼ぶ

PHPjavaScriptで、いつも使っているけど、何て言うのか 覚えていますか?
ネット上とかで毎回見ているけど、意外とスルーしていたりします。
正解は

うーん、会話で使うには長いんですよね。普段は、「イコール1コ抜けてるよ」 とか言っていますね。 (ごめんなさい、そんな状況あんまりなかった)

で、名前のとおり、=== の方が厳しく型をチェックしてくれます。 でも、実際にどんな動きをしているか理解しているのか、と言われたら微妙だということに 気づきました。

挙動チェック

上がjavaScript、下がPHPのコードです。

var str = "1";
var num = 1;

console.log( str == num ); // true
console.log( str === num ); // false
<?php
$str = '1';
$num = 1;

var_dump( $str == $num ); // true
var_dump( $str === $num ); // false

== は文字列を数値に変換してから比較を行います。 === は型変換を行うことなく評価を行うので、 javaScriptPHPともにfalseが返ってきていますね。この挙動を見ただけでも === を使うことの 意味が実感できると思います。

次に、Boolean(boolean)型を見てみましょう。
オペランドの片方がBooleanならば、その論理オペランドはtrueならば1に、そしてfalseならば0に変換さます。
=== ならば、もちろん厳密にチェックしてくれるのでfalseが返って来ます。

console.log( true == 1 ); // true
console.log( true === 1 ); // false
console.log( false == 0 ); // true
console.log( false === 0 ); // false
<?php
var_dump( 1 == true ); // true
var_dump( 1 === true ); // false
var_dump( 0 == false ); // true
var_dump( 0 === false ); // false


javaScriptPHPの違い

javaScriptの方は、最後の2行に注目していただければわかると思います。

console.log( undefined == null ); // true
console.log( undefined === null ); // false
console.log( undefined == "" ); // false
console.log( undefined === "" ); // false
console.log( null == "" ); // false
console.log( null === "" ); // false
<?php
var_dump( null == '' ); // true
var_dump( null === '' ); // false

PHPの方はnullが == で比較した場合、trueになっているんですね。この挙動は最新のPHP7で確認しても 変わっていませんでした。
それでも、 === で比較すれば、ちゃんとfalseが返って来てくれます。
大事なことは、なんでもかんでも === を使わずに == と === を使った場合とで、どういう挙動になるか 考えてプログラムを書くことです。