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


相关推荐: 厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  iOS验证手机号的正则表达式  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  WEB开发之注册页面验证码倒计时代码的实现  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  大连 网站制作,大连天途有线官网?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  javascript基于原型链的继承及call和apply函数用法分析  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  浅谈redis在项目中的应用  phpredis提高消息队列的实时性方法(推荐)  如何在阿里云高效完成企业建站全流程?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  QQ浏览器网页版登录入口 个人中心在线进入  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  详解Android——蓝牙技术 带你实现终端间数据传输  南京网站制作费用,南京远驱官方网站?  简单实现jsp分页  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  高防服务器如何保障网站安全无虞?  Laravel如何创建自定义中间件?(Middleware代码示例)  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  黑客如何利用漏洞与弱口令入侵网站服务器?  EditPlus中的正则表达式实战(5)  郑州企业网站制作公司,郑州招聘网站有哪些?  使用Dockerfile构建java web环境  JavaScript如何操作视频_媒体API怎么控制播放  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Bootstrap CSS布局之列表  jQuery中的100个技巧汇总  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  JS经典正则表达式笔试题汇总  想要更高端的建设网站,这些原则一定要坚持!