今天在看廖雪峰大神的博客意外地发现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呢?先弄清楚以下几点:

  1. javascript包括两个不同类型的值:基本数据类型和引用数据类型。
  2. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。
  3. 常见的基本数据类型:Number、String 、Boolean、Null和Undefined。

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

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

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

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

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

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

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

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

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

  1. C语言交换两个数组的内容

    C语言交换两个数组的内容 **思路分析:**创建一个临时的变量,用来保存循环中每一次一数组的值,然后把数组二的值赋值给数组一,再把临时变量的值赋值给数组一,这样就完成了两个数组的内容交换 #inclu ...

  2. javascript判断两个数组是否相等

    首先: javascript 是不能用 == 和 === 判断两个数组是否相等的! let a = [1,2,3,4,5]; let b = [1,2,3,4,5]; console.log(a == ...

  3. html数组拼接js,javascript合并两个数组最简单的实现方法

    在开发的过程中,我们很多时候会遇到需要将两个数组合并成一个数组的情况出现. var arr1 = [1, 2, 3]; var arr2 = [4, 5, 6]; // 将arr1和arr2合并成为[ ...

  4. 如何快速找出找出两个数组中的_找出JavaScript中两个数组之间的差异

    LeetCode今天面临的挑战是在数组中查找所有消失的数字. 蛮力 我们的输入包括一个缺少数字的实际数组.我们想将该数组与相同长度的数组进行比较,其中没有遗漏的数字.所以如果给定的话[4,3,2,7, ...

  5. javascript合并两个数组

    let a=[1,2,3]; let b=[4,5,6]; Array.prototype.push.apply(a, b); console.log(a)//[1,2,3,4,5,6]

  6. php 合并两个数组并去重,合并两个数组 以KEY 作为键

    $a= array( array( 'ID'=> 2 ) ); $b= array( array( 'ID'=> 5656 ) ); print_r($r); //合并两个数组 以ID值 ...

  7. 判断两个数组内容是否相同

    private static boolean isMatched(int[] a,int[] b){if(a==b){return true;}if (a==null || b==null){retu ...

  8. Java黑皮书课后题第7章:7.27(相同的数组)如果两个数组list1和list2的内容相同,认为相同(不是完全相同)。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否相同

    7.27(相同的数组)如果两个数组list1和list2的内容相同,认为相同(不是完全相同).编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否相同 题目 题目描述与运行示例 破题 代 ...

  9. 二维数组:随机生产,遍历,判断两个数组一维二维长度,和内容是否一致

    import java.util.Random;/*** 1,定义第一个方法,传入数组长度,返回一个1维和2维长度都完全相同的数组* 2.定义一个方法,传入两个数二维组,判断两个数组是否完全一致:一维 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记1 邂逅OpenCV
  2. 中国电子信息工程科技发展十四大趋势(2021)
  3. C#中的Dictionary字典类介绍
  4. 字节跳动开源分布式训练框架BytePS,登上GitHub热榜
  5. Android Service的onStartCommand返回值用法
  6. Java设计模式(九):模板方法设计模式
  7. 终端仿真程序_SecureCRT for mac(终端SSH工具)
  8. 要快乐的度过充满困难的一生——任总给陈珠芳及党委成员的一封信
  9. 语法制导的翻译是如何实现的_考研寄宿:怎样提高英语翻译的能力?
  10. opencv 图像卷积运算函数filter2D()
  11. Android,iOS打开手机QQ与指定用户聊天界面
  12. linux系统 用优盘启动流程,制作u盘启动linux系统
  13. Linux发行版之间有什么区别?
  14. 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...
  15. Latex的中文模板分享~~~
  16. Java是剑客;.NET是刀客(转载)
  17. Centos7 下搭建小幺鸡接口管理工具
  18. activiti 会签流程图画法
  19. 百度与谷歌技术实力比较
  20. 原生js实现滑块拖动功能

热门文章

  1. java executequery_java execute、executeQuery和executeUpdate之间的区别
  2. codesys 串口通讯实例_CODESYS线上直播,解读控制器开发那些事儿(二)
  3. 【Django】毕设学习笔记(六)
  4. 笔记本windows7设置WIFI教程(超详细)
  5. mpython 直接访问_python -mSimpleHTTPServer 开启一个简单的http服务器,可传输文件
  6. java复制重命名,JAVA操作文件的复制和重命名失败的原因
  7. Linux用管道移动文件夹,常用的Linux上的文件管理类命令讲解及演示
  8. Dart学习笔记01:环境搭建与开发环境配置
  9. 无心剑中译奥修《爱、婚姻与自由》
  10. 大数据学习笔记22:MR案例——双MR统计总利润并排序