强制类型转换
众所周知,
JavaScript
是弱类型语言,所以其值的类型是可以随意进行转换的,分为显式强制类型转换和隐式强制类型转换
1
2
3 let b = 12
let a = '' + b // 隐式强制类型转换
let c = String(b) //显式强制类型转换
抽象值操作
ToString
基本类型值的字符串化规则是:
undefined
转换为'undefined'
,null
转换为'null'
,true
转换为'true'
,这些都能通过toString
完成
1
2 let a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
a.toString() // "1.07e21"
对普通对象来说,只要不是自行定义,否则
toString
返回其内部 属性[[Class]]
的值
1 | let a = [1,2,3] |
ToNumber
使用
toNumber
将非数字值转换为数字使用,包括true
转为1
,false
转为0
等
ToBoolean
JavaScript
的值可分为可以被强制类型转换为false
的值和其他值,而这部分能被转换的值称为假值
假值包括有
undefined
null
false
+0
,-0
和NaN
""
我们可以理解为假值以外的值都是真值,真值转换为布尔值都为true
假值对象
假值对象并不是对象为假值,而是进行对象封装的假值
1 | let a = new Boolean(false) |
上面大的即为假值对象,虽然他们都封装了假值,然而他们并不是false
1
2let d = Boolean(a && b && c)
d //true
显示强制类型转换
显示强制类型即是显而易见的类型转换,包括
toString
,toNumber
等
1
2 let a = '12'
+a // 12
这里的一元运算符+
即可将字符串显示强制转换为数字1
2let b = ''
!!b // false
这里的!!
即可将值显示强制转换为布尔值
隐式强制类型转换
隐式强制转换往往带来很多误解和
bug
针对+
号,如果 +
的其中一个操作数是字符串(或者通过以上步骤可以得到字符串),则执行字符串拼接;否则执行数字加法
1 | var a = 42; |
||
和&&
首先会对第一个操作数 第一个操作数 (a 和 c )执行条件判断,如果其不是布尔值(如上例)就先进行ToBoolean
强制类型转 换,然后再执行条件判断。对于
||
来说,如果条件判断结果为true
就返回第一个操作数(a 和 c )的值,如果为false
就返回第二个操作数(b ) 的值。&&
则相反,如果条件判断结果为true
就返回第二个操作数(b )的值,如果为false
就返回第一个操作数(a 和 c )的 值。
宽松相等(==
)和严格相等(===
)
==
和===
都会检查操作数的类型。区别在于操作数类型不同时它们的处理方式不同。
1
2
3
4
5 var a = 42;
var b = "42";
a === b; // false
a == b; // true
具体转换规则为
(1) 如果 Type(x) 是数字,Type(y) 是字符串,则返回 x == ToNumber(y) 的结果。
(2) 如果 Type(x) 是字符串,Type(y) 是数字,则返回 ToNumber(x) == y 的结果。
其他类型和布尔类型相等比较
规则如下
(1) 如果 Type(x) 是布尔类型,则返回 ToNumber(x) == y 的结果;
(2) 如果 Type(y) 是布尔类型,则返回 x == ToNumber(y) 的结果。
null
和undefined
之间相等比较
(1) 如果 x 为 null ,y 为 undefined ,则结果为 true 。
(2) 如果 x 为 undefined ,y 为 null ,则结果为 true
对象与非对象之间的相等比较
(1) 如果 Type(x) 是字符串或数字,Type(y) 是对象,则返回 x == ToPrimitive(y) 的结果;
(2) 如果 Type(x) 是对象,Type(y) 是字符串或数字,则返回 ToPromitive(x) == y 的结果。