我必须编写一个例程,如果变量的类型为number,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为null或undefined。
number
null
undefined
第一个实现是v >= 0 ? v += 1 : v = 0因为我认为没有数字会使算术表达式为假,但是由于null >= 0计算为真,所以这是错误的。然后,我得知null行为类似于0,并且以下表达式均被评估为true。
v >= 0 ? v += 1 : v = 0
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被评估为false。这使看似重言式的表达成为(v >= 0 && v <= 0) === (v == 0)错误。
null == 0
(v >= 0 && v <= 0) === (v == 0)
为什么null实际上不是0,却像0?
您真正的问题似乎是:
为什么:
null >= 0; // true
但:
null == 0; // false
真正发生的是 大于等于运算符(>=)执行类型强制(ToPrimitive),提示类型为Number,实际上所有关系运算符都具有这种行为。
>=
ToPrimitive
Number
null 等于运算符 (==)以特殊方式处理。在简短的,它只 强制转换 到undefined:
==
null == null; // true null == undefined; // true
值,例如false,'','0',和[]被受数字类型强制,它们都强迫到零。
false
''
'0'
[]
您可以在“抽象相等比较算法”和“抽象关系比较算法”中查看此过程的内部细节。
综上所述:
关系比较:如果两个值都不是String类型,ToNumber则在两个值上都调用。这与+在前面添加a相同,后者将null强制转换为0。
ToNumber
+
0
平等比较:仅调用ToNumber字符串,数字和布尔值。