Google Chromeコンソールから:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
Google Chromeコンソールから:
var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
null と 0 を比較すると、結果は false になります。数値コンテキストで解釈されることを強制null
すると、0 のように扱われ、結果は true になります。
前に置くか、 、 、 、 などの数値演算子を使用して、強制的に数値にすることができ+
ます。とがどちらも真であることに注意してください。<
<=
>
>=
null >= 0
null <= 0
> null == 0
false
> +null == 0
true
> null >= 0
true
> null <= 0
true
ECMAScript 言語仕様では、いわゆる「ToNumber」変換がいつ実行されるかが定義されています。その場合、null と false は両方とも 0 に変換されます。
§9.1 型変換とテスト:
表 14 — 数値への変換
引数の型 結果 ------------- ------ 未定義のリターン NaN ヌル リターン +0 Boolean 引数が true の場合は 1 を返します。引数が false の場合は +0 を返します。 Number 戻り引数 (変換なし)。 文字列 以下の文法と注意を参照してください。
ToNumber 変換がいつ適用されるかは、対象の演算子によって異なります。関係演算子<
、<=
、>
、 については、次を>=
参照してください。
§11.8.5 抽象リレーショナル比較アルゴリズム:
x < y
x と y が値である比較では、 true、false、またはundefinedが生成されます(これは、少なくとも 1 つのオペランドがNaNであることを示します)。このような比較は、次のように実行されます。
ToPrimitive(x, ヒント番号) を呼び出します。
ToPrimitive(y, ヒント番号) を呼び出します。
Type(Result(1)) が String で Type(Result(2)) が String の場合は、手順 16 に進みます。 (この手順は、or の代わりに and を使用する点で、加算演算子 + のアルゴリズムが手順 7 と異なることに注意してください。 )
ToNumber(Result(1)) を呼び出します。
ToNumber(Result(2)) を呼び出します。
==
オペレーターが違います。その型変換を以下に説明します。null と false が異なるルールに従っていることに注意してください。
§11.9.3 抽象等価比較アルゴリズム
x と y が値である比較 x == y は、trueまたは falseを生成します。このような比較は、次のように実行されます。
1. Type(x) が Type(y) と異なる場合は、手順 14 に進みます。
...
14. x がnullで y が未定義の場合、 trueを返します。
15. x が未定義で y がnullの場合、 trueを返します。
16. Type(x) が Number で Type(y) が String の場合、比較 x == ToNumber(y) の結果を返します。
17. Type(x) が String で Type(y) が Number の場合、比較 ToNumber(x) == y の結果を返します。
18. Type(x) が Boolean の場合、比較 ToNumber(x) == y の結果を返します。
19. Type(y) が Boolean の場合、比較 x == ToNumber(y) の結果を返します。
20. Type(x) が String または Number で、Type(y) が Object の場合、比較 x == ToPrimitive(y) の結果を返します。
21. Type(x) が Object で Type(y) が String または Number の場合、比較 ToPrimitive(x) == y の結果を返します。
22. falseを返します。
注意深く読めば、false == 0
が真でnull == 0
あるのに偽である理由がわかります。
の場合false == 0
、Type(x) はブール値です。これは、手順 18 の型変換が適用され、false が数値に変換されることを意味します。ToNumber(false) は 0 で0 == 0
true であるため、比較は成功します。
の場合null == 0
、Type(x) は Null です。どの型チェックも一致しないため、比較はステップ 22 に進み、false が返されます。比較は失敗します。
null は数値として 0 にキャストします: (+null)
is 0. > および < は null をこの値にキャストするため、数値と比較するとゼロとして機能します。==
null を数値にキャストしないため、null == 0
false です。