常见的隐式转换场景
1 .if 判断,其余类型转为布尔类型
2 .比较操作符 ==
[]==[] false
{}=={} false
![]==[] true //前面的取反操作 ,取反之前会把值转换为布尔类型 那么前面的就是一个true,
3 .+,-
var add=1+2+'3'
console.log("33")
var minus=3-true
console.log(minus) 2
4 . 点 号操作符
5 .在对数字,字符串进行点操作方法时,默认将数字,字符串转成对象
var a=2
console.log(a.toString())
// "2"
var b="zhang"
console.log(b.valueOf())
//zhang
5 .关系符比较的时候
3>4
//数字直接比较大小
"2">10
//非数值的话,前部转为数字在比较
"2">"10"
//都是字符串的话,直接比较unicode编码
其他类型转为布尔值
1 .
其他类型转为字符串的情况
1 .null 转为“null”
2 .undefined 转为 “undefined”
3 .Boolean true转为“true”,false转为“false”
4 .number :11 转化为“11”,11e20 科学计数法转为“1.1e+21”
5 .数组,空数组转为字符串“”,如果数组中有null,或者undefined,同样当作空字符串处理,[1,2,3,4]="1,2,3,4"
6 .函数function a(){}转为字符串为 “function a(){}”
7 .一般对象:“[object,object]”
8 .NaN "NaN"
其他类型转为Boolean类型
1 .只有null,undefined,0,false,NaN,空字符串,这6种情况转为布尔值的结果为false,其余都是true
2 .转换为布尔值得场景
for 的第二个
while
if
三元表示符
|| && 左边的操作符
其他数据类型转为Number类型
1 .null 0
2 .undefined NaN
3 .Boolean true 1,false 0
4 .字符串:纯数字的字符串,转为对应的数字,空字符串转为0,其余都是NaN
5 .数组,数组首先会被转换为原始类型,然后根据上面的原始类型转换规则进行转换
[]=0
[0]=0
[1]=1
["abc"]=NaN
6 .对象,和数组一样 {}=NaN
7 .NaN NaN
对象转为其他类型
1 .Data对象会先调用toString
2 .当对象转为其他原始类型时,会先调用对象的valueOf方法,如果valueOf方法返回的是原始类型,直接返回这个原始类型
3 .返回的不是原始类型,或者valueOf方法不存在,继续调用toString()方法。如果toString()返回的是这个原始类型。直接返回这个原始类型,如果不是原始类型,直接报错
var o1 = {
valueOf(){
return 1
}
}
//返回原始类型1 ,结果是1
var o2 = {
toString(){
return 2
}
}
var o3 = {
valueOf(){
return {}
},
//返回这个不是原始类型,继续调用toString类型
toString(){
return 3
}
}
Number(o1) //1
Number(o2) //2
Number(o3) //3
Number([])
//首先[].valueOf = [] 不是原始类型
[].toString = "" 返回一个空字符串,算是原始类型吧,空字符串转为数字是0,所以返回是0
!!
1 .将一个值转换为他为真正的布尔值
2 .!![] false ![]==true
宽松相等的隐式转换
字符串与数字类型相比较
1 .字符串和数字类型相比较的时候,字符串会被转换为数字类型
1 .当字符串是由纯数字组成的字符串时,转换成对应的数字,字符串为空时转换为0,其余的都是NaN
"1"==1 true
""==0 true
"1.1e+21"==1.1e+21 true
"Infinity"==Infinity true
NaN==NaN false
2 .布尔值和其他类型值比较
1 .只要布尔值参与比较,布尔类型就会率先被转换成数字类型
true ==1 true
false ==0 true
true==2 false
""==false true
"1"==true true
3 .null ,undefined 和其他类型的比较
1 .null :代表空值,代表一个空对象指针 typeof null =object 可以看成是一个特殊的对象值
1.1 使用场景;作为原型链的终点,作为函数的参数,表示改函数的参数不是对象
2 .undefined:声明了一个变量,但是没有给变量赋值,此变量的默认值就是undefined
2.2 使用场景
1 .声明了一个变量,但是没有为该变量赋值,此时默认为undefined
2 .函数没有写明确的return ,此时返回undefined
3 .调用函数时,没有传参数,默认参数值为undefined\
4 .对象的某个属性没有赋值,默认值为undefined
4 .js规定null,undefined宽松都与自己相等,但是与其它值都不相等
对象与原始类型相比较
1 .会把对象按照对象转换规则转换成原始类型,再次比较
{}==0 false
({}).valueOf() == {}
({}).toString() == "[object object]"
"[objetc object]"==0 字符串和数字比较,先转为数字,NaN==0 这是最后比较的操作,所以是false
[]==false
[].valueOf() == []
[].toString() == ""
""==false
布尔值比较的时候会先转换为数字,""==0
字符串和数字比较的时候也会转为字符串 0==0 所以最后是true
[1,2,3,4]=="1,2,3,4" true
对象和对象的比较
1 .如果两个对象指向同一个对象,相等操作符返回true,否则返回 false
var a={}
var b={}
a==b false
var a={}
var b=a
a==b true
[]==![] true
//逻辑非 的优先级高于== ,所以现时取反操作,变成了false
此时变成了[] 和false的比较
然后变成了[] 变为 "",false变为0,最后就是""==0的比较,字符串与数字的比较规则 0==0 所以最后是true
{}==!{} false
字符串连接符与加号运算符如何区分
1 .字符串连接符的情况
1 .+的两边,任意一个为字符串
2 .+的两边,其中一边是对象,并且取得原始值为字符串
var c={
valueOf(){return 1}
}
1+undefined NaN 不是1
true+undefined NaN 不是1
true + c 2
NaN + 1 NaN
[]+[]=0
[]+{}= "[object object]"
{}+[] 0
{}会被看作是一个代码块,而不是一个js对象,于是运算就变成了+[] 于是最后得值是0