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 相关文章推荐
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
JavaScript游戏之优化篇
Nov 08 Javascript
js有关元素内容操作小结
Dec 20 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
javascript实现超好看的3D烟花特效
Jan 01 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 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 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python实现点云投影到平面显示
2020/01/18 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
Python 字典中的所有方法及用法
2020/06/10 Python
python如何实现图片压缩
2020/09/11 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
一些Solaris面试题
2015/12/22 面试题
性能测试工程师的面试题
2015/02/20 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
文明村创建实施方案
2014/03/27 职场文书
节能标语大全
2014/06/21 职场文书
整改报告格式
2014/11/06 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers