之前在总结数据类型的同时总结了一些显示类型转换的方法。熟悉显式类型转换后,能对隐式类型转换有更深入的理解,在实际开发中避免踩坑。
一个问题
在实际开发或面试中如果遇见两个数字字符串相加,如‘123’+‘456’,怎么快速的得到计算结果?
众所周知,如果 “+”两边一个是字符串或者两个都是字符串,会进行拼接,而不是相加。运算之前,必先进行类型转换,根据以前的知识,可通过Number(‘123’) + Number(‘456’)得到结果。理解隐式类型转换后能更简单的得到结果。
隐式类型转换
1. isNaN( )
《JS基本数据类型——Number》中提到,isNaN()函数用来判断参数是否”不是数值“,isNaN()在接收到一个值后,会尝试将这个值转换为数值,任何不能转换为数值的值都会返回true。
尝试将这个值转换为数值,就是这个函数牵扯到的隐式转换。
执行此函数,会先将参数传入Number( ),再判断转换结果是否为NaN。
isNaN('hello');//true
isNaN('123');//false
isNaN(‘hello’);语句,内部执行Number(‘hello’),结果为NaN,则返回true。
isNaN(‘123’);语句,内部执行Number(‘123’),结果为123,不是NaN,所以返回false。
2. ++/- - 与+/-(一元正负运算)
2.1 ++/- -
var a = '123';
a ++;//124
var b = 'abc';
b ++;//NaN
typeof(b)//number
同样,在进行++运算之前,会先将变量传入Number( ),转换为数值类型再进行++
b的例子说明,经过隐式转换后,即使转换结果为非数字(NaN),变量类型依然为数值类型
a --, ++ a, - - a同理
2.2 +/-
var a = -'123';//-123
typeof(a)//number
var b = -'abc';//NaN
typeof(b)//number
同样,经过隐式转换后,即使转换结果为非数字(NaN),变量类型依然为数值类型
3. +
var a = 'abc' + 1;//'abc1'
typeof(a);//String
当+号两边有一个为字符串时,会调用String(),将两边都转换为字符串类型再进行拼接
通过此特性可知,若在实际开发中需将两个数字字符串的值相加,直接相加会拼接字符串,使用2.2中的到的结论在变量名前加上+号通过隐式转换能快速得到结果
var a = '123';
var b = '456';
console.log(a+b); //'123456'
console.log((+a) + (+b));//579
console.log(typeof(a+b));//string
console.log(typeof((+a) + (+b)));//number
4. -、*、/、%
var a = '1' - 0;//1
typeof(a);//number
var b = 'a' * 1;//NaN
typeof(b);//number
-、*、/、%运算前,先对运算符两侧通过Number()转换为数值类型再进行运算。开篇问题又多出一个解决思路
var a = '123';
var b = '456';
console.log((a - 0) + (b - 0));//579
console.log(typeof((a - 0) + (b - 0)));//number
5. &&、||、!
在与或非时,会使用Bolean()转换为布尔值
6. < > <= >= == !=
var a = 1 > '2';//false
var b = 1 == '1';//true
var c = 1 == true;//true
有数字进行比较时,会将两边都转换为数值类型,再进行比较。
因为 1 == ‘1’会进行隐式类型转换,结果为true。所以在严格比较时使用“===”
var a = 1 === '1';//false