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 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
jquery.ui.progressbar 中文文档
Nov 26 Javascript
JavaScript实现删除,移动和复制文件的方法
Aug 05 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
详解Vue双向数据绑定原理解析
Sep 11 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
JavaScript实现英语单词题库
Dec 24 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判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中os.path用法分析
2015/01/15 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
python中列表和元组的区别
2017/12/18 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
python数据归一化及三种方法详解
2019/08/06 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
安卓程序员求职信
2014/02/28 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
golang中的并发和并行
2021/05/08 Golang
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
使用Python获取字典键对应值的方法
2022/04/26 Python