1.js的隐式转换:减号(-)除号(/)乘号(*)求余(%):一律都会转换成数值后计算:
'11' - 2 = 9
'12' / 2 = 6
'12' % 2 = 0
'12' * 2 = 24
2.加号(+):
数字+字符串=字符串,运算顺序从左到右:
1 + '12' = 112
数字+对象,优先调用对象的valueOf->toString:
(toString是把对象转成字符串;valueOf是把数据类型转换成原始类型,也就是说原来是什么类型,转换后还是什么类型,日期类型除外)
[3].toString();//"3"
const obj={
"a":1
}
obj.valueOf();//{a:1}
1 + {a:1};//"1[object Object]"
数字+boolean/null -> 数字(true是1,false是0,null是0):
1 + true = 2;
1 + false = 1;
1 + null = 1;
数字+undefined/NaN=NaN:
1 + undefined/NaN = NaN
[1].toString()==='1'
{}.toString()==='[object object]'
NaN!===NaN、+undefined为NaN
+undefined;//NaN
NaN!===NaN;//true
拓展:
valueOf()会把数据类型转换成原始类型,也就是说原来是什么类型,转换后还是什么类型,日期类型除外。
toString()会把数据类型转换成string类型,也就是说不管原来是什么类型,转换后一律是string类型
valueOf()和toString()的区别:
- valueOf()偏向于运算,toString()偏向于显示
- 对象转换时优先调用toString()
- 强转字符串的情况下,优先调用toString()方法;强转数字的情况下优先调用valueOf()
- 正常情况下优先调用toString()
- 在有运算操作符的情况下valueOf()的优先级高于toString(),这里需要注意的是当调用valueOf()方法无法运算后还是会再调用toString()方法
var a = {
a : 10 ,
toString : function(){
console.log("tostring");
return this.a
}
};
//先调用valueOf()方法,发现无法进行+运算,紧接着调用toString()方法
console.log(+a);//10
var b= {
a:2,
valueOf:function(){
return this.a+2
}
};
//先调用valueOf()方法,返回4,可以进行运算,不再调用toString()
console.log(+b);//4
var b= {
a:2,
valueOf:function(){
return this.a+2
},
toString : function(){
console.log("tostring");
return this.a
}
};
console.log(+b);//4
//先调用valueOf()方法,返回4,可以进行运算,不再调用toString(),从输出上可以看出没有调用toString()方法