/** equals
* @description 比较两个对象是否相等时,
* 需要穿插使用其他对象的equals方法,
* 这里将Javascript核心对象的equals方法扩展集合于此,
* 用于方便实现其他对象的equals方法,
* 建议所有用户创建类中都实现equals方法.
* 该方法在比较数组等对象时尤为有用.
* @create 2009-10-31
* @update
* @author
*/
/** 比较当前对象与指定对象是否相等。
* 覆写并扩展基类(Object),方便子类(如:Array)扩展此方法。
* 这个方法可能用到string, number, function等基本数据类型的wapper类(String, Number, Function)的equals方法。
* @param obj, Object.
* @return Boolean.
*/
Genie=function(){};
Genie.prototype.equalsObject = function(obj1, obj2){
if ((obj1===obj2)){return true;}
if (!(obj1 instanceof Object) || !(obj2 instanceof Object) || (obj1===null) || (obj2===null)){return false;} // null is not instanceof Object.
var i = 0; // object property counter.
for (var k in obj1){
i++;
var o1 = obj1[k];
var o2 = obj2[k];
if ((o1!=null)
&& !(Genie.prototype.equalsObject(o1, o2))
&& !(Genie.prototype.equalsArray(o1, o2))
&& !(Genie.prototype.equalsFunction(o1, o2))
&& !(Genie.prototype.equalsNumber(o1, o2))
&& !(Genie.prototype.equalsBoolean(o1, o2))
&& !(Genie.prototype.equalsDate(o1, o2))
&& !(Genie.prototype.equalsRegExp(o1, o2))){return false;} // inner object.
}
for (var k in obj2){ // compare object property counter.
i--;
}
return i===0;
};
/** 比较当前函数对象与指定对象的值是否完全相等(包括数据类型)。
* 函数的比较比较复杂和怪异,两个构造完全一致的函数的valueOf()值并不相同,这个可以理解。
* 而使用toString()方法,是否也应该先将他们的无效空格和换行去掉?似乎问题变得复杂了。
* 最大的问题是,new Function()和function(){}的toString()方法在不同浏览器中表现不同,详情附注。
* 出于简单性,一致性和函数的特殊性考虑,函数仅且仅在和本身比较时才相等。
* @param number, Number.
* @return Boolean.
*/
Genie.prototype.equalsFunction = function(func1, func2){
return (func1 instanceof Function)&&(func2 instanceof Function)&&(func1.valueOf()===func2.valueOf()); // new Function().valueOf() is not equals new Function().valueOf().
};
/** 比较当前字符串对象与指定对象是否相等。
* @param string, String, Object.
* @return Boolean.
*/
Genie.prototype.equalsString = function(str1, str2){
return ((str1 instanceof String) || (typeof(str1)==="string"))&&((str2 instanceof String) || (typeof(str2)==="string"))&&(str1.valueOf()===str2.valueOf());
};
/** 比较当前数字对象与指定对象是否完全相等(包括数据类型)。
* @param number, Number.
* @return Boolean.
*/
Genie.prototype.equalsNumber = function(num1, num2){
return ((num1 instanceof Number) || (typeof(num1)==="number")) && ((num2 instanceof Number) || (typeof(num2)==="number")) && (num1.valueOf()===num2.valueOf());
};
/** 比较当前布尔对象与指定对象的值是否完全相等(包括数据类型)。
* @param bool, Boolean.
* @return Boolean.
*/
Genie.prototype.equalsBoolean = function(boo1, boo2){
return ((boo1 instanceof Boolean) || (typeof(boo1)==="boolean")) && ((boo2 instanceof Boolean) || (typeof(boo2)==="boolean")) && (boo1.valueOf()===boo2.valueOf());
};
/** 当前日期对象与另一日期对象的值相比较。
* @param date, Date. 相比较的日期对象。
* @return Boolean. 两个日期值是否相等。
* @create 2009-10-31
*/
Genie.prototype.equalsDate = function(date1, date2){
return (date1 instanceof Date)&&(date2 instanceof Date)&&(date1.valueOf()===date2.valueOf());
};
/** 当前正则表达式与指定对象比较是否相等。
* @param regexp, Object.
* @return Boolean.
* @create 2009-10-31
*/
Genie.prototype.equalsRegExp = function(regexp1, regexp2){
return (regexp1 instanceof RegExp)&&
(regexp2 instanceof RegExp)&&
(regexp1.source===regexp2.source)&&
(regexp1.global===regexp2.global)&&
(regexp1.ignoreCase===regexp2.ignoreCase)&&
(regexp1.multiline===regexp2.multiline);
};
/** 判断当前数组对象的值是否与指定对象的值相等。
* 数组的值可以是任意对象(字符/串,数值,日期,数值[即支持多维数组])。
* @using org.xianyun.system.Object.prototype.equals(obj);
* @param array, Array.
* @return Boolean.
* @create 2009-10-31
*/
Genie.prototype.equalsArray = function(arr1, arr2){ // equals compare value, = compare object (address).
if (!(arr1 instanceof Array) || !(arr2 instanceof Array)){return false;}
if (arr1===arr2){return true;}
if (arr1===null || arr2===null){return false;} // null != null.
var l = arr1.length;
if (l!=arr2.length){return false;}
for (var i=0; i<l; i++){
var o1 = arr1[i];
var o2 = arr2[i];
if (!(o1===null ? o2===null : o1.equals(o2))){return false;} // inner array.
}
return true;
};
分享到:
相关推荐
Sameness.js是一个纯JavaScript对象比较库。 它具有检查对象a和b是否为的功能: 相同的对象( ) 相同的对象( ) 等效对象( ) b的子集a ( ) Sameness.js通过Sameness变量公开。 是同样的 检查a和b对象...
第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 JavaScript对象.rar第8节 ...
Javascript 面向对象的JavaScript进阶 Javascript技术
什么是对象 简单点说,编程语言中的对象是对现实中事物的简化。例如,我们一个人就是一个对象,但是编程...在后面的JavaScript对象笔记中,记录了菜鸟在学习JavaScript对象的大多数资源,希望这些资源对你也有价值。
JavaScript面向对象的支持 JavaScript面向对象
javascript对象创建方法总结,通过这些方法的总结,可以对对象有了更深一步的了解,也加深了对对象的巩固认识。
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
支持将自身转换成json字符串输出
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript内置对象相关介绍及用法ppt JavaScript内置对象相关介绍及用法
javaScript内置对象,javaScript,javaScript内置对象,javaScript,javaScript内置对象,javaScript
javascript对象大全
javascript 对象操作作业题,面向对象操作题
JavaScript对象模型
04 第四章 JavaScript对象及初识面向对象.md
JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)...
JavaScript中的对象 ECMA262规范一直在强调,“ECMAScript是一种基于对 象(Object—Based)的语言,而不是传统的面向对象(Object— Oriented)的语言”。相信绝大多数人不会清楚这句话是什么意 思。我想我们可以把它...
js对象比较实现代码。