JS二:类型转换

107 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

类型转换

转换成String

全局方法 String().toString() 可以将数字,字母,变量,表达式转换为字符串,以下使用String方法。

  • null和undefined转换为String,分别是'null''undefined'
String(null)  //'null'
String(undefined)  //'undefined'
  • boolean类型,true转换成'true',false转换成'false'
String(true)  //'true'
String(false)  //'false'
  • Number类型直接转换,极大值或极小值或转换成指数形式的字符串
String(123)  //'123'
String(10000000009999990007199254740992) //'1.000000000999999e+31'
String(0.00000000000000910000000009999990007199254740992)  //'9.1000000001e-15'
  • Symbol类型只能进行显式类型转换,使用隐式转换会导致出错TypeError
const sym = Symbol('desc');
console.log(sym)  //Symbol(desc)
// 隐式转换
const str1 = '' + sym; // Uncaught TypeError: Cannot convert a Symbol value to a string
// 显式转换
const str2 = String(sym); 
console.log(str2) //Symbol(desc)
typeof(str2) //'string'
  • 对象类型转换会隐藏对象参数[object Object]
const obj = {
    name: 'pig'
}
console.log(String(obj))  // [object Object]

转换成Number

全局方法 Number()  可以将字符串、布尔值等转换为数字。

  • null和undefined转换为Number,分别是0NaN
Number(null)  //0
Number(undefined)  //NaN
  • boolean类型,true转换成1,false转换成0
Number(true)  //1
Number(false)  //0
  • String转换成Number,若数字直接转换,若包含非数字则转换成NaN,空字符串转换成0
Number('123')  //123
Number('123a')  //NaN
Number('')  //0
  • Symbol 类型的值不能转换为数字,报错TypeError
const sym = Symbol('desc');
const str = Number(sym); 
console.log(str)  //Uncaught TypeError: Cannot convert a Symbol value to a number
  • 对象会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。

转换成Boolean

全局方法 Boolean()  可以将字符串、布尔值等转换为true、false。

  • null和undefined转换为Boolean都是false
Boolean(null)  //false
Boolean(undefined)  //false
  • String转换成Boolean,若字符串为空转换成false,反之字符串不为空转换成true
Boolean('123')  //true
Boolean('123a')  //true
Boolean('')  //false
Boolean('false')  //true
Boolean('true')  //true
  • Number转换成Boolean,+0、-0、NaN转换成false,其余都是true
Boolean(+0)  //false
Boolean(-0)  //false
Boolean(NaN)  //false
Boolean(123)  //true
  • Symbol 类型直接转换成true
const sym = Symbol('desc');
const str = Boolean(sym); 
console.log(str)  //true
  • 对象直接转换为true
const obj = {
    name: 'pig'
}
Boolean(obj)  //true
const arr = []
Boolean(arr)  //true
Boolean(arr.length)  //false

显式转换和隐式转换

显式转换

显式转换又称为强制转换,一般是人为进行转换,通过调用全局方法toString()String()Number()parseInt()parseFloat()Boolean()Object()

隐式转换

逻辑判断if语句算术表达式==等会进行隐式转换

  • 逻辑判断和if语句都会先转换成布尔值,在进行判断或输出结果。如果出现 false、undefined、null、NaN、''、0、-0、+0 时,都会转换成false
const str = ''
if(str) { 
    console.log('pig')  //无法打印
}
  • 算数表达式中四则运算+ - * /,除了+比较特殊,其余- * / 都是先转换成Number型再计算。 加法 (+) 如果其中一个是对象,先调用toString()后进行连接;如果其中一个是字符串,则另一个也会转换成字符串,然后进行连接;反之否则两个操作数都转换为数字(或者NaN),然后进行加法操作。
console.log({name: 'pig'} + 1)  //[object Object]1
console.log([1,2,3] + 1)  //1,2,31
console.log('pig' + 1)  //pig1
console.log(true + 1)  //2
  • ==位运算符如果两边的类型不统一,则会先对两边进行类型的转换再做判断。判断流程:
    1. null==undefined为true,其他均为false
    2. 数字和字符串,字符串转换为数字
    3. 布尔值和其他,其他转布尔值
    4. 对象和其他,对象转其他
    console.log(null==undefined);  //true
    console.log(12=='12');  //true
    console.log(true=='1')  //true
    console.log({name: 'pig'}==1)  //false