我们先来考虑这个问题,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的更多相关文章

  1. php使用microtime(true)查看代码执行时间

    microtime() 函数返回当前 Unix 时间戳和微秒数. 如果带个 true 参数, 返回的将是一个浮点类型 round() 取出小数点后 3 位 $t1 = microtime(true); ...

  2. JS中字符串的true转化为boolean类型的true

    var a="True"; a = eval(a.toLowerCase()); alert(typeof a); //boolean alert(a);//true 正解,eva ...

  3. 继承 原生js 与 $.extend(true,default,opts||{});

    $.extend(true,default,opts||{}); var obj1={ name:'liu', sex:'m', work:'pc' } var obj2={ sex:'w' } va ...

  4. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  5. <%@ page trimDirectiveWhitespaces="true" %>

    我们经常会在JSP页面上使用: <%@ page trimDirectiveWhitespaces="true" %> 这个命令可以使jsp输出的html时去除多余的空 ...

  6. mysql 数据库连接超时的问题 autoReconnect=true

    最近在使用spring-jdbc数据库连接管理时,出现一个奇怪问题,当天部署运行没问题,第二天再试就报以下异常问题 org.springframework.dao.RecoverableDataAcc ...

  7. jsp include flush true

    设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误服务器端页面缓冲,大致的意思是,在将生成的HTML代码送到客户端前,先在服务器端内存中保留,因为解释J ...

  8. allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[System.DateTime]

    allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[S ...

  9. druid sql黑名单 报异常 sql injection violation, part alway true condition not allow

    最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助, 但是最近发现里面 有条sql语句 被拦截了, ...

  10. jqGrid的autoencode参数设置为true在客户端可能引发的编码问题

    不久前使用jqGrid+MVC做过一段时间开发. 一开始,分页参数几乎都是默认值,jqGrid的分页功能很好用. 考虑到each input is evil,我们的系统对安全性又有较高要求,所以,为了 ...

随机推荐

  1. Ceph 文件系统的安装

    yum install -y wget wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#md5=01026f87 ...

  2. HTML编辑器ASP.NET

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="kindeditor.aspx. ...

  3. Vuex教程简单实例

    什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...

  4. python 爬取妹子

    爬取妹子图片 网址:https://www.mzitu.com/jiepai/ 2019-06-13 环境WIN10 1903 python 3.7.3 个人习惯先在IDLE中进行调试 import ...

  5. MySQL常用增删改查等操作语句

    修改数据库的字符集    mysql>use mydb    mysql>alter database mydb character set utf8;创建数据库指定数据库的字符集    ...

  6. 【剑指Offer】38、二叉树的深度

      题目描述:   输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.   解题思路:   本题相对比较简单.根据二叉树深度的定义 ...

  7. 为什么多 TCP 连接比单 TCP 连接传输快

    转自: 我观察到,客户端机器从单一服务器使用 HTTP 下载一个文件:1. 单连接下载,速度没有达到客户端网络的最大带宽:2. 多连接同时下载,传输速度有极大的提高,带宽被占满. 假设如下前提:1. ...

  8. Let's Encrypt,免费好用的 HTTPS 证书

    转自:   https://imququ.com/post/letsencrypt-certificate.html?hmsr=toutiao.io&utm_medium=toutiao.io ...

  9. C#那20道题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. yum安装软件中的y/d/N

    yum install vim ........ 总下载量:7.0 M安装大小:23 M Is this ok [y/d/N]: d 参数解析: y:在线下载安装 d:只下载不安装 N:不安装 Bac ...