数据类型转换

数据类型转换

强制转换

强制转换主要指使用NumberStringBoolean三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。

Number()

原始类型的值主要是字符串、布尔值、undefined和null,它们都能被Number转成数值或NaN。

// 数值:转换后还是原来的值
Number(324) // 324

// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324

// 字符串:如果不可以被解析为数值,返回NaN
Number('324abc') // NaN

// 空字符串转为0
Number('') // 0

// 布尔值:true 转成1,false 转成0
Number(true) // 1
Number(false) // 0

// undefined:转成 NaN
Number(undefined) // NaN

// null:转成0
Number(null) // 0

Number背后的规则:

  1. 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。

  2. 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。

  3. 如果toString方法返回的是对象,就报错。

var obj = {x: 1};
Number(obj) // NaN

// 等同于
if (typeof obj.valueOf() === 'object') {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}
  • toString(),它的作用是返回一个反映这个对象的字符串;

    • 对于值类型数据(numberstringbooleannullundefined)使用而言,其效果相当于类型转换,将原类型强转为字符。

    • 对于数组Array会以逗号分隔返回。

    • 对于对象,返回[object objectname],其中 objectname 是对象类型的名称。

  • valueOf(),将对象转换成原始类型的值(数值、字符串和布尔值等),并返回;

    具体返回结果

String()

原始类型值的转换规则

  • 数值:转为相应的字符串。

  • 字符串:转换后还是原来的值。

  • 布尔值:true转为"true",false转为"false"。

  • undefined:转为"undefined"。

  • null:转为"null"。

String方法背后的转换规则,与Number方法基本相同,只是互换了valueOf方法和toString方法的执行顺序。

  1. 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

  2. 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

  3. 如果valueOf方法返回的是对象,就报错。

String({a: 1})
// "[object Object]"

// 等同于

String({a: 1}.toString())
// "[object Object]"

Boolean()

除了以下六个值的转换结果为false,其他的值全部为true

Boolean(undefined) // false
Boolean(null) // false
Boolean(-0) // false
Boolean(0) // false
Boolean(+0) // false
Boolean(NaN) // false
Boolean('') // false

http://javascript.ruanyifeng.com/grammar/conversion.html https://segmentfault.com/a/1190000008432611

原始值/原始类型值指的是['Null','Undefined','String','Boolean','Number']五种基本数据类型之一

隐式类型转换

隐式类型转换是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值。

Last updated