隐式转换
当运算符在运算时,两边数据不统一,编译器会自动将两边数据进行数据类型转换成统一的再计算。
常见的隐式转换:
逻辑语句的类型转换:当使用if、while、for 时,隐式转换为布尔值;
逻辑表达式:
! 逻辑非,隐式转换为布尔值,并取反,!!两次逻辑非,隐式转换为布尔值;
|| 和 && 会将非布尔值操作数,隐式转换为布尔值,再判断;
算术表达式
递增递减++ --,一元加减 +a、- a(结果的符号取反),二元 -,乘法,除法,求模,隐式转换为 Number;
+运算符:
不同类型间的转换规则
如果其中一个操作符是对象,则进行对象到原始值的转换(这里是通过 toString 方法获取);
进行了对象到原始值的转换后,如果其中一个操作数是字符串,则另一个操作数也会转换成字符串,再进行连接;
否则两个操作数都转换为数字(或者NaN),然后进行加法操作。
具体使用时,需要考虑加法的结合性对运算顺序的影响
== 运算符:
注意:尽管 if 语句会隐式转换为布尔值,但 == 运算符并不会自动得将操作数转换为布尔值。
不同类型间的转换规则
1、null == undefined 为true,和其他的比较都为false;
2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,再进行比较;
a. NaN 与所有值都不相等,包括它自己,可使用 isNaN() 来判断一个值是否是数字;
console.log(NaN=="dsdd"); // false 字符串"dsdd"转为数字为NaN,但是NaN != NaN
b. 数字间比较,以0开头是8进制;
console.log(012==10); // true
console.log(099==99); // true 这种情况是因为八进制中不可能出现9,所以看成一个十进制
c.如果一个值是布尔值,转换为数字再比较;
true == '2' // false, 先把 true 变成 1, '2' 变成 2
3、如果一个值是对象,另一个是数字或字符串或 symbol,将对象转换为原始值再比较(调用 valueOf 方法);
a. 注意,同类型比较时,对象间除非指针一样,否则它就是两个不同的对象;
4、其他不同类型比较均不相等;
原文链接:https://blog.csdn.net/Dreamy_LIN/article/details/111595760