强制类型转换

137 阅读4分钟

值类型转换

  • 值类型转换分为两种分别是显示类型转换和隐式类型转换
    • 显式类型转换: 将值从一种类型转成另一种类型,发生在js的编译阶段
    • 隐式类型转换: 发生在js运行时
    • 显式类型转换和隐式类型转换在js中都叫强制类型转换
let a = 1
let b = a + "" // 隐式类型转换
let c = String(a) // 显式类型转换

toString

  • 负责处理非字符串到字符串的强制类型转换
  • 基本值类型字符串化规则
    • null => 'null'
    • undefined => 'undefined'
    • true => 'true'
    • 数字类遵循通用规则: 1 => '1'
  • 复杂数据类型
    • 对普通对象来说,除非自定义,否则toString()返回的是内部属性class的值
    • 数组toString()经过了重新定义,将数组内数据字符串化后用逗号连接
    let obj = {
      1: 11,
      2: 22,
      3: 33
    }
    console.log(obj.toString()); //=> [object Object]
    let arr = [1,2,3]
    console.log(arr) //=> 1,2,3
    
  • json字符串化
    1. 通过json.stringify()对json对象字符串化
    2. 所有的安全的json值都可以通过json.stringify()字符串化
    3. 不安全的json值包括: undefined, function, symbol和包含引用(对象之间的相互引用),这些都不符合json的结构标准
    4. 由于存在不安全的json值的原因在进行深拷贝时通过JSON.parse(JSON.stringify())进行深拷贝时遇到以上内容会出现问题
      • 在遇到undefined, function和symbol会自动忽略,如果在数组中则会返回null
      • 如果对象中包涵循环引用则会报错
      console.log(JSON.stringify(undefined)); // undefined
      console.log(JSON.stringify(function() {})); // undefined
      console.log(JSON.stringify([1,undefined, 2,3,function()      {} ])); // [1,null,2,3,null]
      
    5. 需要注意的是json.stringify()本身并不是强制类型转换,只是它涉及到了tostring强制类型转换

Number

  • toNumber可以将一些非number类或非数字值转换成数字使用,处理失败时返回NAN
    • true => 1
    • false => 0
    • undefined => NAN
    • null => 0
    console.log(Number(true)); // 1
    console.log(Number(false)); // 0
    console.log(Number(undefined)); // NAN
    console.log(Number(null)); // 0
    console.log(Number('true')); // NAN
    console.log(Number('222')); // 222
    console.log(Number(function() {console.log(22);})); // NAN
    

Boolean

  • 该方法可以将值转换成真值或假值
  • 假值: 下面的是假值列表,通过Boolan转换得到的都是false
    • undefined
    • null
    • false
    • 0和NAN
    • "" 空字符串
  • 真值: 除了假值列表中的其余的通过Boolan转换得到的都是true
console.log(Boolean(undefined)); // false
console.log(Boolean(null)); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(false)); // false
console.log(Boolean("")); // false
let a = "false" 
let b = '0'
let c = "'"
let d = Boolean(a && b && c)
console.log(d); // true 因为a和b都被引号包裹,而c是被双引号包裹的单引号
// 除此之外包括数组,对象和函数都是真值

显式类型转换

字符和数字的显示转换

  • 字符转数字: Number('11')
  • 数字转字符: String(11)
  • Number不允许出现非数字字符,会返回NaN
  • parseInt: 允许出现非数字字符,按从左到右的顺序,若遇到非数字就停止

显式转换布尔值

  • 针对上面说的价值列表通过Boolan转换都是false
let a = "0" // true
let b = [] // true
let c = {} // true
let d = 0 // false
let e = null // false
let f = '' // false
let g // false
console.log(Boolean(a),Boolean(b),Boolean(c),Boolean(d),Boolean(e),Boolean(f),Boolean(g)); // true true true false false false false

隐式类型转换

  • 隐式强制类型转换的作用是减少冗余,使代码简洁

字符串和数字之间的隐式类型转换

  • 加号(+): 如果相加的数字有一个或多个都被双引号包裹,执行字符串拼接,如果都是number类型则执行加法操作
  • 两个Array类型的数组相加,则会先转成字符串在相加
  • 可以利用+进行number转string
let a = '1' + 2 + 3 + 4 + 5
console.log(a); // 1,2,3,4,5
let b = [1,3]
let c = [5,7]
// 先转成了 "1,3" "5,7"
console.log(b+c); // 1,35,7
// number => string
let d = 42
console.log(typeof (d+"")); // string

隐式强制转换成布尔值

  • if(..)中的条件判断表达式
  • for(..;..;..;)中的条件判断表达式
  • ? : 三元运算符中的判断表达式
  • 逻辑运算符与(&&)或(||) 左侧的操作数
    • 逻辑与: 如左侧判断结果为true返回右侧的值,若左侧判断结果为false则返回左侧操作数的值
    • 逻辑或: 如果左侧判断结果为true返回左侧的值,否则返回右侧的值
    console.log(12 || 34); // 12
    console.log(12 && 34); // 34
    console.log(null || 12); // 12
    console.log(null && 12); // null
    

等于号

  • ==和===区别在于: == 在比较中允许强制类型转换,而===不允许强制类型转换