var arr = new Array();
// 或 var arr = [];

我们知道,初始化后,即使数组arr中没有元素,也是一个object。

typeof arr;
// "object"

既然是object,用于判断条件时就会被转化为true

if(arr)console.log("it's true");
// it's true

但是,如果将arr与布尔值比较:

arr == false;
// true
arr == true;
// false

可是,如果把arr转化为Boolean,的确是true:

Boolean(arr);
// true

那arr与布尔值比较时,到底发生了什么?

原来,任意值与布尔值比较,都会将两边的值转化为Number。

如arr与false比较,false转化为0,而arr为空数组,也转化为0:

Number(false)
// 0
Number(arr)
// 0

所以,当空数组作为判断条件时,相当于true。当空数组与布尔值直接比较时,相当于false。

也就出现了以下令人绕圈的现象:

[] == ![];
// true

如何避免数组与布尔值比较时出现的坑呢?可以先把数组转化为布尔值:

Boolean(arr) == true;
// true

有同学问:

new Array() == [];

必须是false,就和new Array() == new Array()一样。是不同的两个对象。

但有个问题很奇怪:

new Array(1) == false;
// true // 或 [undefined] == false;
// true

这个怎么解释呢?Number(new Array(1))为什么会是0呢?

最新文章

  1. C# 获取当前月第一天和最后一天 计算两个日期差多少天
  2. Linux进程管理
  3. Jboss EAP:native management API学习
  4. Liferay 6.2 改造系列之十五:修改默认可用语言
  5. HTML5之语义化标签
  6. c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]
  7. Configuring Report Manager
  8. 配置oschina for pc 开发环境
  9. Struts2 单个文件上传/多文件上传
  10. jquery图片上传
  11. SQL使用记录
  12. DataFrame的构建及一些操作
  13. RabbitMQ之Topics(多规则路由)
  14. Android 音视频开发学习思路
  15. Spring Security(五):2.2 History
  16. lamp环境搭建(apache安装,mysql安装,php安装)
  17. Hbase 过滤器的使用
  18. Reduce 和 Transduce 的含义
  19. Liunx-cp命令
  20. 使用sso(cas)的时候报单点登录service不匹配问题分析及解决

热门文章

  1. .net framework多个版本在IIS服务器上时应注意-重新注册IIS-错误Server Application Unavailable
  2. excel文件导入mysql
  3. processing fill()和stroke()函数
  4. openvpn 的安装和使用
  5. 深入理解Linux内核-进程地址空间
  6. Shell中整数比較
  7. 在TypeScript中扩展JavaScript基础对象的功能
  8. 安装mysql提示3306端口已经被占用解决方案
  9. uwsgi -- unavailable modifier requested: 0 -- 的解决办法
  10. LearnOpenGL 你好,三角形[转]--附源码