js 空数组是true还是false

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

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

1
2
typeof arr;
// "object"

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

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

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

1
2
3
4
arr == false;
// true
arr == true;
// false

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

1
2
Boolean(arr);
// true

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

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

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

1
2
3
4
Number(false)
// 0
Number(arr)
// 0

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

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

1
2
[] == ![];
// true

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

1
2
Boolean(arr) == true;
// true

有同学问:

1
new Array() == [];

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

但有个问题很奇怪:

1
2
3
4
5
6
7
new Array(1) == false;
// true
 
// 或
 
[undefined] == false;
// true

这个怎么解释呢?Number(new Array(1))为什么会是0呢?地址引用不一样

js 空数组 空对象判断的更多相关文章

  1. 处理 JSON null 和空数组及对象

    描述了对 JSON 数据中使用的 null 和空数组及对象的处理. JSON 数据具有 null 和空数组及对象的概念.此部分说明其中每个概念如何映射到 null 和未设置的数据对象概念. Null ...

  2. PHP json_encode转换空数组为对象

    问题描述: php返回json格式的数据,当返回数据的为数组,且key为字符串时,json化后将返回jsonObject,但是如果是空数组,有可能返回的就是jsonArray,数据结构不一致导致端解析 ...

  3. js之数组,对象,类数组对象

    许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...

  4. js的数组与对象关系

    有的时候总犯糊涂,不理解对象和数组的关系,转载一篇文章,深刻记忆一下 http://hi.baidu.com/samdan/item/05179313d1ee4b9e99ce3371 比如有一个数组a ...

  5. js 笔记 数组(对象)

    一.javascript push 的元素为指针 var data = {"test":{"201308":"23","20130 ...

  6. js中数组Array对象的方法sort()的应用

    一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...

  7. js引用类型数组去重-对象标记法

    前言 Js数组去重已经有很多种实现方式:包括逐个检索对比(使用Array.property.indexOf),先排序后对比,使用hash表,利用ES6中的Set()等.这些数组去重办法中速度最快的是h ...

  8. js 中数组或者对象的深拷贝和浅拷贝

    浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...

  9. js中数组和对象的合并

    1 数组合并 1.1 concat 方法 1 2 3 4 var a=[1,2,3],b=[4,5,6]; var c=a.concat(b); console.log(c);// 1,2,3,4,5 ...

随机推荐

  1. WPF进阶之接口(1):IValueConverter,IMultiValueConverter

    看一个例子,FontFamily="Trebuchet MS, GlobalSansSerif.CompositeFont" .这样一条简单的语句,熟悉WPF的人在xaml中可能经 ...

  2. Qt计算两个时间差

    QTime startTime = QTime::currentTime(); QThread::msleep(SLEEP_TIME_MILL); QTime stopTime = QTime::cu ...

  3. Linux命令之乐--expr

    计算字符长度 [root@Director ~]# echo $var hello world [root@Director test]# expr length "$var" 数 ...

  4. Fragment之间传数据

    1.用bundle存Bundle bundle = new Bundle();bundle.putString("cid1", classList.get(i).getId()); ...

  5. 使用 awk 过滤文本或文件中的字符串

    当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以得到感兴趣的部分.这时正则表达式就派上用场了. 什么是正则表达式? 正则表达式可以定义为代表若干 ...

  6. 【IIS】IIS 7.0/7.5 绑定

    window 7 IIS 7.0/7.5 默认站点不存在,甚至Http的绑定类型也无法选择,而绑定类型是空的,或者是别的.此时IIS无法正常创建IIS站点,而创建IIS站点的页面也不是通常的页面,此时 ...

  7. 较快的maven的settings.xml文件

    <?xml version="1.0" encoding="UTF-8"?> <settings> <!-- <localR ...

  8. Tomcat----->软件密码学基础配置tomcat http连接器 https

    公钥只能私钥解开,私钥只能公钥解开. 类似于别人给你一个盒子,你用他的盒子和自己盒子加密,他手中有他的钥匙和自己的钥匙,可以解开就既能证明是你发的也能相信内容. 每个数据有自己的数据指纹,数据指纹是由 ...

  9. 2017 Multi-University Training Contest - Team 3——HDU6063 RXD and math

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6063 题目意思:字面意思,给出n,k,算出这个式子的答案. 思路:比赛的时候是打表找规律过了,赛后仔细 ...

  10. 转发URL请求

    如何用Netty实现一个轻量级的HTTP代理服务器 - Newland - 博客园 https://www.cnblogs.com/jietang/p/8926325.html 现在迫切希望有一个HT ...