首先我们定义一个空的数组:

var a = [ ];

数组a里面是空的没有值,接下来我们打印:

console.log(!!a);

因为数组是空的,此处应该为false。

恰好相反,!!a为true。

但是,把空数组和布尔值比对后发现又出现了问题:

var a = [ ];
a == true;//false
a == false;//true

这是个非常具有迷惑性的问题,与我们的认知好像是相反的,总有哪里出了问题。

后来发现这个与ECMA(我也不知道这个具体是干嘛的,反正是官方的)规范有关,里面有这么两条:

  • 第 7 条:If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  • 第 9 条:If Type(x) is Object and Type(y) is either String, Number, or Symbol, return the result of the comparison ToPrimitive(x) == y.

翻译成中文就是:

如果x为Boolean,则转化为数字进行比较;

如果x为Object ,String,Number等,转化为原始值进行比较。

第一个好理解,第二个就有点问题了,什么是原始值?

ToPrimitive是一个内部的函数,查阅了网上的一些解释,有一个说的很讨巧,如果实在理解不来,就把ToPrimitive()当做join()。

这样一来就好办了,a是空数组,join后是空字符串,所以为false两边相等,返回true,没问题。

而!!a则是因为发生了类型转换,object转型到布尔值,结果都是true。

所以:

var a = [];
console.log(!!a);//true
console.log(a);//[]
console.log(a == false);//true
console.log(a == true);//false

最后,项目中判断一个数组是否为空,一定要用length,血的教训啊!!!

最新文章

  1. ASP.NET MVC中viewData、viewBag和templateData的使用与区别
  2. post 之checkbox 未被选中解决方法
  3. datetime时区转换
  4. iOS本机生成证书请求文件流程
  5. 理解C#系列 / 核心C# / 变量
  6. xslt语法之---position()函数
  7. Ubuntu下嵌入式Qt开发环境配置全攻略
  8. Uva 552 Prime Ring Problem(dfs)
  9. 迷你MVVM框架 avalonjs 0.85发布
  10. 基本的dom操作方法
  11. Solr 按照得分score跟指定字段相乘排序
  12. swift 启动图片的设置
  13. vs2010入门程序和出错问题解决方案
  14. Redis 学习数据类型
  15. 使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据
  16. fineuploader使用实例
  17. Openvswitch手册(9): Flow
  18. ES DSL 基础查询语法学习笔记
  19. AIX查看CPU、内存等信息
  20. C++对象的内存布局以及虚函数表和虚基表

热门文章

  1. 清华集训2017 Day 2简要题解
  2. 解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。
  3. 网站基础html javascript jquery
  4. 百度AI搜索引擎
  5. 单元测试系列之二:Mock工具Jmockit实战
  6. HTML基础【3】:列表标签
  7. MapReduce编程:词频统计
  8. 【Nodejs】【node.js 安装 和 配置Sublime Text的Node.js】
  9. lib下的Jar包在项目打包的时候提示不能找不到
  10. SSH 远程登陆