`
zhkac
  • 浏览: 53960 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论
阅读更多

/** 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 对象比较的实现代码,包括基本类型、对象、数组、函数的比较,关系操作符的...

    javascript对象转换成json

    在JavaScript中,我们可以使用内置的`JSON.stringify()`方法将JavaScript对象转换为JSON字符串。 ### JSON.stringify()方法 `JSON.stringify()`是JavaScript中的全局函数,用于将JavaScript值转换为JSON字符串。它...

    javascript对象参考手册

    JavaScript对象是编程语言的核心组成部分,尤其在Web开发中扮演着至关重要的角色。"JavaScript对象参考手册"涵盖了这一主题的广泛内容,旨在为开发者提供全面、深入的理解和实用指南。手册分为20个章节,不仅涉及...

    Javascript面向对象编程.

    面向对象编程(Object-Oriented Programming,OOP)是编程的一种重要范式,JavaScript也完全支持这一特性,尽管它并非一种传统的静态类型语言。这篇博客文章可能详细讨论了如何在JavaScript中实现面向对象编程。 在...

    sameness.js:Sameness.js是一个纯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对象.rar第8节 ...

    JavaScript对象笔记.rar

    什么是对象 简单点说,编程语言中的对象是对现实中事物的简化。例如,我们一个人就是一个对象,但是编程...在后面的JavaScript对象笔记中,记录了菜鸟在学习JavaScript对象的大多数资源,希望这些资源对你也有价值。

    面向对象JavaScript精要(英文原版pdf)

    ### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...

    深入浅出JavaScript对象模型

    ### 深入浅出JavaScript对象模型 #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,...

    JavaScript面向对象的支持

    JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言(如Java或C++)有所不同。JavaScript中的面向对象特性主要体现在以下几个方面: 1. **基于...

    JavaScript之Date对象(源代码)

    JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象...

    JAVASCRIPT 面向对象编程精要

    ### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...

    JavaScript对象创建总结

    javascript对象创建方法总结,通过这些方法的总结,可以对对象有了更深一步的了解,也加深了对对象的巩固认识。

    JavaScript对象模型

    ### JavaScript对象模型详解 #### 一、概述 在JavaScript中,对象模型是其核心特性之一,它决定了数据的存储方式以及程序的运行机制。本文旨在深入解析JavaScript对象模型的关键概念,包括基本数据类型、对象、...

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    JavaScript内置对象相关介绍及用法

    JavaScript内置对象相关介绍及用法ppt JavaScript内置对象相关介绍及用法

    04JavaScript对象相关内容总结.docx

    JavaScript对象是编程中的一种核心概念,它是一种复合数据类型,能够存储多个不同数据类型的属性。在JavaScript中,对象可以通过多种方式创建,其中一种常见的方法是使用`new`关键字和构造函数,例如`new Object()`...

Global site tag (gtag.js) - Google Analytics