JS笔记《数据类型转换》

98 阅读2分钟

数据类型的转换

  • JS是一种动态类型语言,变量的类型必须等到运行时才会确定。但是各种运算符对数据类型是有要求的,如果发现与预期不符则会自动进行类型转换,除此之外还有手动类型转换。
'5' - '4'  // 1 自动转为了数值

强制转换

Number()

  • 原始值
Number('324')     // 324
Number('324a')    // NaN
Number('')        // 0
Number(true)      // 1
Number(undefined) // NaN
Number(null)      // 0
  • 对象
Number({a:1})    // NaN
Number([1,2,3])  // NaN
Number([1])      // 1
Number([])       // 0

调用valueOf(),如果返回原始值则直接调用Number()。如果返回的还是对象,则调用toString(),然后再调用Number()

String()

  • 原始值
String(0)         // '0'
String(true)      // 'true'
String(undefined) // 'undefined'
String(null)      // 'null'
String(123)       // '123'
  • 对象
String({a :1})    // '[object Object]'
String([1,2,3])   // '1,2,3'
String([])        // ''

调用toString(),如果返回原始值则直接调用String()。如果返回的是对象,则调用valueOf(),然后再调用String()

Boolean()

  • 原始值
Boolean(undefined)  // false
Boolean(null)       // false
Boolean(0)          // false
Boolean(NaN)        // false
Boolean('')         // false
  • 对象
Boolean({})         // true
Boolean([])         // true

所有对象转为boolean都是true


自动转换

  • 自动转换是以强制转换为基础,相当于隐式调用Number()、Boolean()、String()

自动转为布尔

if('abc'){   // if中的表达式会自动转为boolean
  alert(1);
}
1 ? true : false;  // 三元表达式中的第一个表达式
!true     // 取反

相当于隐式调用Boolean()。

自动转为字符串

'5' + 1       // '51'
'5' + true    // 'true5'
'5' + {}      // '5[object Object]'
'5' + []      // '5'
'5' + function(){}  // '5function(){}'

相当于隐式调用String()。

自动转为数值

'5' - '2'     // 3
'5' * '2'     // 10
true - 1      // 0
'1' - 1       // 0
5 * []        // 0
'abc' - 1     // NaN
null + 1      // 1
undefined + 1 // NaN
+'abc'        // NaN
-true         // -1

'5' > 2       // true
true < 2      // true

相当于隐式调用Number()。

[] == ![] 详解

console.log([] == ![]); // true
// !优先级高,先将[]转为boolean,所有对象转为boolean都为true,取反为 false。
// 变成了 [] == false
// 对象和原始值相等比较:
//    调用valueOf():[].valueOf() => [],返回的不是对象。
//    再调用toString() :[].toString() => '',返回的是空串。
// 变成了 '' == false
// Number('') === Number(false) // true