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的面向对象(二)
Nov 09 Javascript
用 JavaScript 迁移目录
Dec 18 Javascript
javascript Firefox与IE 替换节点的方法
Feb 24 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
使用JavaScript的AngularJS库编写hello world的方法
Jun 23 Javascript
javascript中的altKey 和 Event属性大全
Nov 06 Javascript
jQuery插件实现文字无缝向上滚动效果代码
Feb 25 Javascript
javascript检测移动设备横竖屏
May 21 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
JavaScript 作用域实例分析
Oct 02 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去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
jqTransform美化表单
2015/10/10 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
Mac 上切换Python多版本
2017/06/17 Python
Python3 replace()函数使用方法
2018/03/19 Python
浅析python参数的知识点
2018/12/10 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
python中的插入排序的简单用法
2021/01/19 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
二手房买卖协议书
2014/04/10 职场文书
无传销社区工作方案
2014/05/13 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android