为什么`null> = 0 && null <= 0`但不是`null == 0`?

C. *_*Lee 135 javascript comparison null

我必须编写一个例程,如果变量的类型是number,则将变量的值增加1,如果不是,则将变量赋值给0,其中变量最初为nullundefined.

第一个实现是v >= 0 ? v += 1 : v = 0因为我认为任何不是数字都会使算术表达式为false,但是由于null >= 0被评估为true ,所以它是错误的.然后我学会了null类似于0的行为,并且以下表达式都被评估为true.

  • 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?

CMS*_*CMS 201

你真正的问题似乎是:

为什么:

null >= 0; // true
Run Code Online (Sandbox Code Playgroud)

但:

null == 0; // false
Run Code Online (Sandbox Code Playgroud)

真正发生的是,大于或等于的Operator (>=)执行类型强制(ToPrimitive),具有提示类型Number,实际上所有关系运算符都具有此行为.

nullEquals Operator(==)以特殊方式处理.在简短的,它只强制转换undefined:

null == null; // true
null == undefined; // true
Run Code Online (Sandbox Code Playgroud)

值,例如false,'','0',和[]受数字类型强制,它们都强迫到零.

您可以在抽象等式比较算法抽象关系比较算法中看到此过程的内部细节.

综上所述:

  • 关系比较:如果两个值都不是String类型,ToNumber则同时调用它们.这与+在前面添加a相同,对于null强制执行0.

  • 平等比较:只调用ToNumber字符串,数字和布尔值.

  • 很好描述,但我不喜欢它.在任何语言中(x == 0 || x> 0)都应该等于(x> = 0).javascript是一种愚蠢的语言. (6认同)
  • 这实际上只是规范中的一个错误(因为在数学上它是错误的)并且没有任何关系,因为数百万个网站依赖于空比较^^' (3认同)
  • 嗨 CMS,根据您的解释,null 原语为 0,因此 0&gt;=0 返回 true 并且 == 返回 false。返回比较结果 ToPrimitive(x) == y.then 在这个它应该返回 true.请解释我 (2认同)

est*_*ani 14

我想扩展这个问题,以进一步提高问题的可见性:

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false
Run Code Online (Sandbox Code Playgroud)

这没有任何意义.像人类语言一样,这些东西需要用心学习.

  • 如上所述,它可以解释为 == 如何处理 null,否则在所有情况下 null 都将通过使用 Number(nulll) 转换为 0 (2认同)

s.h*_*sam 10

console.log( null > 0 );  // (1) false\nconsole.log( null == 0 ); // (2) false\nconsole.log( null >= 0 ); // (3) true\n
Run Code Online (Sandbox Code Playgroud)\n\n

从数学上来说,\xe2\x80\x99 很奇怪。最后一个结果表明“null 大于或等于零”,因此在上面的比较之一中它必须为 true,但它们都是 false。

\n\n

原因是相等检查==和比较的> < >= <=工作方式不同。比较将 null 转换为数字,将其视为0。这就是为什么 (3)null >= 0true且 (1)null > 0是 的原因false

\n\n

另一方面,==定义undefined和 的相等性检查null,使得在没有任何转换的情况下,它们彼此相等,并且 don\xe2\x80\x99t 等于其他任何值。这就是为什么 (2)null == 0是 的原因false

\n


Pan*_*al. 5

JavaScript具有严格和类型转换的比较

null >= 0;是真的,但是 (null==0)||(null>0)假的

null <= 0;是真的,但是(null==0)||(null<0)假的

"" >= 0 也是如此

对于关系抽象比较(<=,> =),在进行比较之前,首先将操作数转换为基元,然后转换为相同类型。

typeof null returns "object"

当type为object时,javascript尝试对对象进行字符串化(即null),将采取以下步骤(ECMAScript 2015):

  1. 如果PreferredType未通过,则hint设为“默认”。
  2. 否则,如果PreferredTypehintString,则hint设为“ string”。
  3. 否则PreferredTypehint数字,则为hint“数字”。
  4. 我们exoticToPrimGetMethod(input, @@toPrimitive)
  5. ReturnIfAbrupt(exoticToPrim)
  6. 如果exoticToPrim不是未定义,则
    a)令结果为Call(exoticToPrim, input, «hint»)
    b)ReturnIfAbrupt(result)
    c)如果Type(result)不是Object,则返回结果。
    d)引发TypeError异常。
  7. 如果hint为“默认”,则为“ hint数字”。
  8. 返回OrdinaryToPrimitive(input,hint)

提示的允许值为“默认”,“数字”和“字符串”。日期对象在内置ECMAScript对象中是唯一的,因为它们将“默认”等同于“字符串”。 所有其他内置ECMAScript对象都将“ default”等同于“ number”。(ECMAScript 20.3.4.45

所以我认为null转换为0。