聊聊JS中的类型转换机制~

602 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

介绍

我们都知道JS中有六种简单数据类型:undefined、null、string、number、boolean、symbol、object(引用类型)

我们在声明的时候只有一种数据类型,在运行的时候才会确定变量的当前类型,如果运算时候的类型和预期不符合,就会触发类型转换机制。

常见的类型转换有:显式转换、隐式转换。

显示转换

显式转换就是我们俗称的强制转换,常见的方法有:

  • Number()

  • parselnt()

  • String()

  • Boolean()

Number()

是强制把任意类型的值转换为数值,规则如下:

  • undefined —— NaN

  • Null —— 0

  • true —— 1

  • false —— 0

  • Symbol —— Throw a TypeError exception

  • Object —— NaN

  • String —— NaN

特殊情况:

// 在空字符串的时候是转为0的
Number(''); //0
Number('dswe3'); //NaN

// 对象:通常转换成 NaN(除了只包含单个数值的数组)
Number({a1}) // NaN
Number([123]) // NaN
Number([5]) // 5

parselnt()

相对于Number转换时只要遇到一个字符无法转换为数值,整个字符串就会被转换为NaN,parselnt函数会逐个解析,遇到不能转换的字符就停止解析,例如:

parselnt('67djj88'); // 67

String()

可以将任意类型的值转化成字符串,规则如下:

Undefined —— 'Undefined'

Boolean —— 'true' 或者'false'

Number —— 对应数字的字符串

String —— String

Symbol —— Throw a TypeError exception

Object —— '[object Object]'

特殊情况:

String({r1}) // "[object Object]"
String([123]) // "1,2,3"

Boolean()

可以将任意类型的值转为布尔值,规则如下:

  • 可以转换为true的:

true、非空字符串、非零数值、任意对象、N/A

  • 可以转换为false的:

false、空字符串、0、NaN、null、undefined

示例:

Boolean(undefined); // false

Boolean(null); // false

Boolean(0); // false

Boolean(NaN); // false

Boolean(''); // false

Boolean({}); // true

Boolean([]); // true

Boolean(new Boolean(false)); // true

隐式转换

基本上隐式转换时在两种情况下发生的:

  • 比较运算(==、!=、>、<)、if、while 需要布尔值地方
  • 算术运算(+、-、*、/、%)

自动转换为布尔值

除了下面几种会被转化成 false,其他都换被转化成 true

  • undefined
  • null
  • false
  • +0
  • -0
  • NaN
  • ""

自动转换成字符串

遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。

先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串:

'1' + 1 // '11'
'1' + true // "1true"
'1' + false // "1false"
'1' + {} // "1[object Object]"
'1' + [] // "1"
'1' + function (){} // "1function (){}"
'1' + undefined // "1undefined"
'1' + null // "1null"

自动转换成数值

除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值


'5' - '2' // 3

'5' * '2' // 10

true - 1  // 0

false - 1 // -1

'1' - 1   // 0

'5' * []    // 0

false / '5' // 0

'abc' - 1   // NaN

null + 1 // 1

undefined + 1 // NaN