类型转换

Published on with 0 views and 0 comments

类型转换只有三种情况,分别是

  • 转换为布尔值
  • 转换为数字
  • 转换为字符串

转换规则

原始值转换规则 (null, undefined, number, string, boolean, symbool)

转为布尔值

  • 转换为false: undefined, null, false, NaN, '', 0, -0
  • 其他全部为true

转为数字

  • null -> 0
  • undefined -> NaN
  • symbol -> 报错
  • boolean
    • true -> 1
    • false -> 0
  • string
    • '1' -> 1
    • '01' -> 1
    • '0x10' -> 16
    • '1e1' -> 10
    • 'a' -> NaN
    • '\n' -> 0

转为字符串

  • null -> 'null'
  • undefined -> 'undefined'
  • symbol -> 'Symbol(<>)'
  • boolean
    • true -> 'true'
    • false -> 'false'
  • number
    • 1 -> '1'
    • 010 -> '8'
    • 0x10 -> '16'
    • 1e2 -> '100'

对象转换规则

普通对象

  1. 先调用Symbol.toPrimitive,如果存在的话
  2. 如果需要转字符串类型就调用x.toString(),如果是基础类型就返回
  3. 如果不是字符串类型的话就先调用 valueOf, 结果不是基础类型的话再调用 toString
  4. 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
  5. 如果都没有返回原始类型,就会报错

数组

  • 转布尔值:true
  • 转数字
    • [] -> 0
    • [a] (存在一个可转数字的元素a)
      • 1 -> 1
      • '1' -> 1
      • null -> 0
      • undefined -> 0
      • true/false -> NaN
    • [a, b, c] -> NaN
  • 转字符串(处理方式类似arr.join(',')),
    • 其中null和undefined转换为空字符串''
    • 有Symbol会报错

什么时候会触发转换

四则运算

  • 运算中其中一方为字符串,那么就会把另一方也转换为字符串
  • 如果一方不是字符串或者数字,会将它转换为数字或者字符串

比较运算符 (大于小于)

  • 如果是对象,就通过toPrimitive转换对象
  • 如果是字符串,就通过Unicode字符索引(string.prototype.charCodeAt(index))来比较

==

  1. 类型相同,比大小
  2. 类型不同先转换,再比较
    1. null == undefined // true
    2. 两者类型是否为 stringnumberstring转为 number
    3. 其中一方是否为 boolean,是的话会把 boolean转为 number
    4. 其中一方是否为 object,且另一方为 stringnumber或者 symbol,是的话会把 object转换为原始类型

练习一下==

[] == ![]

分析:

  1. 运算优先级,先!再==
  2. !的时候将 []转为boolean为 true,加上 !最终结果为 false
  3. 比较 [] == false,将 false转换为0
  4. 比较 [] == 0,将 []转换为0
  5. 比较 0 == 0,结果为 true

标题:类型转换
作者:lj0812
地址:https://blog.hereis.me/articles/2020/05/29/1590743778568.html