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

来源:互联网 发布:基于java博客 编辑:程序博客网 时间:2024/04/30 13:13
  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)//falseconsole.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));
0 0
原创粉丝点击