We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
javascript中的类型转换。可以说是一种灾难。情况复杂繁多,而且很多时候得到的结果会显得莫名其妙。在讲述类型转换之前,先来看下比较简单的javascript中有六种基础类型的转换:Undefined、Null、Boolean、Number、String、Object。
Undefined
Null
Boolean
Number
String
Object
在总结规范和一些博文后,我发现有两个类型和一个方法比较重要。两个类型是String和Number,一个方法是toPrimitive
toPrimitive
基础类型之间的转换比较简单。
在javaScript 中,使用Boolean函数进行转换的话,只有 6 种值可以被转换成 false,其他都会被转换成 true。注意不传参数的情况下,默认参数为false
false
console.log(Boolean()) // 默认情况是false // 以下六种会返回false console.log(Boolean(undefined)) // false console.log(Boolean(null)) // false console.log(Boolean(+0)) // false console.log(Boolean(-0)) // false console.log(Boolean(NaN)) // false console.log(Boolean("")) // false
转数字使用Number函数,内部会调用ToNumber,转换的结果如下:
ToNumber
String转换成Number总体来说,如果字符串不是字面的数字(StringNumericLiteral, 我的理解是字符表示数字),那么结果就是NaN。在解析字符的时候,会忽略所有的前导0和空格(和换行),如果字符是前缀是0x或者0X,则会使用16进制进行解析。
StringNumericLiteral
NaN
0x
0X
要注意,这个`toNumber`要比`parseInt`和`parseFloat`方法更加严格。字符串`100af`用`parseInt`是可以转换成`100`的,但是调用`toNumber`的话,结果是`NaN`
和Number类似,字符串转换,内部会调用ToString方法,这个方法是内部方法,不同于大家知道的这Object原型里的方法toString。ToString转换结果如下表
ToString
toString
String(m)
具体规范这个参考这里 9.8
+0
-0
0
这个方法主要是用在对象转原始值的情况下。在上面的小节中表格有提到对象转字符和数字的情况。大体的思路其实就是先调用toPrimitive方法,然后把得到的结果传入ToString/ToNumber中,得到最后的结果。toPrimitive方法有两个参数,一个是需要转换的值,另一个就是可选参数的转换类型(有两种String和Number)。根据规范toPrimitive的规则如下:
valueOf
TypeError
有+运算符号、==、if条件语句和逻辑运算(&& ||)的情况下,会发生类型转换
+
==
if条件语句
(&& ||)
一个+的时候,和Number是一样的
一个和基础的问题就是,1+'1'是数字转换成字符串,那么1 + {}呢?
1+'1'
1 + {}
执行value1 + value2的过程是这样,根据规范总结如下:
value1 + value2
lref
GetValue
lval
rval
ToPrimitive
lprim
rprim
回答上面提到的问题,1 + {}分别计算左右的原始值。1不用转换,{}转换成原始值,根据上面的toPrimitive小节我们知道,先调用valueOf转换成{},不是原始值,再调用toString(),结果是[object Object]。规范中还涉及到最后计算的结果,这里就不讨论了,可以参考具体的规范
{}
toString()
[object Object]
宽松相等会有转换的情况发生,有兴趣的可以看下规范,我觉得没有必要去记忆,最好的办法就是使用严格相等(===),避免会发生到的怪癖情况,编程是工作,而不是考八股文。
||和 &&并不能算是逻辑运算符,应该叫选择器运算符.||和 &&返回结果不一定是一个布尔值,二是两个操作数里面的一个.||和&&首先会对第一个操作数(a 和 c)执行条件判断,如果其不是布尔值(如上例)就先进行 ToBoolean强制类型转换,然后再执行条件判断。对于||来说,如果条件判断结果为true就返回第一个操作数(a 和 c)的值,如果为false就返回第二个操作数(b)的值。&&则相反,如果条件判断结果为true就返回第二个操作数(b)的值,如果为false就返回第一个操作数(a 和 c)的值。
||
&&
ToBoolean
true
||使用
function foo(a,b) { a = a || "hello"; b = b || "world"; console.log( a + " " + b ); } foo(); // "hello world" foo( "yeah", "yeah!" ); // "yeah yeah!"
&&使用,可以看到,b最后是0,并不是布尔值
function foo() { console.log( a ); } var a = 0; var b = a && foo(); // b = 0
The text was updated successfully, but these errors were encountered:
No branches or pull requests
javascript中的类型转换。可以说是一种灾难。情况复杂繁多,而且很多时候得到的结果会显得莫名其妙。在讲述类型转换之前,先来看下比较简单的javascript中有六种基础类型的转换:
Undefined
、Null
、Boolean
、Number
、String
、Object
。在总结规范和一些博文后,我发现有两个类型和一个方法比较重要。两个类型是
String
和Number
,一个方法是toPrimitive
原始值转原始值
基础类型之间的转换比较简单。
转boolean
在javaScript 中,使用
Boolean
函数进行转换的话,只有 6 种值可以被转换成 false,其他都会被转换成 true。注意不传参数的情况下,默认参数为false
转数字
转数字使用
Number
函数,内部会调用ToNumber
,转换的结果如下:toPrimitive
方法转换, 再把把结果传入ToNumber返回结果, 后面有介绍String
转换成Number
总体来说,如果字符串不是字面的数字(StringNumericLiteral
, 我的理解是字符表示数字),那么结果就是NaN
。在解析字符的时候,会忽略所有的前导0和空格(和换行),如果字符是前缀是0x
或者0X
,则会使用16进制进行解析。转换成String
和
Number
类似,字符串转换,内部会调用ToString
方法,这个方法是内部方法,不同于大家知道的这Object
原型里的方法toString
。ToString
转换结果如下表toPrimitive
方法转换, 再把把结果传入ToString返回结果, 后面有介绍Number转换成String
具体规范这个参考这里 9.8
NaN
+0
或-0
,则返回0
....
常见的对象转字符串
toPrimitive
这个方法主要是用在对象转原始值的情况下。在上面的小节中表格有提到对象转字符和数字的情况。大体的思路其实就是先调用
toPrimitive
方法,然后把得到的结果传入ToString
/ToNumber
中,得到最后的结果。toPrimitive
方法有两个参数,一个是需要转换的值,另一个就是可选参数的转换类型(有两种String和Number)。根据规范toPrimitive
的规则如下:toString
方法,则调用方法, 如果得到的是一个原始类型的值就返回结果valueOf
方法, 如果得到的是一个原始类型的值就返回结果TypeError
异常valueOf
方法, 如果得到的是一个原始类型的值就返回结果toString
方法, 如果得到的是一个原始类型的值就返回结果TypeError
异常隐形转换的情况
有
+
运算符号、==
、if条件语句
和逻辑运算(&& ||)
的情况下,会发生类型转换+号们
一个+的时候,和
Number
是一样的二元操作符 value1 + value2
一个和基础的问题就是,
1+'1'
是数字转换成字符串,那么1 + {}
呢?执行
value1 + value2
的过程是这样,根据规范总结如下:lref
, 通过GetValue
得到值lval
rval
ToPrimitive
分别计算lval
和rval
,得到个子的原始值lprim
和rprim
lprim
或者rprim
是字符类型,那么就使用字符串拼接方法,否则转换成数字类型回答上面提到的问题,
1 + {}
分别计算左右的原始值。1不用转换,{}
转换成原始值,根据上面的toPrimitive
小节我们知道,先调用valueOf
转换成{}
,不是原始值,再调用toString()
,结果是[object Object]
。规范中还涉及到最后计算的结果,这里就不讨论了,可以参考具体的规范相等==
宽松相等会有转换的情况发生,有兴趣的可以看下规范,我觉得没有必要去记忆,最好的办法就是使用严格相等(===),避免会发生到的怪癖情况,编程是工作,而不是考八股文。
|| 与 &&
||
和&&
并不能算是逻辑运算符,应该叫选择器运算符.||
和&&
返回结果不一定是一个布尔值,二是两个操作数里面的一个.||
和&&
首先会对第一个操作数(a 和 c)执行条件判断,如果其不是布尔值(如上例)就先进行ToBoolean
强制类型转换,然后再执行条件判断。对于||
来说,如果条件判断结果为true
就返回第一个操作数(a 和 c)的值,如果为false
就返回第二个操作数(b)的值。&&
则相反,如果条件判断结果为true
就返回第二个操作数(b)的值,如果为false
就返回第一个操作数(a 和 c)的值。||
使用&&
使用,可以看到,b最后是0,并不是布尔值The text was updated successfully, but these errors were encountered: