◯ PHP
<?php
var_dump(gettype(0));
var_dump(gettype(0.0));
var_dump(0 == 0);
var_dump(0 === 0.0);
string(7) "integer"
string(6) "double"
bool(true)
bool(false)
int と float (double) が別の型
型が違うから === だと false
◯ Python
他の言語も
> type(0)
<class 'int'>
> type(0.0)
<class 'float'>
> 0 == 0.0
True
> 0 is 0.0
False
Python でも == は同じで is になると False
is は型を見てるわけじゃなくてオブジェクトの参照比較
0 と 0.0 は別のオブジェクトになってるってこと
◯ Ruby
0.class
=> Integer
0.0.class
=> Float
0 == 0.0
=> true
0 === 0.0
=> true
0.eql?(0.0)
=> false
0.equal?(0.0)
=> false
Ruby は === でも true だったけど eql? と equal? メソッドでも比較ができて
こっちは厳密に比較されるようで false
◯ JavaScript
> typeof 0
'number'
> typeof 0.0
'number'
> 0 == 0.0
true
> 0 === 0.0
true
JavaScript は全部 number 型で float 型とかないので 型比較も行う === を使っても true
見分けるのは不可能
これも true ⇩
new Uint8Array(1)[0] === new Float32Array(1)[0]
// true
JavaScript に慣れてるせいで PHP のに驚いたけど number がまとまってるのは少ないし false になるほうが普通なのかな
だけど値比較なら true になるべきだし int と float で同じ値でも型が違うだけで false になるほうが不便そう
== 使えばいいといえばいいんだけど 文字列とかでも変換されて比較されるから予想外なものでも一致しそう
キャストして === がたぶんベストなんだろうけど 数値比較のためだけに毎回キャストするのもなぁ