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 getStyle获取最终样式函数代码
Apr 01 Javascript
jQuery Ajax提交表单查询获得数据实例代码
Sep 19 Javascript
JS Map 和 List 的简单实现代码
Jul 08 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
Jan 14 Javascript
探究JavaScript中的五种事件处理程序方式
Dec 07 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
vue-cli webpack 引入swiper的操作方法
Sep 15 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
May 16 Javascript
jquery实现弹窗(系统提示框)效果
Dec 10 jQuery
Vue循环中多个input绑定指定v-model实例
Aug 31 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
基于文本的搜索
2006/10/09 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
use jscript List Installed Software
2007/06/11 Javascript
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python的sorted用法详解
2019/06/25 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
SQLServer之常用函数总结详解
2021/08/30 SQL Server