js中判断Object、Array、Function等引用类型对象是否相等


Posted in Javascript onAugust 29, 2012

在迭代中,我们还要注意的是,对象或者数组中的元素可能是一个任意值——除了原始类型值、object、arrray外,这个值还可能是一个方法、一个DOM对象或者window对象,可能你已经注意到了,有部分引用类型是不能进行迭代的,需要分支判断,代码如下:

function compare(a,b){ 
var 
pt = /undefined|number|string|boolean/, 
fn = /^(function\s*)(\w*\b)/, 
cr = "constructor", 
cn = "childNodes", 
pn = "parentNode", 
ce = arguments.callee; 
if(pt.test(typeof a) || pt.test(typeof b) || a === null || b === null){ 
return a === b || (isNaN(a) && isNaN(b)); //为了方便,此处假定NaN == NaN 
} 
if(a[cr] !== b[cr]){ 
return false; 
} 
switch(a[cr]){ 
case Date : { 
return a.valueOf() === b.valueOf(); 
}; 
case Function : { 
return a.toString().replace(fn,'$1') === b.toString().replace(fn,'$1'); //硬编码中声明函数的方式会影响到toString的结果,因此用正则进行格式化 
}; 
case Array : { 
if(a.length !== b.length){ 
return false; 
} 
for(var i=0;i<a.length;i++){ 
if(!ce(a[i],b[i])){ 
return false; 
} 
} 
break; 
}; 
default : { 
var alen = 0, blen = 0, d; 
if(a === b){ 
return true; 
} 
if(a[cn] || a[pn] || b[cn] || b[pn]){ 
return a === b; 
} 
for(d in a){ 
alen++ ; 
} 
for(d in b){ 
blen++; 
} 
if(alen !== blen){ 
return false; 
} 
for(d in a){ 
if(!ce(a[d],b[d])){ 
return false; 
} 
} 
break; 
}; 
} 
return true; 
} 
console.log(compare({},{a:1})); //false 
console.log(compare({a:1},{b:2})); //false 
console.log(compare({b:2,a:1},{a:1,b:2})); //true 
console.log(compare({a:function(){return false;},b:2},{a:function(){return false;},b:2})); //true 
console.log(compare([],[])); //true 
console.log(compare([2,1],[1,2])); //false 
console.log(compare(function(){alert(1)},function(){})); //false 
console.log(compare(function aaa(){alert(1)},function(){alert(1)})); //true 
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[1])); //false 
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[0])); //true
Javascript 相关文章推荐
js实现幻灯片播放图片示例代码
Nov 07 Javascript
使用jquery插件qrcode生成二维码
Oct 22 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
input 禁止输入特殊字符的四种实现方式
Aug 24 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
Sep 05 Javascript
简单的网页广告特效实例
Aug 19 Javascript
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
写一个Vue Popup组件
Feb 25 Javascript
对TypeScript库进行单元测试的方法
Jul 18 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
Jun 05 Javascript
xml转json的js代码
Aug 28 #Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
Aug 28 #Javascript
javascript 判断中文字符长度的函数代码
Aug 27 #Javascript
Jquery 数据选择插件Pickerbox使用介绍
Aug 24 #Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 #Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 #Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 #Javascript
You might like
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
使用cx_freeze把python打包exe示例
2014/01/24 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python3 爬取图片的实例代码
2018/11/06 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
如何用python批量调整视频声音
2020/12/22 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
管道维修工岗位职责
2013/12/27 职场文书
小学毕业家长寄语
2014/01/19 职场文书
北体毕业生求职信
2014/02/28 职场文书
学生评语大全
2014/04/18 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
教师个人学习总结
2015/02/11 职场文书
小学校园广播稿
2015/08/18 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
nginx+lua单机上万并发的实现
2021/05/31 Servers
JavaScript实现优先级队列
2021/12/06 Javascript
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技