既知な話題になりますが、ワタクシ的に確認したかったので。
よく知られている以下の比較結果。
'' == '0' //false 0 == '' // true 0 == '0' //true false == 'false' // false false == '0' //true false == undefind //false false == null // false null == undefind //true " \t\r\n " == 0 //true
どれも確かにおかしな結果なのですが、この中で最もおかしいと感じるのが、この三つの関係。
0 == '' // true 0 == '0' //true '' == '0' //false
百歩譲って「0 == ''」と「0 == '0'」がtrueを返すなら「'' == '0'」はfalse返しちゃダメでしょ?
矛盾しちゃってる(-_-;)
その逆の例として以下の三つ。
[] == '' //true [] == 0 //true 0 == '' // true確かにこれら三つの結果が全てtrueになるのは確かにヘンだが、この三つの関係においての矛盾は生じていない。
「0 == '0'」は、もし「+'0' == 0」ならば、'0'をnumberにキャストして比較しているので理解できる。
stringとnumberの比較の場合、内部でどちらかをキャストして勝手に型を合わせているとしか考えられないが、もしそうなら勝手にそんなことをする仕様(?)ってどうなの?みたいな話しで。実際のことはワカリマセンσ(^◇^;)
「0 == false」、「'' == false」、「'0' == false」の結果がtrueであることから、それぞれ(0, '0', '')を互いに比較した場合、trueを返すのが妥当、つまり「'' == '0'」はtrueとなるべきって発想になるでしょ?
でも、「'' == '0'」がfalseを返すのは正しいと考えるのが妥当で、「0 == ''」と「0 == '0'」がtrueを返すから矛盾が生じる。
やっぱり「0 == ''」と「0 == '0'」がtureを返すのは許せな~い!! オリャ(ノ-o-)ノ ┫
と、言ったところでどうなるワケでもないのだけれど。
このような問題があることから、Javascriptでは「 === を使え」と言われるのは理解できる。
しかし、
Object.prototype.toString.call(obj) === '[object Array]'とか
typeof obj === 'function'こんなのは過剰じゃないですかね?
そんなに戻り値が信用出来ないの?みたいなw
石橋を叩き過ぎて叩き壊しそうw
0 Comments:
コメントを投稿