我必须编写一个例程,如果变量的类型为number
,则将变量的值加1,否则将变量的值赋为0,其中变量的初始值为null
或undefined
。
第一个实现是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):
- 如果
PreferredType
没有通过,让hint
设为“默认”。 - 否则,如果
PreferredType
是hint
String,让hint
设为“ string”。 - 否则
PreferredType
为hint
数字,则为hint
“数字”。 - 我们
exoticToPrim
是GetMethod(input, @@toPrimitive)
。 ReturnIfAbrupt(exoticToPrim)
。- 如果
exoticToPrim
不是未定义,则
a)令结果为Call(exoticToPrim, input, «hint»)
。
b)ReturnIfAbrupt(result)
。
c)如果Type(result)
不是Object,则返回结果。
d)引发TypeError异常。 - 如果
hint
为“默认”,则为“hint
数字”。 - 返回
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 >= 0
是true
和(1)null > 0
是的原因false
。
在另一方面,平等检查==
为undefined
和null
定义,使得没有任何转换,他们相等,并不等于别的。这就是为什么(2)null == 0
是false
。
文章标签:comparison , equality , javascript , null
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!