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中Math对象使用说明
Jan 16 Javascript
JavaScript学习笔记记录我的旅程
May 23 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
js检查页面上有无重复id的实现代码
Jul 17 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
JS正则表达式验证数字代码
Jan 28 Javascript
javascript强制点击广告的方法
Feb 06 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
Jan 14 Javascript
关于vue的语法规则检测报错问题的解决
May 21 Javascript
JavaScript实现更换背景图片
Oct 18 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 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安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
php自动载入类用法实例分析
2016/06/24 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
JS重要知识点小结
2011/11/06 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Python生成验证码实例
2014/08/21 Python
让Python代码更快运行的5种方法
2015/06/21 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
求职简历推荐信范文
2013/12/02 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
社会调查研究计划书
2014/05/01 职场文书
孟佩杰观后感
2015/06/17 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python