C. *_*Lee 135 javascript comparison null
我必须编写一个例程,如果变量的类型是number,则将变量的值增加1,如果不是,则将变量赋值给0,其中变量最初为null或undefined.
第一个实现是v >= 0 ? v += 1 : v = 0因为我认为任何不是数字都会使算术表达式为false,但是由于null >= 0被评估为true ,所以它是错误的.然后我学会了null类似于0的行为,并且以下表达式都被评估为true.
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1当然,null不是0. null == 0被评估为假.这使得看似同义的表达是(v >= 0 && v <= 0) === (v == 0)错误的.
为什么它null像0,虽然它实际上不是0?
CMS*_*CMS 201
你真正的问题似乎是:
为什么:
null >= 0; // true
但:
null == 0; // false
真正发生的是,大于或等于的Operator   (>=)执行类型强制(ToPrimitive),具有提示类型Number,实际上所有关系运算符都具有此行为.
null由Equals Operator(==)以特殊方式处理.在简短的,它只强制转换到undefined:
null == null; // true
null == undefined; // true
值,例如false,'','0',和[]受数字类型强制,它们都强迫到零.
您可以在抽象等式比较算法和抽象关系比较算法中看到此过程的内部细节.
综上所述:
关系比较:如果两个值都不是String类型,ToNumber则同时调用它们.这与+在前面添加a相同,对于null强制执行0.
平等比较:只调用ToNumber字符串,数字和布尔值.
est*_*ani 14
我想扩展这个问题,以进一步提高问题的可见性:
null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false
这没有任何意义.像人类语言一样,这些东西需要用心学习.
s.h*_*sam 10
console.log( null > 0 );  // (1) false\nconsole.log( null == 0 ); // (2) false\nconsole.log( null >= 0 ); // (3) true\n从数学上来说,\xe2\x80\x99 很奇怪。最后一个结果表明“null 大于或等于零”,因此在上面的比较之一中它必须为 true,但它们都是 false。
\n\n原因是相等检查==和比较的> < >= <=工作方式不同。比较将 null 转换为数字,将其视为0。这就是为什么 (3)null >= 0是true且 (1)null > 0是 的原因false。
另一方面,==定义undefined和 的相等性检查null,使得在没有任何转换的情况下,它们彼此相等,并且 don\xe2\x80\x99t 等于其他任何值。这就是为什么 (2)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):
PreferredType未通过,则hint设为“默认”。PreferredType为hintString,则hint设为“ string”。PreferredType为hint数字,则为hint“数字”。exoticToPrim是GetMethod(input, @@toPrimitive)。ReturnIfAbrupt(exoticToPrim)。 exoticToPrim不是未定义,则Call(exoticToPrim, input, «hint»)。ReturnIfAbrupt(result)。Type(result)不是Object,则返回结果。hint为“默认”,则为“ hint数字”。OrdinaryToPrimitive(input,hint)。提示的允许值为“默认”,“数字”和“字符串”。日期对象在内置ECMAScript对象中是唯一的,因为它们将“默认”等同于“字符串”。 所有其他内置ECMAScript对象都将“ default”等同于“ number”。(ECMAScript 20.3.4.45)
所以我认为null转换为0。
| 归档时间: | 
 | 
| 查看次数: | 43287 次 | 
| 最近记录: |