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

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,血的教训啊!!!

js空数组的更多相关文章

  1. js 空数组 空对象判断

    js 空数组是true还是false   1 2 var arr = new Array(); // 或 var arr = []; 我们知道,初始化后,即使数组arr中没有元素,也是一个object ...

  2. js 空数组是true还是false

    var arr = new Array(); // 或 var arr = []; 我们知道,初始化后,即使数组arr中没有元素,也是一个object. typeof arr; // "ob ...

  3. JS空数组的判断

    前言 最近在做一个mini项目,被大神各种鄙视,基础知识确实是不扎实,加油加油.好了,不多废话,抽空写写遇到的两个知识点,就记录下来,写博客还是能帮忙整理记录的,不然过了就忘记了. input监听值改 ...

  4. js 判断是否为空对象、空数组

    当需要判断参数是否为空时,总希望 js 能够提供原生的判断方法,可惜并没有,只能自己封装了. function isEmpty(obj) { // 检验 undefined 和 null if(!ob ...

  5. js中关于假值和空数组的总结

    先上x==y运算符的算法细节: 如果x不是正常值(比如抛出一个错误),中断执行. 如果y不是正常值,中断执行. 如果Type(x)与Type(y)相同,执行严格相等运算x === y. 如果x是nul ...

  6. Js删除数组重复元素的多种方法

    js对数组元素去重有很多种处理的方法,本篇文章中为网络资源整理,当然每个方法我都去实现了:写下来的目的是希望自己活学活用,下次遇到问题后方便解决. 第一种 function oSort(arr){ v ...

  7. 100怎么变成100.00 || undefined在数字环境下是:NaN || null在数字环境下是0 || 数组的toString()方法把每个元素变成字符串,拼在一起以逗号隔开 || 空数组转换成字符串后是什么?

    100怎么变成100.00?

  8. php js => splice 数组 插入 功能

    php    array_splice 手册详解 array_splice   - 把数组中的一部分去掉并用其它值取代 参数 input 输入的数组. offset 如果 offset 为正,则从 i ...

  9. 转:js清空数组

    方式1,splice 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 Array[0],空数组 ...

随机推荐

  1. Android创建自定义的布局和控件

    Android的自带布局有framelayout.linerlayout.relativelayout,外加两个百分比布局,但是这些无法灵活的满足我们的需要,所以我们要自己自定义并引入自己的布局.首先 ...

  2. SELinux/SEAndroid 实例简述(二) TE语言规则【转】

    本文转载自:https://blog.csdn.net/shell812/article/details/54930246 版权声明:本文为博主原创文章,未经博主允许不得转载.    https:// ...

  3. .NET 实用扩展方法

    .NET 实用扩展方法(持续更新...) 1. 字符串转换为可空数值类型(int, long, float...类似) /// <summary> /// 将字符串转换成32位整数,转换失 ...

  4. Lintcode97-Maximum Depth of Binary Tree-Easy

    97. Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is t ...

  5. E: Unable to locate package git

    git can’t install 报错信息: root@281eef85bb5d:~# apt-get install git Reading package lists... Done Build ...

  6. From传值

    第一个Form,Form1: string value = string.Empty; using (Form2 frm = new Form2()) { if (frm.ShowDialog() = ...

  7. Ubuntu 14 如何解压 .zip、.rar 文件

    .zip 和 .rar 是Windows下常用的压缩文件,在Ubuntu中如何解压. [解压.zip文件] Ubuntu中貌似已经安装了unzip软件,解压命令如下: unzip ./FileName ...

  8. scala基础学习(一)

    scala学习 scala与java的不同之处: 1.scala中任何一个操作符都是一个方法. s = 1+2;    可以写作:s=(1).+(2) 2.异常捕获采用模式匹配的方式. try { v ...

  9. MySQL连接java

    1.创建一个java project,建一个lib文件. 下载MySQL-connecor. 将下载好的文件打开,将mysql-connector-java-5.0.8-bin.jar文件粘贴复制到l ...

  10. Luffy之购物车页面搭建

    前面已经将一些课程加入购物车中,并保存到了后端的redis数据库中,此时做购物车页面时,我们需要将在前端向后端发送请求,用来获取数据数据 购物车页面 1.首先后端要将数据构建好,后端视图函数如下代码: ...