zoukankan      html  css  js  c++  java
  • js——类型转换

      总述                  

    • 类型转换:显式、隐式(自动)
    • 隐式转换是由编译器自动进行的,基本主要抽象操作有ToPrimitive, ToNumber, ToString, ToBoolean等
    • 显式转换是通过调用Number(), String(), Boolean()等来实现,后面的操作实际是和隐式一样的原理

      隐式转换           

    • ToPrimitive(input[, PreferredType]):根据可选的类型值,把input转换成非对象(基本类型); ToNumber和ToString转换对象时会调用该操作
    input类型 返回结果

    Undefined/Null/Boolean

    /Number/String

    输入为基本类型,结果与输入的一样
    Object

    根据内部方法[[DefaultValue]](hint)返回结果,不同的PreferredType(hint)有不同的操作

    • hint为String

    1. 如果toString()返回基本类型,将其作为结果

    2. 否则,如果valueOf()返回基本类型,将其作为结果

    3. 否则,抛出TypeError异常

    • hint为Number

    1. 先判断valueOf再判断toString(与上面String的相反),否则抛出TypeError异常

    • hint没有指定

    Date类型的会把hint默认设置为String,其它会以Number处理

    • ToNumber
    输入值类型 返回结果
    Undefined NaN
    Null +0
    Boolean 1: true, 0: false
    Number 与输入一致
    String

    个人总结:看起来像数字的字符串可以转换成相应的数字,否则返回NaN,具体例子如下

    Object 返回ToPrimitive(input, Number)结果

    String转换成Number 

     1 //空格
     2 Number("");//0
     3 Number("  01");//1
     4 //正负数
     5 Number("+9");//+9
     6 Number("-9");//-9
     7 //指数e
     8 Number("-9e-1");//-0.9
     9 Number("-9E-1");//-0.9
    10 //无穷数
    11 Number("-Infinity");//-Infinity
    12 //不同进制
    13 Number("0B10");//2
    14 Number("0O10");//8
    15 Number("0X10");//16
    16 //数字
    17 Number("100000000000000000000000000000");//1e+29
    18 Number("0000.100");//0.1
    19 //转换成了NaN
    20 Number("-   0");//NaN
    21 Number("ln10");//NaN
    • ToString
    输入的类型 返回值
    Undefined/Null/Boolean/String

    "undefined"/"null"/"true"/"false"/与输入一致

    基本类型,输入和返回一样

    Number  对某些输入稍处理,然后作为字符串输出
    Object 使用ToPrimitive(input, String)结果

    Number转换成String

     1 String(NaN);//-"NaN"
     2 String(-Infinity);//"-Infinity"
     3 //正负数
     4 String(-0);//"0"
     5 String(+0);//"0"
     6 String(-9);//"-9"
     7 String(+9);//"9"
     8 //指数,会自动转换,有效位数尽量少
     9 String(0.000000009);//"9e-9"
    10 String(1000000000000000000000000000000000);//"1e+33"
    11 String(0.9e1);//"9"
    12 String(0.9e-10);//"9e-11"
    13 //会自动省去多余的0
    14 String(0.90000000000000000);//"0.9"
    15 //进制
    16 String(0B10);//"2"
    17 String(0O10);//"8"
    18 String(0X10);//"16"
    • ToBoolean
    结果 输入值
    false (基本类型)0, -0, +0, NaN, "", false, Null, Undefined
    true 基本类型中除上述的值,Object(所有Object都是!)
    •  ToObject
    输入的类型 返回结果
    Undefined/Null TypeError异常,Object(null/undefined)结果均为{}
    Boolean/Number/String 对于基本类型会先创建一个对象,并把输入值作为对象的primitiveValue
    Object 与输入相同

      产生隐式转换的操作  

    转换为数字类型:数字运算符都会尝试把变量转换为数字,如~, <<, >>, +, -, *, /, ^, %, &, |, ++等

    +:如果操作数不是数字,则通过ToPrimitive(input, number)进行转换。若结果中有操作数为字符串,则执行字符串拼接,否则执行数字加法

    转换为布尔类型

    if(..), while(...), for(;...;...), ?:, ||, &&(选择器运算符), !, !!     

    ==宽松相等比较,根据操作数的不同进行不同的类型转换

    操作数类型 转换方式:对象->非对象,非数字->数字
    string+number string转换为number
    boolean+其它

    boolean先转换为number,再做比较

    "42"==true;//false

    "42"==false;//false

    null+undefined null == undefined;//true
    对象+非对象 对象利用ToPrimitive拆封获得非对结果,再比较

      显式类型转换          

    显式调用 隐式
    Number(input) ToNumer(input)
    String(input) ToString(input)
    Boolean(input) ToBoolean(input)
    Object(input) ToObject(input)

    参考

    ECMAScript规范5.1

    《你不知道的javascript》中卷

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/7155994.html
Copyright © 2011-2022 走看看