59

Google Chromeコンソールから:

var x = null;
undefined
x > 0
false
x < 0
false
x > -1
true
x < 1
true
x == 1
false
x === 1
false
4

2 に答える 2

86

null と 0 を比較すると、結果は false になります。数値コンテキストで解釈されることを強制nullすると、0 のように扱われ、結果は true になります。

前に置くか、 、 、 、 などの数値演算子を使用して、強制的に数値にすることができ+ます。とがどちらも真であることに注意してください。<<=>>=null >= 0null <= 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 < yx と y が値である比較では、 truefalse、またはundefinedが生成されます(これは、少なくとも 1 つのオペランドがNaNであることを示します)。このような比較は、次のように実行されます。

  1. ToPrimitive(x, ヒント番号) を呼び出します。

  2. ToPrimitive(y, ヒント番号) を呼び出します。

  3. Type(Result(1)) が String で Type(Result(2)) が String の場合は、手順 16 に進みます。 (この手順は、or の代わりに and を使用する点で、加算演算子 + のアルゴリズムが手順 7 と異なることに注意してください。 )

  4. ToNumber(Result(1)) を呼び出します。

  5. 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 == 0true であるため、比較は成功します。

  • の場合null == 0、Type(x) は Null です。どの型チェックも一致しないため、比較はステップ 22 に進み、false が返されます。比較は失敗します。

于 2012-11-15T22:45:58.857 に答える
13

null は数値として 0 にキャストします: (+null)is 0. > および < は null をこの値にキャストするため、数値と比較するとゼロとして機能します。==null を数値にキャストしないため、null == 0false です。

于 2012-11-15T22:46:51.007 に答える