• js空数组


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

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

  • 相关阅读:
    函数式接口
    方法引用
    接口组成更新
    .Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能
    .net mvc使用FlexPaper插件实现在线预览PDF,EXCEL,WORD的方法
    可编辑树Ztree的使用(包括对后台数据库的增删改查)
    使用chosen插件实现多级联动和置位
    在ASP.NET MVC中使用区域来方便管理controller和view
    使用datepicker日期插件
    Linq to sql中使用DateDiff()
  • 原文地址:https://www.cnblogs.com/sixrookie/p/10218416.html
Copyright © 2020-2023  润新知