FC2ブログ

JavaScriptの比較演算子について

久しぶりにJavaScript(JS)を書いたのですが、この比較演算子(==)の寛大さを知る上でちょっと面白いことがありました。。

まず、JSでは、
'123'==123
や、
'0123'==123
が、trueになるのは、PHPとかでもそうですので、注意が必要なものの便利なこともあるので、まあいいかなと思います。

ところが、偶然、JSでは、123==[123]も、trueになる?ことに気づきました。。

つまり、「ある値v」と、「その同じ値vを唯一の要素として持つ1次元配列」とを、==で比較すると、trueになるようなのです。。

JS久しぶりなので寝ぼけているのかなと思いまして、ちょっと丁寧に、

var x=new Array();
x[0]=123;
var y=123;
if (x==y){
   alert('true');
}else{
   alert('false');
}

とかしてみたのですが、これも'true'と表示されました。。(IE6、FireFox)

それならばと、すっかり調子に乗って、最初に書きました、「数値 vs 数値文字列比較」との複合版として、
alert(123==['0123']);
もしてみましたが、これもtrueの表示。。

でも、うーむ・・・この記事はあまり深追いや下調べせずに書きましたので、もしかしたら、これはごく常識的なことなのかもしれませんし、私はまだなんか勘違いをしてるのかもしれません(笑)。(そのときはそっと教えてください。^^;)

でも、もし上記のテストが正しいとすると、123も[123]も、ある意味スカラーだから==では同じにしようというJSの仕様なのかなあ。。

最近、型付けが厳格な言語でプログラムを書くことが多いので、この妙なユルさ?はちょっとした衝撃でした。

もっとも、厳格なのが好きなら素直に===を使えば良いのですよね・・・。(^^;)

コメント

No title

いやー何言ってるのかさっぱりわかりませんねぇv-12
Java勉強するとか言ってたのはなんだったんでしょうねぇ。

No title

>===
 って、え~!
 こんなのが有るんですか~!
 しかしとんでもない言語ですね。
 Cのstrcspnあたりが我慢の限界なんで、「alert(123==['0123']);」こう言うのも耐えらんねっす。
 まさか「====」とか「=====」とかは無いんですよね(^^;

No title

>山地さん

Javaは良いと思いますよ~。(^^)
ちなみに、Javaの==演算子に上記のような
比較(数値と配列)をやらせたらたぶん即座にfalseでしょうね。。(^^;;;)

>Mooさん

===でやっと、上記例はfalseになるようです。。

=====や=====は(たぶん)ないと思いますが、!==はあります(^^;;;)

>Cのstrcspnあたりが我慢の限界

JSでは配列のインデックス超過が
許される(undefinedが返ってくる)とかも・・・。
(((゚д゚)))ガクガグブルブル・・・。(^^;)

コメントの投稿

トラックバック


この記事にトラックバックする(FC2ブログユーザー)