今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的。

  1. alert([]==[]); // false
  2. alert([]===[]); // false

以上两句代码都会弹出false。

因为JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。目前JavaScript没有内置的操作符判断对象的内容是否相同。

但是惯性思维让人以为数组也是值,是可以比较的。

如果要比较数组是否相等,就只能遍历数组元素比较。

在网上流传很普遍的一种做法是将数组转换成字符串:

  1. JSON.stringify(a1) == JSON.stringify(a2)

  1. a1.toString() == a2.toString()

请不要使用这种方法。

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

在StackOverflow上有大神已经提供了正确的方法,我就做下搬运工吧:

  1. // Warn if overriding existing method
  2. if(Array.prototype.equals)
  3. console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
  4. // attach the .equals method to Array's prototype to call it on any array
  5. Array.prototype.equals = function (array) {
  6. // if the other array is a falsy value, return
  7. if (!array)
  8. return false;
  9.  
  10. // compare lengths - can save a lot of time
  11. if (this.length != array.length)
  12. return false;
  13.  
  14. for (var i = 0, l = this.length; i < l; i++) {
  15. // Check if we have nested arrays
  16. if (this[i] instanceof Array && array[i] instanceof Array) {
  17. // recurse into the nested arrays
  18. if (!this[i].equals(array[i]))
  19. return false;
  20. }
  21. else if (this[i] != array[i]) {
  22. // Warning - two different object instances will never be equal: {x:20} != {x:20}
  23. return false;
  24. }
  25. }
  26. return true;
  27. }
  28. // Hide method from for-in loops
  29. Object.defineProperty(Array.prototype, "equals", {enumerable: false});

大神还顺手给了比较Object的方法:

  1. Object.prototype.equals = function(object2) {
  2. //For the first loop, we only check for types
  3. for (propName in this) {
  4. //Check for inherited methods and properties - like .equals itself
  5. //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
  6. //Return false if the return value is different
  7. if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
  8. return false;
  9. }
  10. //Check instance type
  11. else if (typeof this[propName] != typeof object2[propName]) {
  12. //Different types => not equal
  13. return false;
  14. }
  15. }
  16. //Now a deeper check using other objects property names
  17. for(propName in object2) {
  18. //We must check instances anyway, there may be a property that only exists in object2
  19. //I wonder, if remembering the checked values from the first loop would be faster or not
  20. if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
  21. return false;
  22. }
  23. else if (typeof this[propName] != typeof object2[propName]) {
  24. return false;
  25. }
  26. //If the property is inherited, do not check any more (it must be equa if both objects inherit it)
  27. if(!this.hasOwnProperty(propName))
  28. continue;
  29.  
  30. //Now the detail check and recursion
  31.  
  32. //This returns the script back to the array comparing
  33. /**REQUIRES Array.equals**/
  34. if (this[propName] instanceof Array && object2[propName] instanceof Array) {
  35. // recurse into the nested arrays
  36. if (!this[propName].equals(object2[propName]))
  37. return false;
  38. }
  39. else if (this[propName] instanceof Object && object2[propName] instanceof Object) {
  40. // recurse into another objects
  41. //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
  42. if (!this[propName].equals(object2[propName]))
  43. return false;
  44. }
  45. //Normal value comparison for strings and numbers
  46. else if(this[propName] != object2[propName]) {
  47. return false;
  48. }
  49. }
  50. //If everything passed, let's say YES
  51. return true;
  52. }

JavaScript如何比较两个数组的内容是否相同的更多相关文章

  1. JavaScript如何比较两个数组的内容是否相同【转】

    比较2个数组是否相等的.  不能像字符样 简单的用  ==   === 比较 ([]==[]); // false ([]===[]); // false 都是false -------------- ...

  2. javascript合并两个数组

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

  3. JS 比较两个数组是否相等 是否拥有相同元素

    Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...

  4. ios开发之--比较两个数组里面的值是否相同

    比较两个数组里面的内容是否相同,代码如下: NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @& ...

  5. JS比较两个数组是否相等 是否拥有相同元素

    Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...

  6. javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

    主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...

  7. 用JavaScript比较两个数组是否相等

    JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false alert([0,0,0]= ...

  8. javascript对比两个数组,打印出差异值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Js $.merge() 函数(合并两个数组内容到第一个数组)

    定义和用法 $.merge() 函数用于合并两个数组内容到第一个数组. 语法 $.merge( first, second )   参数 描述 first Array类型 第一个用于合并的数组,合并后 ...

随机推荐

  1. Spring实战(十三)Spring事务

    1.什么是事务(Transaction)? 事务是指逻辑上的一组操作,要么全部成功,要么全部失败. 事务是指将一系列数据操作捆绑成为一个整体进行统一管理.如果某一事务执行成功,则该事务中进行的所有数据 ...

  2. java正则表达式的使唤

    示例代码: package com.target.start; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * ...

  3. 作业2:java内存模型图示

    参考:http://www.infoq.com/cn/minibooks/java_memory_model?utm_source=infoq&utm_campaign=user_page&a ...

  4. 手把手教你搭建FastDFS集群(中)

    手把手教你搭建FastDFS集群(中) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...

  5. 动画方案 Lottie 学习(二)之实战

    代码 $('.success-info-title').append('<p class="normal_finish" id="normal_finish_ani ...

  6. Plugin 表格列自定义显示隐藏插件TableCustom.js

    TableCustom 案例展示 下载地址 https://github.com/chaorenzeng/TableCustom.js.git 快速使用 1.引入TableCustom.css和Tab ...

  7. Spring讲解-----------表达式语言

    转自:https://blog.csdn.net/u011225629/article/details/47143083 5.1  概述5.1.1  概述       Spring表达式语言全称为“S ...

  8. PL/SQL Developer -> 下载 -> 安装 ->执行SQL -> 设置本地/远程连接

    一 下载 点击进入 https://www.allroundautomations.com/bodyplsqldevreg.html 二 安装 4wkf7lzcb8amvke2rzeuclnk5emc ...

  9. contextlib:上下文管理器工具

    介绍 contextlib模块包含的工具可以用于处理上下文管理器和with语句 上下文管理器API ''' 上下文管理器(context manager)负责管理一个代码块中的资源,会在进入代码块时创 ...

  10. Oracle 触发器学习笔记一

    触发器名:触发器对象的名称.由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途.触发时间:指明触发器何时执行,该值可取:before:表示在数据库动作之前触发器执行;after:表示 ...