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

发布时间 - 2026-01-11 00:56:14    点击率:

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

alert([]==[]);  // false
alert([]===[]);  // false

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

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

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

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

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

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

 或

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

请不要使用这种方法。

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

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

// Warn if overriding existing method
if(Array.prototype.equals)
  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.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
  // if the other array is a falsy value, return
  if (!array)
    return false;
  // compare lengths - can save a lot of time 
  if (this.length != array.length)
    return false;
  for (var i = 0, l = this.length; i < l; i++) {
    // Check if we have nested arrays
    if (this[i] instanceof Array && array[i] instanceof Array) {
      // recurse into the nested arrays
      if (!this[i].equals(array[i]))
        return false;    
    }      
    else if (this[i] != array[i]) { 
      // Warning - two different object instances will never be equal: {x:20} != {x:20}
      return false;  
    }      
  }    
  return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});

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

Object.prototype.equals = function(object2) {
  //For the first loop, we only check for types
  for (propName in this) {
    //Check for inherited methods and properties - like .equals itself
    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
    //Return false if the return value is different
    if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
      return false;
    }
    //Check instance type
    else if (typeof this[propName] != typeof object2[propName]) {
      //Different types => not equal
      return false;
    }
  }
  //Now a deeper check using other objects property names
  for(propName in object2) {
    //We must check instances anyway, there may be a property that only exists in object2
      //I wonder, if remembering the checked values from the first loop would be faster or not 
    if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
      return false;
    }
    else if (typeof this[propName] != typeof object2[propName]) {
      return false;
    }
    //If the property is inherited, do not check any more (it must be equa if both objects inherit it)
    if(!this.hasOwnProperty(propName))
     continue;
    //Now the detail check and recursion
    //This returns the script back to the array comparing
    /**REQUIRES Array.equals**/
    if (this[propName] instanceof Array && object2[propName] instanceof Array) {
          // recurse into the nested arrays
      if (!this[propName].equals(object2[propName]))
            return false;
    }
    else if (this[propName] instanceof Object && object2[propName] instanceof Object) {
          // recurse into another objects
          //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
      if (!this[propName].equals(object2[propName]))
            return false;
    }
    //Normal value comparison for strings and numbers
    else if(this[propName] != object2[propName]) {
      return false;
    }
  }
  //If everything passed, let's say YES
  return true;
} 

以上所述是小编给大家介绍的JavaScript比较两个数组的内容是否相同(推荐),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 比较两个数组是否相同  # 对比两个数组是否相同  # js实现数组去重、判断数组以及对象中的内容是否相同  # js使用数组判断提交数据是否存在相同数据  # JS实现对json对象排序并删除id相同项功能示例  # json对象与数组以及转换成js对象的简单实现方法  # Javascript的数组与字典用法与遍历对象的技巧  # javascript如何定义对象数组  # Javascript中判断变量是数组还是对象(array还是object)  # js中如何把字符串转化为对象、数组示例代码  # JS判断两个数组或对象是否相同的方法示例  # 转换成  # 大神  # 小编  # 情况下  # 让人  # 这种方法  # 在此  # 遍历  # 推荐使用  # 上有  # 给了  # 给大家  # 弹出  # 请不要  # 要比  # 两句  # 不能用  # 所述  # 就做  # 给我留言 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何使用Telescope进行调试?(安装和使用教程)  中国移动官方网站首页入口 中国移动官网网页登录  个人网站制作流程图片大全,个人网站如何注销?  Swift中swift中的switch 语句  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel如何使用Eloquent进行子查询  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  EditPlus中的正则表达式 实战(2)  如何快速搭建支持数据库操作的智能建站平台?  微信小程序 scroll-view组件实现列表页实例代码  利用python获取某年中每个月的第一天和最后一天  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何用y主机助手快速搭建网站?  bing浏览器学术搜索入口_bing学术文献检索地址  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel定时任务怎么设置_Laravel Crontab调度器配置  大连 网站制作,大连天途有线官网?  再谈Python中的字符串与字符编码(推荐)  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  js实现点击每个li节点,都弹出其文本值及修改  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在服务器上三步完成建站并提升流量?  如何用AWS免费套餐快速搭建高效网站?  如何在阿里云域名上完成建站全流程?  Linux安全能力提升路径_长期防护思维说明【指导】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  iOS中将个别页面强制横屏其他页面竖屏  java ZXing生成二维码及条码实例分享  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  浅述节点的创建及常见功能的实现  详解阿里云nginx服务器多站点的配置  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  移动端脚本框架Hammer.js  如何快速启动建站代理加盟业务?  Laravel怎么使用artisan命令缓存配置和视图  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  javascript日期怎么处理_如何格式化输出  网站图片在线制作软件,怎么在图片上做链接?  实例解析angularjs的filter过滤器  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤