javascript权威指南学习笔记(四)

本文探讨了JavaScript中对象的创建方式及相等性比较的方法。详细分析了不同情况下使用==与===的区别,包括对象如何通过toString或valueOf方法转换为原始值进行比较。并通过自定义equals方法实现了更复杂的对象比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 对象创建表达式:
    以前以为创建对象都是要带括号,比如:
var date=new Date();

var obj=new Object();

今天才发现,其实如果不需要参数给构造函数的话,是可以省略括号的

var date=new Date;
var obj=new Object;

2、 相等和不相等运算符
这几年在编程过程中,判断对于或者不对于一般用==、!=;像===、!==基本上没怎么用。
判断也是在原始类型中比较多,判断是否是某个字符串、某个值啊

if (typeof(opts.focusFun) == "function") {
    }
 if ($("#phoneAwake").attr("checked") == "checked") {
}
var User=function(){
    this.name="张三";
}
console.log(user1=="张三");//输出false

这个输出false是比较容易理解的

var User=function(){
    this.name="张三";
}
User.prototype.toString=function(){
        return this.name;
}
console.log(user1=="张三");//输出true
var User=function(){
    this.name="张三";
}
User.prototype.valueOf=function(){
        return this.name;
}
console.log(user1=="张三");//输出true

如果一个值是对象,另外一个值是数字或者字符串是,对象会通过toString()或valueOf()方法转为原始值,然后再进行比较。

突发奇想 ,那如果是2个对象比较呢?是不是都转换成原始值进行比较呢

var User=function(){
    this.name="张三";
}
User.prototype.toString=function(){
        return this.name;
} 
var user=new User();
var user1=new User();  
console.log(user1==user)//false
console.log(user1===user)//false

也是醉了,并没有获得我想要的结果,让我想起java里面用set时、会调用对象的equals方法来比较俩个对象是否一样,来保证set集合的唯一性。
自己也试着写了个equals方法:

var User=function(){
    this.name="张三";
}
var user1=new User();
var user2=new User();
Object.prototype.equals=function(otherObj){
    var objOne=this;
    //如果 objOne和otherObj 是指向同一内存对象 则相等
    if(objOne===otherObj){
        return true;
    }
    //比较的2个对象必须是Object
    if(!(objOne instanceof Object)||!(otherObj instanceof Object)){
        return false;
    }
    //判断2个对象的构造函数是否相同
    if(objOne.constructor!=otherObj.constructor){
        return false;
    }
    //判断2个对象的属性是否相等
    for(var prop in objOne){
        if(objOne.hasOwnProperty(prop)){
            //在objOne 里的属性是否在otherObj中存在 如果不一致 则不相等
            if(!otherObj.hasOwnProperty(prop)){
                return false;
            }
            //如果是原始值类型 应该严格相等 如果不一致则不相等
            if(objOne[prop]===otherObj[prop]){
                continue;
            }
            //如果代码执行到这表示continue 没有起效 则表示参数要么不是原始值类型 要么就是object
            //如果是object 则需要通过对象方式再校验 如果是原始值类型 则表示对象的属性不一致
            if(typeof objOne[prop]!="object"){
                return false;
            }
            //如果不是原始值类型 那一定是object类型
            if(!objOne[prop].equals(otherObj[prop])){
                return false;
            }
        }
    }
    //如果otherProp含有相应的属性  而 objOne 没有则也不相等
    for(var otherProp in otherObj){
        if(otherObj.hasOwnProperty(otherProp)&&!objOne.hasOwnProperty(otherProp)){
            return false;
        }
    }
    return true;
}
console.log(user1.equals(user2));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值