星空网 > 软件开发 > Java

[] == ![]为什么是true

我们先来考虑这个问题,console.log([] == false)会打印什么呢?

    答案是true。为什么呢?

    首先,因为当"=="号两边其中一个是布尔值的话,先把它转换为数字(ECMAScript的规范)。于是就变成了求[] == 0。

    然后问题是为什么[]==0会是true呢?这是因为当"=="的一边是字符串或数字,另一边是对象的时候(数组也是对象),先把对象值转换为原始值再判断相等。对象值到原始值是怎么转换的呢?.对于所有非日期雷对象来说,对象到原始值的转换基本上就是对象到数字的转换。有3个步骤:

    1.所有对象先调用valueOf()方法,如果此方法返回的是原始值,则对象转为这个原始值。

    2.如果valueOf方法返回的不是原始值,则调用toString方法,如果toString方法返回的是原始值吗,则对象转换为这个原始值。

    3.如果valueOf和toString方法均没有返回原始值,则抛出TypeError异常.

好,让我们看看[]到原始值的转换是怎么样的?首先调用[].valueOf()方法,返回值是对象自身,即[],这不是一个原始值。所以继续调用[].toString()方法,返回的是空字符串"",这是一个原始值,所以此值就作为对象转换为原始值的输出。于是问题就变成了求"" == 0.

    最后,为什么"" == 0会是true呢?相信很多同学都知道了,当"=="两边一个是字符串一个是数字的时候,先把字符串转为数字,再进行比较。“”转成数字为0,所以最后得出[] == false为true。

    让我们回到标题 [] == ![]为什么是true。!的优先级比==要高,所以会先执行![]。也就是先把[]转为布尔类型再取反。[]转布尔值是true,为什么呢?因为在JavaScript里除了false自身以外只有5个假值,分别是“”,undefined, null, 0, NaN。除了这5个假值以外,其他所有值转布尔类型都是true。一切对象都是真值,包括new Boolean(false)。于是问题就成了刚才我们讨论的 [] == false了。故得到 [] == ![]为true。

 




原标题:[] == ![]为什么是true

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

西班牙人计划在复活节期间上网购物:https://www.kjdsnews.com/a/1381879.html
这个市场有什么魔力?值得各大跨境平台争相占据市场份额!:https://www.kjdsnews.com/a/1381880.html
美国商标注册流程及所需时间分析-跨标云:https://www.kjdsnews.com/a/1381881.html
美国商标注册流程及官方网址汇总-跨标云:https://www.kjdsnews.com/a/1381882.html
美国商标注册流程及官方指南-跨标云:https://www.kjdsnews.com/a/1381883.html
美国商标注册流程及完成时间详解-跨标云:https://www.kjdsnews.com/a/1381884.html
长治婚庆女司仪和主持人:https://www.vstour.cn/a/366176.html
北京丰台区水上乐园哪家好玩?:https://www.vstour.cn/a/366177.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流