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 相关文章推荐
jQuery 入门讲解1
Apr 15 Javascript
IE6下JS动态设置图片src地址问题
Jan 08 Javascript
一些javascript一些题目的解析
Dec 25 Javascript
js判断iframe内的网页是否滚动到底部触发事件
Mar 18 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
jQuery学习心得总结(必看篇)
Jun 10 Javascript
微信小程序对接七牛云存储的方法
Jul 30 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
Jan 08 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
pnpm对npm及yarn降维打击详解
Aug 05 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/01/26 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
浅谈PHP的反射机制
2016/12/15 PHP
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python库安装速度过慢解决方案
2020/07/14 Python
pip install命令安装扩展库整理
2021/03/02 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
大学本科生的个人自我评价
2013/12/09 职场文书
高三英语教学反思
2014/01/13 职场文书
主题婚礼策划方案
2014/02/10 职场文书
法定代表人资格证明书
2014/09/11 职场文书
扬州个园导游词
2015/02/06 职场文书
军训个人总结
2015/03/03 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
SQL Server Agent 服务无法启动
2022/04/20 SQL Server