疑惑打印console.log([]==false) 返回为 true

测试如下

console.log([]==false)

打印值为true

然后

[]?console.log('aaa'):consoel.log("bbb")

打印值为 aaa

那么 [] 到底为true 还是false### 问题描述

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 2.8k
2 个回答

某种程度来说,[] 既不等于 true 也不等于 false ([] === true || [] === false)。

[] ? console.log('aaa') : consoel.log("bbb")

打印 aaa 是因为这个自动转换为布尔值

== 比较参考下面这个规则

  1. 如果两个值类型相同,进行 === 比较。
  2. 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
  3. 如果一个是null、一个是undefined,那么相等。
  4. 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
  5. 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
  6. 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString。例外的是Date,Date利用的是toString转换。非js核心的对象,会比较麻烦,有兴趣的同学可以研究一下
  7. 任何其他组合,都不相等。

转换顺序看下面:

  1. [] == 0
  2. "" == 0
  3. 0 == 0

所以为 true

关于比较去参考 MDN 的 Java​Script 中的相等性判断,你会发现文末给出的 JS 比较表可以解答你的第一个问题(当然还是推荐把 MDN 那篇先看完再说);而第二个其实是个类型转换,相当于 Boolean([]) 的结果(可以去控制台跑下),相当于你使用了一个错误的数据类型,我个人认为虽然 Java​Script 是个弱类型语言,但是还是要注意尽量保持类型的统一,可以偶尔借用类型转换的特性,但是多数情况下,还是尽量不要用这种给自己留坑的做法吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题