资讯专栏INFORMATION COLUMN

一个 null>=0 不为 false 的扩散

Michael_Lin / 2725人阅读

摘要:一个不为的扩散作为一个老司机今日却不小心在判断不慎掉坑了,特此记录,并扩散梳理一下知识点。后面断点排查才发现只要一个属性为时就可以为。值得一提的是跟的结果不一样是因为,的覆盖了的。

一个 null>=0 不为 false 的扩散

作为一个 javascript 老司机今日却不小心在 boolean 判断不慎掉坑了,特此记录,并扩散梳理一下知识点。

今天我写了一段这样的代码

className={this.props.notvisitday >= 0 || this.props.visitday >=0 ? null : "active" }

在我的思维模式中 当 notvisitdayvisitday 只有有一个是数字或者数字字符串时,className 就要为 active,出乎意料的是 className 一直为 null。后面断点排查才发现 只要一个属性为 null 时就可以为 true

于是我在控制台打下这串代码作为验证:

于是,我通过查阅资料加上自己的理解,有了以下判断和总结:

> >=== 并不是同一层次的 boolean判断,在""""进行 > >= < <=判断是比较式两侧进行隐式转换为number类型。

所以 null == 0 为false。

null >= 0 or null > 0 时候 null隐式转换成 Number(null)0

Number(undefined)var a={};Number(a); 则为 NaN

此这个概念又一个大胆的想法,我又试验了

无一例外,用 Number方法可以强制换成0的都可以 >=0为真。

!!?但是,为什么连null / []都可以偏偏{}空对象不可以转换成数字。

因为 Number([])Number({}) 会首先调用各自的valueOf方法,如果没有得到期望值就会调用toString方法,他们的toString方法的值分别为 """[object Object]"`;
所以 一个为0,一个为NaN

值得一提的是 arrayobjecttoString 结果不一样是因为,Array.protptypetoString 覆盖了 Object.proptypetoString

如果你认为这是胡乱猜测,这里我贴上javascript高级程序的一段Number函数的转换规则:

如果是 Boolean 值,true 和 false 分别被转换成 1 和 0。

如果是数字值,只是简单的传入和返回。

如果是 null 值,返回 0。

如果是 undefined ,返回 NaN。

如果是字符串,遵循下列规则:

如果字符串中只包含数字(包括前面带正号或者负号的情况),则将其转化为10进制数值(注意:前导的0会被忽略)。

如果字符串中包含有效的浮点数格式,如"0.1",则将其转换为对应的浮点数值(同样忽略前导0)。

如果字符串中包含有效的十六进制格式,如"0xf",则将其转换为相同大小的十进制数值。

如果字符串是空的(不包含任何字符),则将其转换为 0;

如果字符串包含除上述格式之外的字符,则将其转换为 NaN。

如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换为返回的值。如果转换的结果是 NaN,则调用对象的 toString 方法,然后再次依照前面的规则转换为返回的字符串值。

写在最后:

Number转换的规则在某些方面的确不够合理,但是JavaScript就是这样一门灵活至极的语言,我们在书写判断式时,千万要对各种类型的隐式转换小之又小心!?,在不确定的情况下 我们宁可牺牲判断式长度也不可做模凌两可的简单判断。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84374.html

相关文章

  • 【LC总结】Iterator题目<Zigzag 1&2&gt;<BST&gt;&

    摘要:方法直接查找数组的位的迭代器,调用方法得到的整数即为要返回的元素。再写迭代器的方法返回指针元素的并让指针通过递归方法指向下一个元素。 Zigzag Iterator Problem Given two 1d vectors, implement an iterator to return their elements alternately. Example Given two 1d ...

    WelliJhon 评论0 收藏0
  • 玩转Linux - shell 编程基础

    摘要:数组中可以存放多个值,与大部分编程语言类似,数组元素的下标由开始。定义数组在中,用括号来表示数组,数组元素用空格符号分割开。 简述 使用 linux 就离不开 shell,那么也就是说也离不开 shell 编程。很多时候服务器都需要编写一些计划任务来定时运行的,所以掌握一些基本的 shell 编程基础很有必要。 本文是我在网上收集的一些资料,主要目的是帮助自己更好的了解掌握 shell...

    null1145 评论0 收藏0
  • 8核16g服务器能容纳多少人

    8核16g服务器一般业务能够承受50-100的并发是没有问题的,但是容纳的并发,跟很多因素有关系。所谓的高并发是针对某些大用户量同时访问系统的场景抽象而出的一个模糊的概念,高并发只是所有那些场景的统称,所以不存在高并发的通用解决方案,只存在某些特定场景的解决方案。经过多年N多个高并发场景的不断积累,目前针对特定的高并发场景均有相对成熟的解决方案,但仅仅是解决方案,对于具体业务还需要具体分析。第一阶...

    白马啸西风 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<