我们先来考虑这个问题,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。

最新文章

  1. python基础:算法是什么
  2. 一些Python的惯用法和小技巧:Pythonic
  3. java socket编程开发简单例子 与 nio非阻塞通道
  4. struts2:数据校验,通过Action中的validate()方法实现校验,图解
  5. zepto源码--fragment--学习笔记
  6. 绝对好文:.NET程序性能的基本要领
  7. Python基础之常用模块(一)
  8. Template基础
  9. 微服务架构 - CentOS7离线部署docker
  10. HTML5培训入门基础知识了解CSS3 3D属性
  11. python day07笔记总结
  12. 翻译:low_priority和high_priority(已提交到MariaDB官方手册)
  13. tomcat 设置连接数
  14. TestNg-数据驱动-dataProvider
  15. python基本数据类型之字典
  16. 【分布式事务】spring cloud集成lcn解决分布式事务
  17. 【转】METADATATYPE的使用,MVC的MODEL层数据验证
  18. git忽略已添加版本控制的文件
  19. JS "eval智能" 工厂模式
  20. Python 自用代码(拆分txt文件)

热门文章

  1. CentOS6.9下NFS配置说明
  2. python 从给定的URL中提取顶级域名(TLD)
  3. vue scss 安装
  4. 【剑指Offer】53、表示数值的字符串
  5. for 循环的反汇编浅析
  6. [luogu2602 ZJOI2010] 数字计数 (数位dp)
  7. HashMap源码分析笔记(一)
  8. linux文件的特殊权限及隐藏权限
  9. Linux—Ubuntu14.0.5安装MySQL
  10. Python学习笔记之模块与包