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 相关文章推荐
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
Mar 25 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
jQuery.datatables.js插件用法及api实例详解
Oct 28 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
解决angularjs WdatePicker ng-model的问题
Sep 13 Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
详解vue-property-decorator使用手册
Jul 29 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
JavaScript将数组转换为链表的方法
Feb 16 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对字符串的递增运算分析
2010/08/08 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
详解Django CAS 解决方案
2019/10/30 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
后勤主管岗位职责
2014/03/01 职场文书
中国梦口号
2014/06/13 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
2014会计年终工作总结
2014/12/20 职场文书
永不妥协观后感
2015/06/10 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
python中如何对多变量连续赋值
2021/06/03 Python