/** 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;
};
分享到:
相关推荐
JavaScript 对象比较实现代码详解 JavaScript 中的对象比较是一个复杂的主题,需要了解多种情况下的比较规则。本文将详细解释 JavaScript 对象比较的实现代码,包括基本类型、对象、数组、函数的比较,关系操作符的...
在JavaScript中,我们可以使用内置的`JSON.stringify()`方法将JavaScript对象转换为JSON字符串。 ### JSON.stringify()方法 `JSON.stringify()`是JavaScript中的全局函数,用于将JavaScript值转换为JSON字符串。它...
JavaScript对象是编程语言的核心组成部分,尤其在Web开发中扮演着至关重要的角色。"JavaScript对象参考手册"涵盖了这一主题的广泛内容,旨在为开发者提供全面、深入的理解和实用指南。手册分为20个章节,不仅涉及...
面向对象编程(Object-Oriented Programming,OOP)是编程的一种重要范式,JavaScript也完全支持这一特性,尽管它并非一种传统的静态类型语言。这篇博客文章可能详细讨论了如何在JavaScript中实现面向对象编程。 在...
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精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...
### 深入浅出JavaScript对象模型 #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,...
JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言(如Java或C++)有所不同。JavaScript中的面向对象特性主要体现在以下几个方面: 1. **基于...
JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象...
### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...
javascript对象创建方法总结,通过这些方法的总结,可以对对象有了更深一步的了解,也加深了对对象的巩固认识。
### JavaScript对象模型详解 #### 一、概述 在JavaScript中,对象模型是其核心特性之一,它决定了数据的存储方式以及程序的运行机制。本文旨在深入解析JavaScript对象模型的关键概念,包括基本数据类型、对象、...
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript内置对象相关介绍及用法ppt JavaScript内置对象相关介绍及用法
JavaScript对象是编程中的一种核心概念,它是一种复合数据类型,能够存储多个不同数据类型的属性。在JavaScript中,对象可以通过多种方式创建,其中一种常见的方法是使用`new`关键字和构造函数,例如`new Object()`...