js隐式类型转换
在js中当程序运行到不是明显类型转换的表达式时,编译器会做隐式的类型转换,而后再运算
隐式类型转换规则
1、转换成string类型:如果 "+" 运算符的一个操作符是字符串,它会将另一个操作符转换成字符串
数值 + (string类型)、布尔型 + (string类型)、undifined + (string类型)、null + (string类型)会直接转换成string类型(String(x))再运算
1 + "1" //11
//相当于
String(1)+"1"
true + "12" // true12
//相当于
String(true)+"12"
null+"12" //null12
//相当于
String(null)+"12"
undefined+"12" //undefined12
//相当于
String(undefined)+"12"
引用类型(Object,Array等) + (string类型):如果本身具有toString()方法则调用这个方法将其的原始值转换为字符串,如果没有toString()或者是toString()方法不返回一个原始值则调用valueOf()方法获取原始值并将其转换成字符串,如都没有则抛出类型错误异常
[1,2]+"ab" // 1,2ab
//相当于
[1,2].toString()+"ab"
{}+"ab" // [object Object]ab
//相当于
{}.toString()+"ab"
new Date()+"ab" // Thu Aug 01 2019 10:59:16 GMT+0800 (中国标准时间)ab
相当于
new Date().toString()+"ab"
[1,2]+[2,1] // 1,22,1
// [1,2].toString()返回值是字符串,+变成连接字符
相当于
[1,2].toString()+[2,1].toString()
2、转换成number类型:运算符(算术运算符:+ - * / 关系运算符:> >= < <= != ==)将其操作数转成数字
1+undefined // NaN
// 相当于
1+Number(undefined)
1+null // 1
//相当于
1+Number(null)
2*"2" // 4
// 相当于
2*Number("2")
2>'a' // false
//关系运算符的操作符有string类型时先转为对应字符的 Unicode 编码再转为数字
//相当于
2>'a'.charCodeAt() // 'a'.charCodeAt() => 97
引用类型转数字时:如果具有valueOf()方法则返回其原始值,再转换成数字;否则,如具有toString()方法则返回其原始值再转为数字,再否则抛出类型错误异常
[]+2 // 2
//相当于
Number([].valueOf())+2
[]==0 // true
// 相当于
Number([].valueOf())==0)
3、转为boolean类型:"!"运算符将其操作数转换成布尔值并取反
!'a' // false => !Boolean('a')
!null // true => !Boolean(null)
!undefined // true => !Boolean(undefined)
!0 // true => !Boolean(0)
!"" // true => !Boolean("")
!1 // false => !Boolean(1)
类型转换:
参考:
JavaScript权威指南