null>=0
不为 false
的扩散做为一个 javascript 老司机今日却不当心在 boolean 判断不慎掉坑了,特此记录,并扩散梳理一下知识点。javascript
今天我写了一段这样的代码java
className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }
在个人思惟模式中 当 notvisitday
和 visitday
只有有一个是数字或者数字字符串时,className
就要为 active
,出乎意料的是 className
一直为 null
。后面断点排查才发现 只要一个属性为 null
时就能够为 true
。函数
因而我在控制台打下这串代码做为验证:this
因而,我经过查阅资料加上本身的理解,有了如下判断和总结:spa
>
>=
和 ==
并非同一层次的 boolean判断,在''''进行 > >= < <=
判断是比较式两侧进行隐式转换为number类型。code
因此 null == 0
为false。对象
而 null >= 0
or null > 0
时候 null隐式转换成 Number(null)
为 0
。ip
而 Number(undefined)
和 var a={};Number(a);
则为 NaN
。字符串
此这个概念又一个大胆的想法,我又试验了it
无一例外,用 Number
方法能够强制换成0的均可以 >=0
为真。
null
/ []
均可以恰恰{}
空对象不能够转换成数字。由于 Number([])
和 Number({})
会首先调用各自的valueOf方法,若是没有获得指望值就会调用toString
方法,他们的toString方法的值分别为
"" ,
"[object Object]"`;
因此 一个为0
,一个为NaN
。
值得一提的是 array
跟 object
的 toString
结果不同是由于,Array.protptype
的 toString
覆盖了 Object.proptype
的 toString
。
若是你认为这是胡乱猜想,这里我贴上javascript高级程序的一段
Number
函数的转换规则:
若是是 Boolean
值,true 和 false 分别被转换成 1 和 0。
若是是数字值,只是简单的传入和返回。
若是是 null 值,返回 0。
若是是 undefined ,返回 NaN。
若是是字符串,遵循下列规则:
若是字符串中只包含数字(包括前面带正号或者负号的状况),则将其转化为10进制数值(注意:前导的0会被忽略)。
若是字符串中包含有效的浮点数格式,如"0.1",则将其转换为对应的浮点数值(一样忽略前导0)。
若是字符串中包含有效的十六进制格式,如"0xf",则将其转换为相同大小的十进制数值。
若是字符串是空的(不包含任何字符),则将其转换为 0;
若是字符串包含除上述格式以外的字符,则将其转换为 NaN。
若是是对象,则调用对象的valueOf()方法,而后依照前面的规则转换为返回的值。若是转换的结果是 NaN,则调用对象的 toString 方法,而后再次依照前面的规则转换为返回的字符串值。
Number
转换的规则在某些方面的确不够合理,可是JavaScript就是这样一门灵活至极的语言,咱们在书写判断式时,千万要对各类类型的隐式转换小之又当心!?,在不肯定的状况下 咱们宁肯牺牲判断式长度也不可作模凌两可的简单判断。