You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vara=42;varb='abc';varc;vard=null;if(a){console.log('yep');// yep}while(c){console.log('nope, never runs');}c=d ? a : b;c;// "abc"if((a&&d)||c){console.log('yep');// yep}
强制类型转换
1.值类型转换
将值从一种类型转换为另一种类型通常称为类型转换, 在 JavaScript 中通常称为强制类型转换,本书为了跟好理解把强制类型转换分为两种
隐式强制类型转换
和显式强制类型转换
2.抽象值操作
ES5 规范中定义了一些“抽象操作”(即“仅供内部使用的操作”)和转换规则。(
ToString``、ToNumber
和ToBoolean
)2.1
ToString
抽象操作 ToString,它负责处理非字符串到字符串的强制类型转换。
2.2
ToNumber
有时我们需要将非数字值当作数字来使用,比如数学运算。为此 ES5 规范定义了抽象操作 ToNumber。
但是对于对象(包括数组) 会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型
值,则再遵循以上规则将其强制转换为数字。
valueOf()
方法。如果有并且返回基本类型值, 就使用该值进行强制类型转换。toString()
的返回值( 如果存在) 来进行强制类型转换。valueOf()
和toString()
均不返回基本类型值
, 会产生TypeError
错误。2.3ToBoolean
JavaScript 中的值可以分为以下两类:
3.显式强制类型转换
3.1 字符串和数字之间的显式转换
toString()
对 42 这样的基本类型值不适用
,所以 JavaScript 引擎会自动为 42 创建一个封装对象
,然后对该对象调用 toString()
。+
c 是+
运算符的一元
( unary) 形式( 即只有一个操作数)。+ 运算符显式地将 c 转换为数字
, 而非数字加法运算日期显式转换为数字
3.2 显式解析数字字符串
解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字。但是解析和强制类型转换两者有明显的区别
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否则会失败并返回 NaN
3.3 显式转换为布尔值
从非布尔值强制类型转换为布尔值的情况
4.隐式强制类型转换
隐式强制类型转换的作用是减少冗余,让代码更简洁,同时会让代码变得晦涩难懂
4.1 字符串和数字之间的隐式强制类型转换
+
运算符即能用于数字加法,也能用于字符串拼接。如果某个操作数是字符串或者能够通过抽象操作转换为字符串的话,+
将进行拼接操作。如果其中一个操作数是对象(包括数组),则首先对其调用抽象操作(toValue、toString)-
减运算符4.2 布尔值到数字的隐式强制类型转换
true 为 1,false 为 0
4.3 隐式强制类型转换为布尔值
相对布尔值,数字和字符串操作中的隐式强制类型转换还算比较明显。下面的情况会发生布尔值隐式强制类型转换
非布尔值会被隐式强制类型转换为布尔值,例子如下
4.4 逻辑运算符||和 &&
&&
和||
运算符的返回值并不一定是布尔类型,而是两个操作数其中一个的值||
来说,如果条件判断结果为true
就返回第一个操作数(a 和 c)的值,如果为 false 就返回第二个操作数(b)的值。&&
则相反,如果条件判断结果为 true 就返回第二个操作数(b)的值,如果为 false 就返 回第一个操作数(a 和 c)的值。4.5 符号的强制类型转换
ES6 允许从符号到字符串的显式强制类型转换,然而隐式强制类型转换会产生错误。
符号不能够被强制类型转换为数字(显式和隐式都会产生错误),但可以被强制类型转换 为布尔值(显式和隐式结果都是 true)。
5.宽松相等和严格相等
宽松相等(loose equals)== 和严格相等(strict equals)=== 都用来判断两个值是否“相
等”,常见的误区是“== 检查值是否相等,=== 检查值和类型是否相等”,正确的解释是:“== 允许在相等比较中进行强制类型转换,而 === 不允许。
5.1 字符串和数字之间的相等比较
如果两个值的类型不同,则对其中之一或两者都进行强制类型转换,根据规范,"42" 应该被强制类型转换为数字以便进行相等比较。
5.2 其他类型和布尔类型之间的相等比较
布尔类型会转换为 Number 类型 true 为 1,false 为 0
5.3 null 和 undefined 之间的相等比
null 和 undefined 之间的 == 也涉及隐式强制类型转换。
这也就是说在
==
中 null 和 undefined 是一回事,可以相互进行隐式强制类型转换。a === undefined || a === null
效果和a == null
5.4 对象和非对象之间的相等比较
关于对象(对象 / 函数 / 数组)和标量基本类型(字符串 / 数字 / 布尔值)之间的相等比教对象会调用抽象操作(valueOf 或者 toSring),布尔值会先转换为数字
The text was updated successfully, but these errors were encountered: