- 对象创建表达式:
以前以为创建对象都是要带括号,比如:
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));