美文网首页
js类型转换

js类型转换

作者: 清平乐啊 | 来源:发表于2023-01-30 15:42 被阅读0次

    该文章记于2023年1月06日

    一、基本类型转换(Number,String,Boolean)

    1.Number,parseInt,parseFloat,Math.floor,Math.ceil,一元运算符+,(>,<,<=,>=),(|,&,^,~),(==,!=)

    +'2' //2
    +true // 1
    +null // 0
    +undefined // NaN
    +NaN // NaN
    +{} // NaN
    +'' // 0
    +' ' // 0
    +[] // 0
    Number() // 0
    

    2.String,toString,toFixed(),toExponential(),toPrecision()

    String能将null和undefined转换成字符串形式,toString则报错


    用例图片1
    String({}) // [object Object]
    String([]) // '' //空串
    String() // ''
    String('')  // ''
    

    3.Boolean,!,||,&&

    False:空串,数字0,null,undefined,NaN
    True:symbol,有一个空格的字符串,字符串0,字符串false,数字1,字面量{}/[]
    字符串:除了空串,其他字符串转换成布尔值都是true
    数字:除了数字0,其他数字布尔值为true
    !转换成相反的布尔值
    注:||和&&转换布尔值,最终返回的是原值而不是bool值

    let x = 'hello' && 123;   // x === 123
    

    二、对象类型转换

    任何非基本类型值总是转换成true
    对象值转换成数字或字符串有专用内置属性[[ToPrimitive]]
    对象值转换主要使用定义在Object.prototype上的valueOftoString两种方法
    运算规则:

    • 1.输入值本就是基本类型,不转换,直接返回;
    • 2.调佣toString()方法,结果是基本类型,返回;
    • 3.调用valueOf(),结果是基本类型,返回;
    • 4.toString()valueOf()都无法得到基本类型值,抛出错误TypeError
      注:数值先调用valueOf(),返回值再调用toString();字符串则相反先toString()valueOf()
      大多数内置类型没有valueOf()方法,因此转换成数值和转换成字符串最后都是调用toString()
      ToPrimitive

    三、注意事项

    1.特殊类型

    (1)symbol

    symbol只能显示转换,不支持隐式转换,隐式转换会报错:TypeError
    symbol无法转换成数字,抛出TypeError错误

    (2)字符串-->数字

    引擎都会先去除字符串起始和末尾的空白,比如\n \t,去除空表后,字符串无法转换成数字时,则返回NaN

    2.特殊规则

    (1)null,undefined,==

    null/undefined只与null和undefined等,且==两边操作数不转换成数字

    20=='20' // 字符串20转成数字20
    false=='' // 空串转换成布尔值为false
    

    当==两个操作数都是字符串时,操作数都不转换成数字
    ==转换数组为数值时,数组先执行valueOf(),返回数组本身,再执行toString(),相当于执行数组的join()方法,将数组拼接成字符串

    (2)NaN

    NaN不与任何值等

    (3)+(加),>,+(一元操作符)

    +(加)运算顺序是从左到右
    +(加)将字面量[]转成空串''
    数组和对象的valueOf()方法返回对象本身,因此被忽略

    “number” + 15 + 3 
    --> "number15" + 3 
    --> "number153"
    
    [] + null + 1  
    -->  '' + null + 1  
    -->  'null' + 1  
    --> 'null1'
    
    {}+[]+{}+[1]
    // +所有操作数都是非基本类型,第一个{}处理成块声明语句,不是声明对象的字面量,因此第一个{}被忽略,不转换
    --> +[]+{}+[1]
    --> 0 + {} + [1]
    --> 0 + '[object Object]' + [1]
    --> '0[object Object]' + [1]
    --> '0[object Object]' + '1'
    --> '0[object Object]1'
    
    [1] > null
    --> '1' > 0
    --> 1 > 0
    --> true
    
    "foo" + + "bar" 
    --> "foo" + (+"bar") 
    --> "foo" + NaN 
    --> "fooNaN"
    
    (new Date(0)).valueOf() // 0
    

    四、其他

    除null和undefined外,所有值都有toString()方法,结果与String()方法一致
    +(加)符号转换优先级顺序:

    • 1.操作数都是非基本类型,使用[ToPrimitive]转换成基本类型
    • 2.其中一个操作数是string(字符串),另一个操作数转换成字符串进行运算
    • 3.以上都不是,俩操作数都转成数字进行运算

    参考文献

    JavaScript Type Conversions
    JavaScript-Equality-Table
    JavaScript type coercion explained
    JavaScript Type Conversions Explained

    ……待完善

    相关文章

      网友评论

          本文标题:js类型转换

          本文链接:https://www.haomeiwen.com/subject/jlsjcdtx.html