1. ホーム
  2. javascript

[解決済み] なぜ `null >= 0 && null <= 0` ではなく `null == 0` なのですか?

2022-04-26 17:11:54

質問

ある変数の型が以下の場合、その値を1だけ増加させるルーチンを書かなければなりませんでした。 number で、そうでない場合は 0 を代入する。ここで、変数は初期状態で null または undefined .

最初の実装は v >= 0 ? v += 1 : v = 0 というのは、数字でないものは算術式を偽にすると思ったからですが、それは間違いでした。 null >= 0 はtrueと評価される。そこで、私は null は0と同じように振る舞い、以下の式はすべて真と評価されます。

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1 / null === Infinity
  • Math.pow(42, null) === 1

もちろんです。 null は0ではありません。 null == 0 は偽と評価されます。このため、一見トートロジーに見える式である (v >= 0 && v <= 0) === (v == 0) を偽る。

なぜ null は0ではありませんが、0と同じですか?

どのように解決するのですか?

というのが本当のご質問のようです。

なぜだ。

null >= 0; // true

でも

null == 0; // false

実際に起こるのは 大なり小なり演算子 ( >= )、型強制( ToPrimitive ) を使って ヒント タイプ Number しかし、実際にはすべての関係演算子がこのような動作をします。

null は特別な方法で扱われます。 イコール演算子 ( == ). ブリーフの中では、ただ 強要 になります。 undefined :

null == null; // true
null == undefined; // true

のような値です。 false , '' , '0' および [] が数値型強制の対象となる場合、すべて0に強制される。

この処理の内部詳細については 抽象的な等価比較のアルゴリズム 抽象的な関係比較のアルゴリズム .

まとめると

  • 関係比較:両方の値がString型でない場合。 ToNumber が両方に対して呼び出されます。これは + を前に置くと、NULLの場合、それは 0 .

  • 等価比較:呼び出しのみ ToNumber 文字列、数値、ブール値の場合。