js中的类型转换

250 阅读2分钟

类型转换的三种结果

  1. 转换为数字
  2. 转换为字符串
  3. 转换为布尔值

强制类型转换

转换为数字

Number():将非数值转换为数值

  1. Boolean值,true转换为1,false转换为0
Number(true)  // 1
Number(false) // 0
  1. String类型
  • 字符串中只包含数字转换为十进制数
  • 字符串中只包含浮点数转换为浮点数
  • 字符串中包含十六进制数,转换为十进制
  • 空字符串转换为0
  • 其他转换为NaN
  1. Object
  • 先调用valueOf()方法:如果返回原始值,在原始值的基础上使用Nmuber()方法, 如果返回复合对象,继续调用toString(),如果toString(),返回复合对象,则转换失败,报错
  1. null -> 0
  2. undefined -> NaN

parseInt():将字符串转换为数值(数组除外)

  1. 会从第一个非空字符开始转换,即会忽略开头的空格
  2. 除了字符串之外的值都转换为NaN
  3. 空字符串转换为NaN
  4. 0开头的字符串转换为八进制,0x字符串转换为十六进制
  5. 如果是数组,取数组的第一个元素进行类型转换
parseInt('hello') // NaN
parseInt('') //NaN
parseInt('  22.5') // 22
parseInt('  22.5blue') // 22
parseInt('  fdaf22.5blue') // NaN
parseInt('070') // es5会返回56 es6会返回70 解决办法如下
parseInt('0xf') // 15
parseInt([1,2,3,'4']) // 1
parseInt(['1',2,3,'4']) // 1   
parseInt(['22.5blue',2,3,'4']) // 22
  • 为parseInt(),传入第二个参数,表示转换后的进制
parseInt('070',10) // 70
parseInt('070',8)  // 56

parseFloat():将字符串转换为数值

与parseInt()的行为基本相同

转换为字符串

toString()

  1. Boolean值转化为相应的'true'、'false'
  2. Number转换为相应的字符串
  3. null、undefined会报错
  4. 复杂数据类型:调用对应的内置的或重写的toString()
var obj = {}
obj.toString() // "[object Object]"

String()

  • 行为与toString()基本相同
  • 不同:String(null) -> 'null';String(undefined) -> 'undefined';

转换为Boolean

null, undefined, false, '', 0,+0,-0,NaN转换为false,其他都转换为true。

隐式类型转换

&&、||、!、条件判断语句中,隐式转换为Boolean

四则运算

加法 +

  1. 两边都是数字,进行的加法运算
  2. 一边是数字,一边是字符串,进行的字符串拼接
  3. 其他情况,转换为字符串再进行处理

减法、乘法、除法

  1. 首先调用Number()进行转换,然后进行减、乘、除运算
  2. 如果Number方法返回了NaN,那么运算结果为NaN

关系运算符

>=、<=、 >、 <

  1. 两侧都是数值,进行数值比较
  2. 两侧都是字符串,进行字符编码比较
  3. 其他的先进行Number()转换,然后进行比较
  4. 如果Number()比较一侧出现了NaN,则返回false (原因:NaN和任何类型比较包裹NaN本身都返回false)

==

  1. null == undefined
  2. 一侧是string,另一侧是number,会将字符串转换为number
  3. 一侧是boolean,那么会转换为number
  4. NaN不和任何之相等包括NaN本身
  5. 一侧是Object,另一侧为string或者number,就会把object转换为原始类型
  • 如果部署了[Symbol.toPrimitive] 接口,首先调用[Symbol.toPrimitive] 接口,如果返回的是基础类型结束,如果返回的不是抛出错误
  • 如果没有部署[Symbol.toPrimitive] 接口,先调用valueOf()如果返回了NaN,那么继续调用toString()
  1. 如果两边都是对象,判断它是否指向同一个对象。

##练习题

true + false //1
12 / '6' //2
'number' +18 +9 // 'number189'
15+3+'number' // '18number'
[1] > null // true
[1] > undefined // false
'foo' + +'bar' // 'fooNaN'
'true' == true //false
false == 'false' //false
null == ''  // false
!!"false" == !!"true" //true
["x"] == "x" // true
[] + null + 1 // 'null1'     TODO
[1,2,3] == [1,2,3] //false
{} + [] + {} + [1] // '0[object Object]1'
! + [] + [] + ![] // 'truefalse'
new Date(0) - 0 //0
new Date(0) + 0  //'Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)0'

[] == ![]

[] == false
0 == 0