js空数组不等于空数组问题

571 阅读2分钟

前两天在做一个小项目的时候,需要做一个判断,当时我的判断是如果数组arrar === []就弹出提示框,不满足条件,否则就执行我正常的代码,代码如下:

if (newDates === []) {
          alert("此区间没有商品");
        } else {
          newDates.forEach(function (value, index) {
            sum = sum + value.subject + "\n";
          });
          alert(sum);
        }

当我调试的时候输入不满足的区间时居然没有弹出提示框,当时我就优点疑惑,我的代码也没啥问题呀,后面在控制台输出了一下[] === [] 返回的是false,我顿时就悟了,然后将判断条件改成了!newDatas.length,代码如下:

if (!newDates.length) {
          alert("此区间没有商品");
        } else {
          newDates.forEach(function (value, index) {
            sum = sum + value.subject + "\n";
          });
          alert(sum);
        }

然后我在网上查阅了文档至于[] !== []解释如下:

原始值的比较是值的比较:

    它们的值相等时它们就相等(==)

    它们的值和类型都相等时它们就恒等(===)。

  对象和原始值不同,对象的比较并非值的比较,而是引用的比较:

    即使两个对象包含同样的属性及相同的值,它们也是不相等的

    即使两个数组各个索引元素完全相等,它们也是不相等的

  举个例子:

var o = [1,2], p = [1,2];      // 两个数组元素和长度一样的数组
o === p                        // => false: 两个单独的数组永不相等
var a = {}, b = {};         // 两个单独的空对象 
a === b                        // => false: 两个单独的对象永不相等

  我们通常将对象称为引用类型(reference type),以此来和JavaScript的基本类型区分开来。对象值都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。

  再举个栗子:

var a = [];    // 定义一个引用空数组的变量
a var b = a;   // 变量b引用同一个数组 
b[0] = 1;     // 通过变量b来修改引用的数组 
a[0]          // => 1: 变量a也会修改 
a === b       // => true:a和b引用同一个数组,因此它们相等

总结:简单数组类型的比较是值(==)和类型(===)的比较,而复杂数据类型(数组,对象等)的比较是引用的比较,只有当两个对象都引用的是同一个对象时他们才全等!