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注册协议倒计时的小例子
Jun 24 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
javascript 自定义回调函数示例代码
Sep 26 Javascript
IE下JS保存图片的简单实例
Jul 15 Javascript
JS开发中基本数据类型具体有哪几种
Oct 19 Javascript
bootstrap轮播模板使用方法详解
Nov 17 Javascript
解决Linux无法正常安装与卸载Node.js的方法
Jan 19 Javascript
JavaScript格式化json和xml的方法示例
Jan 22 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
使用vue完成微信公众号网页小记(推荐)
Apr 28 Javascript
Vue 递归多级菜单的实例代码
May 05 Javascript
Javascript webpack动态import
Apr 19 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应用JSON技巧讲解
2013/02/03 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
Vue中使用vux配置代码详解
2018/09/16 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
Python编程之属性和方法实例详解
2015/05/19 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
培训班开班仪式主持词
2014/03/28 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
召开会议通知范文
2015/04/15 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL