`
zhkac
  • 浏览: 52709 次
  • 性别: 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;
};

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics