javascript中的隐式类型转换
在Javascript 中,只有在一些极少数情况下才会因为类型错误而抛出一个异常,大多数情况会偷偷的把类型转换了,这就是所谓的“隐式类型转换”,js中的基本类型有:string、number、boolean、object、symbol、undefined、null,其中object为引用类型。不同类型的变量比较或运算时会产生隐式类型转换。
算术运算
+号可以当算术运算符也能当连字符号,使用+情况为:
1 2 3 4 5 6 7
| // 只要有一个类型为string,另一个也会转为string console.log(1+'1') // '11' console.log('1'+1) // '11' console.log('1'+true) // '11' // number和boolean时,boolean转为number console.log(1+true) // '2'
|
减法,乘,除,大于,小于运算时两边都会转成number,其中一个不能转为number即为NaN时,结果为NaN。
1 2 3 4 5 6 7 8
| console.log(2-'1') // 1 console.log('2'-'1') // 1 console.log('2'-true) // 1 console.log('2'-true) // 1 console.log('2'-'a') // NaN console.log(2-'a') // NaN console.log(2*'a') // NaN console.log(2*true) // 2
|
if中
大多数的值都会转换成true,只有少数的是false,他们分别是:false, 0, -0, “”, NaN, null, undefined。
1 2 3 4 5
| // x为false, 0, -0, "", NaN, null, undefined时才输出 var x = 1; if(x){ console.log('hello'); }
|
两个==时
两者中有布尔值(Boolean),会把Boolean先转换为对应的Number,即0和1;双方中有一方为Number,一方为 String时,会把String转换为数字;双方中有一方为Boolean,一方为 String时,则会先将双方转换为数字。
1 2 3 4 5
| console.log(1==true)//true console.log(1=='1')//true console.log(1=='a')//false console.log(true=='a')//false console.log(true=='1')//true
|
&&和||
会先转成boolean,&&遇到false返回当前,无刚返回下一个;||遇到真就返回
1 2 3 4 5
| console.log(11&&'11')// '11' console.log('0'&&'11')// '11' console.log(''&&'11')// '' console.log(''||'11')// '11' console.log('22'||'11')// '22'
|
引用类型参与时
引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型。引用类型转布尔全是true,引用类型转数字或者字符串就要用valueOf()或者toString()。
1 2 3 4 5 6 7 8 9 10
| console.log(1+[]) //1 console.log(0==[]) // true console.log(0+[]) // 0 console.log('0'+[]) // '0' // 与对象默认valueOf和toString都是object Object // var a = {};console.log(a.toString()==a.valueOf());//true console.log('0'+{}) // '0[object Object]' console.log(0+{}) // '0[object Object]' // 实际上是先优先valueOf console.log(1+{toString:function(){return '1'},valueOf:function(){return 1}})
|