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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
代码详解JS操作剪贴板
Feb 11 Javascript
Node 升级到最新稳定版的方法分享
May 17 Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 Javascript
JS多个表单数据提交下的serialize()应用实例分析
Aug 27 Javascript
WebPack工具运行原理及入门教程
Dec 02 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
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中对数据库操作的封装
2006/10/09 PHP
php 函数中使用static的说明
2012/06/01 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
Vue页面骨架屏注入方法
2018/05/13 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python实现自动化上线脚本的示例
2019/07/01 Python
解决Mac下使用python的坑
2019/08/13 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
生产部厂长职位说明书
2014/03/03 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
毕业生见习报告总结
2014/11/08 职场文书
导游词之包公祠
2019/11/25 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript
windows系统搭建WEB服务器详细教程
2022/08/05 Servers
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python