强制类型转换
使用parseInt()
、parseFloat()
、Number()
、Boolean()
、String()
、toString()
进行数据类型转换
Number()
参数 | 结果 |
---|---|
undefined | NaN |
null | 0 |
布尔值 | true转换为1,false转为0 |
数字 | 不转换,返回数字 |
字符串 | 字符串只包含数字(包括正负号),转为10进制数,字符串为空,转为0,字符串中包含非数字字符,转为 NaN |
String()
参数 | 结果 |
---|---|
undefined | ’undefined‘ |
null | ’null‘ |
布尔值 | 转换为'true' 或 'false' |
数字 | 数字转换字符串,比如:1.765转为'1.765' |
字符串 | 无须转换 |
PS:String() 能够将任何类型的值转换为字符串,不知道要转换的值是不是 null 或 undefined 的情况下,使用String() ,而toString()不能转化undefined和null,因为两者没有该方法,会报错。,
引用类型中,数组的toString()是把每个数组的元素以,分割的字符串的形式返回的,
其余的返回[object type]
,其中type是对象的类型
Boolean()
5个falsy值
除了这五个falsy值:''(空字符串)、0、NaN、undefined、null的,其他的值为true
隐式类型转换
四则运算符
+操作符
一元+:对非数值进行 Number() 转换;
二元+:
- +号两边只要其中一个是String类型,就将另一个也转为String进行拼接
- 两边都不是String类型,则对非数值进行 Number() 转化
1 + 'true'//’1true‘
1 + true//'2'
1 + null//1 1+0=1
1 + undefined//NaN 1+NaN=NaN
其余操作符只要其中一个是Number类型,就将另一个也转为Number进行计算
关系运算符
关系运算符会把其他数据类型转化为Number再比较关系
<、>、<=、>=运算符
- 有一边是字符串,对字符串使用Number()转成数字后进行比较
- 两边都是字符串,比较两个字符串对应的unicode编码值
//单字符比较
'9'>'50'//true '9'.charCodeAt(0)=57,'50'.charCodeAt(0)=53
//多字符比较
'abc'>'b'//false 从左到右依次比较,先比较'a'和'b' 'a'.charCodeAt(0)=97,'b'.charCodeAt(0)=98
== 运算符
比较相等性之前,不能将null和undefined转换成其他任何值。就是undefined和null与其他数在进行相等判断时不进行类型转换。null == undefined //true
类型相同时,没有类型转换,注意NaN不与任何值相等,包括自身。NaN !== NaN。
不同数据类型的转换按下图方式进行转换
对象转换为基本类型
- 先查找对象的
valueOf
方法,(Date对象是先查找toString
)如果有且返回基本类型值,则使用该值 - 如果没有就使用 toString 方法的返回值(如果存在)来进行强制类型转换
一些例子:
[]==[]//false,比较的是内存中的地址
[] == ![]//true,根据运算符优先级,!优先级大于==,先执行![],“!” 为逻辑非,在操作非布尔值类型的数据时,会将该数据类型先转换为布尔值后再取反,而Boolean([])返回true,所以表达式相当于[]==false,false转数值为0,[]先调用valueOf方法,返回this,不是原始值,继续调用toString方法, [].toString() = ''。''调用Number方法,转为数字0。0==0,返回true
{}=!{}//false,左边 ({}.toString())返回'[Object Object]',调用Number方法,返回NaN
[null] == 0//true,[null].toString() = '', Number('')=0
[null] == false//true
null == 0//false, null不进行类型转换
[undefined] == false //true,[undefined].toString() = ''Number('')=0
[null]==[]//false 两个数组比较
[undefined] == [] //false,两个数组比较,比较索引是否相同