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中toFixed()方法引起的问题如何解决
Nov 20 Javascript
手机端转盘抽奖代码分享
Sep 10 Javascript
javascript高级编程之函数表达式 递归和闭包函数
Nov 29 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
js模糊查询实例分享
Dec 26 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
浅谈 Vue 项目优化的方法
Dec 16 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
关于RxJS Subject的学习笔记
Dec 05 Javascript
JavaScript中引用vs复制示例详析
Dec 06 Javascript
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 jQuery
vue深度监听(监听对象和数组的改变)与立即执行监听实例
Sep 04 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删除数组中的特定元素的代码
2012/06/28 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python闭包思想与用法浅析
2018/12/27 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
教你打造完美的创业计划书
2014/01/06 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
小学毕业感言200字
2015/07/30 职场文书
《海上日出》教学反思
2016/02/23 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis