JavaScript类型转换

一、常见类型转换方法

1. parseInt()

简介

parseInt() 方法可以根据给定的进制数把一个字符串解析成整数。

parseInt()在转换字符串时:

  • 它会忽略字符串前面的空格,直到找到第一个非空格字符。
  • 如果第一个非空格字符不是数字字符或符号,就会返回NaN。
  • 如果第一个非空格字符是数字字符,它会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

在没有指定基数,或者基数为 0 的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。故永远都要明确给出radix参数的值。
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

既有 全局方法paresInt(),也有ES6的 Number.paresInt().

语法

parseInt(string[, radix])

Params:

  • string:
    被解析的值。如果不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略。

  • radix:
    一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。总是指定该参数可以保证结果可预测。当忽略该参数时,不同的实现环境可能产生不同的结果。

返回值:

返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN

示例:

parseInt('1234blue',10);//1234
parseInt('',10);//NaN
parseInt('0xA',16);//10
parseInt(22.5, 10);//22

parseInt('10',2);//2
parseInt('10',8);//8
parseInt('10',10);//10
parseInt('10',16);//16

2. parseFloat()

简介

parseFloat() 函数解析一个字符串参数并返回一个浮点数。

pareFloat()在解析字符串时:

  • 与paresInt()类似,parseFloat()也是从第一个字符开始解析,一直遇到第一个无效的浮点数字符为止。
  • 如果在解析过程中遇到了除了正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。
  • 字符串中的第一个小数点是有效的,第二个小数点就是无效的了。
  • 如果字符串包含的是一个可解析为整数的数,即没有小数点或小数点后面为0,则会得到整数。

与parseInt()的区别:

对比的方面 parseFloat() parseInt()
前导0 终都会忽略前导的0 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制); 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制)
参数个数 只有一个参数, 只解析十进制值 两个参数,第二个参数是介于2和36之间的整数,表示进制基数

既有 全局方法paresFloat(),也有ES6的 Number.parseFloat().

语法

parseFloat(string)

Params:

  • string:需要被解析成为浮点数的字符串.

示例

parseFloat('3.14')//3.14
parseFloat('314e-2')//3.14
parseFloat('0.0314e+2')//3.14
parseFloat('3.14xxxaa')//3.14
parseFloat('0xA')//0
parseFloat('0908.5')//908.5
parseFloat('22.34.2')//22.34

3.Number()

简介

Number()可以用于任何数据类型。以上parseInt()和parseFloat()则专门用于字符串。

Number()的转换规则:

被转换值 转换规则
Boolean true转换为1,false转换为0
Number 简单的传入和传出
null 返回为0
undefined 返回NaN
String
如果字符串中只包含数字 转换为十进制数,前导0会被忽略
如果字符串中包含有效的浮点格式 转换为对应浮点数值,前导0会被忽略
如果字符串中包含有效的十六进制格式,如‘0xf' 转换为相同大小的十进制值
如果字符串为空,即为'' 返回0,与parseInt,pareFloat将''转换为NaN不同
如果字符串中包含除上述以外的字符 返回NaN
对象 调用对象的ValueOf()方法,然后依照上述规则转换;如果valueOf得到NaN,则调用对象的toString()方法,然后依照上述规则转换

语法

Number(value)

示例

Number(false)//0
Number(12)//12
Number(null)//0
Number(undefined)//NaN
Number('')//0
Number('0011')//11
Number('1.22.2')//NaN
Number('1.22')//1.22
Number('0xff')//255
Number('Hello')//NaN
Number({a:0,b:1})//NaN
Number('100%')//NaN

注意:

parseInt('10px');//10
Number('10px');//NaN

parseInt('');//NaN
Number('');//0

4. 一元正号(+)

一元正号运算符(unary plus operator)位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。

尽管一元负号也能转换非数值类型,但是 一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为 它不会对数值执行任何多余操作

原值 一元正号转换结果
字符串 整数、浮点数
true 1
false 0
null 0
+3     // 3
+"3"   // 3
+true  // 1
+false // 0
+null  // 0

5. Number.prototype.toString()

简介

返回指定 Number 对象的字符串表示形式。

Number 对象覆盖了 Object 对象上的 toString() 方法,它不是继承的 Object.prototype.toString()。

  • 如果被转换的是负数,则会保留负号
  • 进行数字到字符串的转换时,建议用小括号将要转换的目标括起来,防止出错。

语法

num.toString([radix])

参数:

  • num:待转换的Number
  • radix: 指定要用于数字到字符串的转换的基数(从2到36)。如果未指定 radix 参数,则默认值为 10。如果radix不在 2到36之间,将会抛出错误 RangeError。

示例

(17).toString()//"17"
(11.22).toString()//"11.22"
(254).toString(16)//"fe"
(-10).toString(2)//"-1010"
(-0xff).toString(2)//"-11111111"

二、一些情景带来的自动类型转换

1. 条件中的值自动转换为布尔值

发生场景

有时候,一些变量作为条件语句的判断条件,该变量就会被自动转换为布尔值。

例如:

val ? doA(): doB()

if(val) {
  doA()
}

自动转换规则

值类型 转换的布尔值
undefined false
null false
Boolean false就是false ,true就是true
Number 0、+0、-0、NaN是false,其他为true
String ''为false,其他为true
Object true

示例

function testTrue(value) {
  value ? console.log('true'): console.log('false');
}

testTrue(false)//false
testTrue(new Boolean(false))//true
testTrue(null)//false
testTrue(undefined)//false
testTrue('')//false
testTrue('lalala')//true
testTrue(NaN)//false
testTrue(new Number(0))//true
testTrue({a:false})//true

2. 相等操作符==带来的自动类型转换

发生场景

使用==时,不同类型的值也可以看作相等。

转换规则

x,y表示等号两边的两个值的类型。

类型(x) 类型(y) 结果
null undefined true
number string 把y转化为number,再与x进行比较
boolean 任何类型 把x转换为number,再与x进行比较
string或number object 把y转换为原始值,再与x进行比较
object object 如果它们指向同一个对象,则返回true;否则返回false
把其他类型的值转换为number,规则如下:
值类型 结果
undefined NaN
null +0
bool 如果是true,结果为1;如果是false,结果为0
string 解析为数字。如果字符串中包含字母,就返回NaN;如果是由数字字符组成,就返回数字。
object Number(将值转换为原始值)
将对象转换为原始值,规则如下:

如果对象的valueOf()方法返回原始值,则返回原始值;如果对象的toString()方法返回原始值,则返回原始值;其他情况返回一个错误

Tips:Object.prototype.valueOf()

valueOf()方法返回指定对象的原始值

JavaScript调用valueOf方法将对象转换为原始值。很少需要自己调用valueOf方法;当遇到要预期的原始值的对象时,JavaScript会自动调用它,比如==比较的时候有一侧是Object。

JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。

不同类型对象的valueOf()方法的返回值:

对象 返回值
Array 数组对象本身
Boolean 布尔值
Date 从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function 函数本身
Number 数字值
Object 对象本身
String 字符串值
Math和Error 没有valueOf方法

语法

obj.valueOf()
Tips:Object.prototype.toString()

toString() 方法返回一个表示该对象的字符串。

每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

语法

obj.toString()

用例:使用toString()检测对象类型:


Object.prototype.toString.call(new Array())//"[object Array]"
Object.prototype.toString.call([1,2,3])//"[object Array]"
Object.prototype.toString.call(new Date())//"[object Date]"
Object.prototype.toString.call(new String('hhh'))//"[object String]"
Object.prototype.toString.call(Math)//"[object Math]"
Object.prototype.toString.call(undefined)//"[object Undefined]"
Object.prototype.toString.call(null)//"[object Null]"

示例

[] == ![] //true
/* 转换步骤
* 右侧[]为object,自动转换为true,取反后变成false
* 根据"转换规则"表格的第三条,boolean和其他类型值比较时要把boolean值先转换为Number, 右侧的false转换为0
* 根据"转换规则"表格的第四条,object和number或string比较时要转换为原始值,即[].toString(),得到''。这时即是比较''==0
* 根据"转换规则"表格的第二条,number和string类型比较要先把string类型化为number, Number('')得到0。这时即是比较 0==0
× 得到结果true
*/

3. 四则运算符带来的类型转换

转换规则

  • 加法运算: 一方是字符串,另一方也会被转换为字符串类型。加法运算会触发3种类型转换
    • 将值转换为原始值
    • 将值转换为数字
    • 将值转化为字符串
  • 其他运算:只要其中一方是数字,另一方也会被转换为数字

示例

1 + '1' //'11'
2 * '2' //4

[1,2] + [3,4] //'1,23,4'
/* 转换步骤
* [1,2].toString() -> '1,2'
* [3,4].toString() -> '3,4'
* '1,2' + '3,4' -> '1,23,4'
*/

'a' + +'b' //'aNaN'
/* 转换步骤
* +'b' -> 'NaN'
* 'a' + 'NaN' -> 'aNaN'
*/

参考资料

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

《JavaScript高级程序设计》3.4.5 4.
《你不知道的JavaScript》1.3.3,1.3.4

原文地址:https://www.cnblogs.com/Bonnie3449/p/9350835.html