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 backgroundImage控制
May 19 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
Jan 15 Javascript
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
jquery原理以及学习技巧介绍
Nov 11 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
Vue Render函数原理及代码实例解析
Jul 30 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脚本的10个技巧(2)
2006/10/09 PHP
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
vue a标签点击实现赋值方式
2020/09/07 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
Python3学习urllib的使用方法示例
2017/11/29 Python
Python简单生成随机数的方法示例
2018/03/31 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
迟到检讨书1000字
2014/01/15 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
临时租车协议范本
2014/09/23 职场文书
2015年植树节活动总结
2015/02/06 职场文书
用Python生成会跳舞的美女
2022/01/18 Python
浅谈Vue的computed计算属性
2022/03/21 Vue.js
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers