资讯专栏INFORMATION COLUMN

JavaScript比较两个数组的内容是否相同

microcosm1994 / 519人阅读

摘要:今天在看廖雪峰大神的博客意外地发现是不能用或操作符直接比较两个数组是否相等的。目前没有内置的操作符判断对象的内容是否相同。另外一种方法判断数组的长度循环遍历数组的值进行比较以上就是我的总结,有不对的地方请指出。

今天在看廖雪峰大神的博客意外地发现javascript是不能用 "=="或"==="操作符直接比较两个数组是否相等的。

先看案例:

var a = [1,2,3,4,5];
var b = a.slice();
console.log(a);          //  [1,2,3,4,5]
console.log(b);          //  [1,2,3,4,5]
console.log(a === b);    //  false
console.log(a == b);     //  false
console.log([] == []);   //  false
console.log( [] === []); //  false
为什么都输出false呢?先弄清楚以下几点:

javascript包括两个不同类型的值:基本数据类型和引用数据类型。

基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。

常见的基本数据类型:Number、String 、Boolean、Null和Undefined。

var a = 10;
var b = a;
b = 20;
console.log(a);  //  10

上面b获取的是a值的一份拷贝,虽然两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。b只是保存了a赋值的一个副本,所以,b的改变,对a没有影响。

引用类型数据:也就是对象类型Object type,比如:Object、Array、Function、Data等。javascript的引用数据类型是保存在堆内存中的对象。

讲到这里应该理解为什么输出的是false了:因为数组是兑现,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。目前JavaScript没有内置的操作符判断对象的内容是否相同。

那么该如何去判断数组是否相等呢?

有一种做法是将数组转换成字符串:
JSON.stringify(a1) === JSON.stringify(a2)

a1.toString() === a2.toString();
请不要使用这种方法!!!
这种方法在某些情况下是可行的,当两个数组的元素顺序相同且元素都可以转换成字符串的情况下确实可行。
这样的代码存有隐患,比如数字被转换成字符串,数字“1”和字符串“1”会被认为相等,可能造成调试困难,不推荐使用。

另外一种方法:

function equar(a, b) {
    // 判断数组的长度
    if (a.length !== b.length) {
        return false
    } else {
        // 循环遍历数组的值进行比较
        for (let i = 0; i < a.length; i++) {
            if (a[i] !== b[i]) {
                return false
            }
        }
        return true;
    }
}
var s = equar([1, "2", 3], [1, 2, 3]);
var t = equar([1, 2, 3], [1, 2, 3]);
console.log(s);  //  false
console.log(t);  //  true

以上就是我的总结,有不对的地方请指出。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98112.html

相关文章

  • JavaScript 编程精解 中文第三版 四、数据结构:对象和数组

    摘要:本章将介绍基本的数据结构。松鼠人一般在晚上八点到十点之间,雅克就会变身成为一只毛茸茸的松鼠,尾巴上的毛十分浓密。我们将雅克的日记表示为对象数组。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Data Structures: Objects and Arrays 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《Jav...

    kamushin233 评论0 收藏0
  • js面试题(下)

    摘要:短路运算返回值是什么又称为短路或,短路如果左侧为真,则不再进行右侧运算,同时返回左侧表达式运算结果。上面是不存在的,所有结果为,转成就是,那么就会运算,把赋值给的同时,返回值也是,所以打印返回结果是函数内部变量有哪些 DOM元素e的e.getAttribute(propName)和e.propName有什么区别和联系 e.getAttribute(),是标准DOM操作文档元素属性的方...

    zhoutao 评论0 收藏0
  • 数值类型vs引用类型

    摘要:数值类型引用类型有种通过复制数值传值的数据类型。我们称之为原始基本数据类型还有三种通过引用传值的数据类型。当等式运算符和用于引用型变量时,他们会检查引用。这是中的地方在内存中的映射包含了函数的引用,其他变量则包含基本数据类型的数据。 本文旨在了解如何复制对象、数组和函数以及如何将它们传递到函数中。知道引用类型复制的是什么。了解原始值是通过复制值来复制及传递的。 数值类型 & 引用类型 ...

    missonce 评论0 收藏0
  • 【underscore 源码解读】JavaScript 中如何判断两个元素是否 "相同&q

    摘要:最近开始看源码,并将源码解读放在了我的计划中。后文中均假设比较的两个参数为和。,如果和均是类型或者类型,我们可以用来判断是否。 Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中。 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多。为什么是 underscore?最主要的原...

    yhaolpz 评论0 收藏0
  • JS基础之常用小技巧和知识总结(一)

    摘要:如果有一方是布尔值,则转换为,转换为,再进行判断。等同运算符类型不同返回类型相同如果同为数字字符串则比较值如果同为布尔值,相同则为不同为如果两个操作数同为引用类型,且引用的为同一个对象函数,数组,则相同。 本文主要记录平时开发遇到的知识点和小技巧 相等判断(==) 类型相同: 判断其值是否相同 类型不同: 1. 如果数字和字符串比较, 则字符串会被隐式转换为数字,在做判断。 2....

    dadong 评论0 收藏0

发表评论

0条评论

microcosm1994

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<