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 相关文章推荐
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
Js参数值中含有单引号或双引号问题的解决方法
Nov 06 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
如何实现移动端浏览器不显示 pc 端的广告
Oct 15 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
深入理解JavaScript内置函数
Jun 03 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
jQuery中复合选择器简单用法示例
Mar 31 jQuery
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
Sep 11 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
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python实现求特征选择的信息增益
2018/12/18 Python
python进行文件对比的方法
2018/12/24 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
几个人围成一圈的问题
2013/09/26 面试题
天鹅的故事教学反思
2014/02/04 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
Python各协议下socket黏包问题原理
2022/04/12 Python