在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}})