WTF Javascript之 [] == ![]

2017-08-24 20:35 热度: 376 奔跑的搬砖工

最近看技术文章发现了这个看似奇葩的结果(如题的结果是true)

原因

先说下右边的![]的值,这个是把[]转化成boolean值,然后再取反,结果就是false,这个很容易理解。

好了,那个既然是false了,按照ECMA规范就是如果比较的一方是boolean的话,那就需要把这个boolean转换成number,题目就变成了[] == 0。

然后接着解释为啥[] == 0是true?还是那个ECMA规范又说话了:如果比较的一方是字符串或数字,另一方是object的话(数组也是object),需要把object转换成基本类型(字符串或者数字)

转换规则:

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

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

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

再来看下这个题目, [].valueOf()依然是[],因此接着执行第二步,使用toString()结果是''。然后题目变成了'' == 0, 结果一目了然。

怀疑世界

在开始的时候看到解释的时候,有点怀疑世界了: 为啥

if ([]) {
    console.log(true);
} else {
    console.log(false);
}

返回解释是true呢,其实很好理解, []不是基本类型指定是true啊,不要认为 [] == ![]相等,然后![]是false就把[]也理解成false。

知乎相关问题

查看评论 (0条)

添加评论