一、如何实现下面代码
var a = ???
if(a == 1 && a == 2 && a == 3){
console.log(1)
}
//如何编写a才能打印出1
思路:要想正确打印出1,那么按照代码所示,就必须a既等于1,又等于2,又等于3,这样一看好像不太可能实现,但是我们发现a和这些数字进行比较的时候是==,会进行隐式转化,那么如果把a设计为复杂数据类型,这样每次进行隐式转化的时候都会调用valueof()方法,我们就能重写valueof(),实现这个代码。
var a = {
i: 0,
valueof: function(){
return ++a.i //在这里返回i值,每次调用之前,都把i值+1
}
}
二、空数组和空对象的一些隐式转化
三、null和undefined的区别
null:表示此处不应该有值
如:原型链的终点__prototype__为null
undefined:表示此处有值但未定义
如: 1、变量定义了但是还没有赋值
2、函数没有返回值
3、函数的参数没有传入
var a //a为undefined
var f = function(){ } //f为undefined
var f1 = function(x){ x = x+1 } //f1为undefined
四、字符串的一些隐式转化
1、若关系运算符的两边若只有一个string,则会把string转为number;
2、若关系运算符的两边都是string,则会先会根据字符串的unicode编码比较大小(通过string.charCodeAt()查看),逐位进行比较
五、&& 和 ||
两者都是在能确定结果的时候就直接输出结果
a || b
//a为true时,可以确定结果了,因为b不论是true还是false整个表达式的结果都是true
//a为false,还要继续判断b,这时候就直接返回b的值
a && b
//a为true时,不能确定整个表达式的结果,这是会输出b
//a为false时,直接就输出false