为什么“ null> = 0 && null <= 0”而不是“ null == 0”?

2020/11/15 22:22 · javascript ·  · 0评论

我必须编写一个例程,如果变量的类型为number则将变量的值加1,否则将变量的值赋为0,其中变量的初始值为nullundefined

第一个实现是v >= 0 ? v += 1 : v = 0因为我认为没有数字会使算术表达式为假,但是由于null >= 0计算为真,所以这是错误的然后,我得知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被评估为false。这使看似重言式的表达成为(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',和[]被受数字类型强制,它们都强迫到零。

您可以在“抽象相等比较算法”“抽象关系比较算法”中查看此过程的内部细节

综上所述:

  • 关系比较:如果两个值都不是String类型,ToNumber则在两个上都调用。这与+在前面添加a相同,前者将null强制转换为0

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

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

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

只是没有意义。像人类语言一样,这些事情也需要牢记。

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。

我有同样的问题 !!。目前,我唯一的解决方案是分开。

var a = null;
var b = undefined;

if (a===0||a>0){ } //return false  !work!
if (b===0||b>0){ } //return false  !work!

//but 
if (a>=0){ } //return true !
console.log( null > 0 );  // (1) false
console.log( null == 0 ); // (2) false
console.log( null >= 0 ); // (3) true

从数学上来说,这很奇怪。最后一个结果指出“ null大于或等于零”,因此在上面的比较之一中,它必须为true,但都为false。

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

在另一方面,平等检查==undefinednull定义,使得没有任何转换,他们相等,并不等于别的。这就是为什么(2)null == 0false

本文地址:http://javascript.askforanswer.com/weishenme-null-0-null.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!