• JavaScript类型转换


    一、常见类型转换方法

    1. parseInt()

    简介

    parseInt() 方法可以根据给定的进制数把一个字符串解析成整数。

    parseInt()在转换字符串时:

    • 它会忽略字符串前面的空格,直到找到第一个非空格字符。
    • 如果第一个非空格字符不是数字字符或符号,就会返回NaN。
    • 如果第一个非空格字符是数字字符,它会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

    在没有指定基数,或者基数为 0 的情况下,JavaScript 作如下处理:

    • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
    • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。故永远都要明确给出radix参数的值。
    • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

    既有 全局方法paresInt(),也有ES6的 Number.paresInt().

    语法

    parseInt(string[, radix])
    

    Params:

    • string:
      被解析的值。如果不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略。

    • radix:
      一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。总是指定该参数可以保证结果可预测。当忽略该参数时,不同的实现环境可能产生不同的结果。

    返回值:

    返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN

    示例:

    parseInt('1234blue',10);//1234
    parseInt('',10);//NaN
    parseInt('0xA',16);//10
    parseInt(22.5, 10);//22
    
    parseInt('10',2);//2
    parseInt('10',8);//8
    parseInt('10',10);//10
    parseInt('10',16);//16
    

    2. parseFloat()

    简介

    parseFloat() 函数解析一个字符串参数并返回一个浮点数。

    pareFloat()在解析字符串时:

    • 与paresInt()类似,parseFloat()也是从第一个字符开始解析,一直遇到第一个无效的浮点数字符为止。
    • 如果在解析过程中遇到了除了正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。
    • 字符串中的第一个小数点是有效的,第二个小数点就是无效的了。
    • 如果字符串包含的是一个可解析为整数的数,即没有小数点或小数点后面为0,则会得到整数。

    与parseInt()的区别:

    对比的方面 parseFloat() parseInt()
    前导0 终都会忽略前导的0 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制); 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制)
    参数个数 只有一个参数, 只解析十进制值 两个参数,第二个参数是介于2和36之间的整数,表示进制基数

    既有 全局方法paresFloat(),也有ES6的 Number.parseFloat().

    语法

    parseFloat(string)
    

    Params:

    • string:需要被解析成为浮点数的字符串.

    示例

    parseFloat('3.14')//3.14
    parseFloat('314e-2')//3.14
    parseFloat('0.0314e+2')//3.14
    parseFloat('3.14xxxaa')//3.14
    parseFloat('0xA')//0
    parseFloat('0908.5')//908.5
    parseFloat('22.34.2')//22.34
    

    3.Number()

    简介

    Number()可以用于任何数据类型。以上parseInt()和parseFloat()则专门用于字符串。

    Number()的转换规则:

    被转换值 转换规则
    Boolean true转换为1,false转换为0
    Number 简单的传入和传出
    null 返回为0
    undefined 返回NaN
    String
    如果字符串中只包含数字 转换为十进制数,前导0会被忽略
    如果字符串中包含有效的浮点格式 转换为对应浮点数值,前导0会被忽略
    如果字符串中包含有效的十六进制格式,如‘0xf' 转换为相同大小的十进制值
    如果字符串为空,即为'' 返回0,与parseInt,pareFloat将''转换为NaN不同
    如果字符串中包含除上述以外的字符 返回NaN
    对象 调用对象的ValueOf()方法,然后依照上述规则转换;如果valueOf得到NaN,则调用对象的toString()方法,然后依照上述规则转换

    语法

    Number(value)
    

    示例

    Number(false)//0
    Number(12)//12
    Number(null)//0
    Number(undefined)//NaN
    Number('')//0
    Number('0011')//11
    Number('1.22.2')//NaN
    Number('1.22')//1.22
    Number('0xff')//255
    Number('Hello')//NaN
    Number({a:0,b:1})//NaN
    Number('100%')//NaN
    

    注意:

    parseInt('10px');//10
    Number('10px');//NaN
    
    parseInt('');//NaN
    Number('');//0
    

    4. 一元正号(+)

    一元正号运算符(unary plus operator)位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。

    尽管一元负号也能转换非数值类型,但是 一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为 它不会对数值执行任何多余操作

    原值 一元正号转换结果
    字符串 整数、浮点数
    true 1
    false 0
    null 0
    +3     // 3
    +"3"   // 3
    +true  // 1
    +false // 0
    +null  // 0
    

    5. Number.prototype.toString()

    简介

    返回指定 Number 对象的字符串表示形式。

    Number 对象覆盖了 Object 对象上的 toString() 方法,它不是继承的 Object.prototype.toString()。

    • 如果被转换的是负数,则会保留负号
    • 进行数字到字符串的转换时,建议用小括号将要转换的目标括起来,防止出错。

    语法

    num.toString([radix])
    

    参数:

    • num:待转换的Number
    • radix: 指定要用于数字到字符串的转换的基数(从2到36)。如果未指定 radix 参数,则默认值为 10。如果radix不在 2到36之间,将会抛出错误 RangeError。

    示例

    (17).toString()//"17"
    (11.22).toString()//"11.22"
    (254).toString(16)//"fe"
    (-10).toString(2)//"-1010"
    (-0xff).toString(2)//"-11111111"
    

    二、一些情景带来的自动类型转换

    1. 条件中的值自动转换为布尔值

    发生场景

    有时候,一些变量作为条件语句的判断条件,该变量就会被自动转换为布尔值。

    例如:

    val ? doA(): doB()
    
    if(val) {
      doA()
    }
    
    

    自动转换规则

    值类型 转换的布尔值
    undefined false
    null false
    Boolean false就是false ,true就是true
    Number 0、+0、-0、NaN是false,其他为true
    String ''为false,其他为true
    Object true

    示例

    function testTrue(value) {
      value ? console.log('true'): console.log('false');
    }
    
    testTrue(false)//false
    testTrue(new Boolean(false))//true
    testTrue(null)//false
    testTrue(undefined)//false
    testTrue('')//false
    testTrue('lalala')//true
    testTrue(NaN)//false
    testTrue(new Number(0))//true
    testTrue({a:false})//true
    
    

    2. 相等操作符==带来的自动类型转换

    发生场景

    使用==时,不同类型的值也可以看作相等。

    转换规则

    x,y表示等号两边的两个值的类型。

    类型(x) 类型(y) 结果
    null undefined true
    number string 把y转化为number,再与x进行比较
    boolean 任何类型 把x转换为number,再与x进行比较
    string或number object 把y转换为原始值,再与x进行比较
    object object 如果它们指向同一个对象,则返回true;否则返回false
    把其他类型的值转换为number,规则如下:
    值类型 结果
    undefined NaN
    null +0
    bool 如果是true,结果为1;如果是false,结果为0
    string 解析为数字。如果字符串中包含字母,就返回NaN;如果是由数字字符组成,就返回数字。
    object Number(将值转换为原始值)
    将对象转换为原始值,规则如下:

    如果对象的valueOf()方法返回原始值,则返回原始值;如果对象的toString()方法返回原始值,则返回原始值;其他情况返回一个错误

    Tips:Object.prototype.valueOf()

    valueOf()方法返回指定对象的原始值

    JavaScript调用valueOf方法将对象转换为原始值。很少需要自己调用valueOf方法;当遇到要预期的原始值的对象时,JavaScript会自动调用它,比如==比较的时候有一侧是Object。

    JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。

    不同类型对象的valueOf()方法的返回值:

    对象 返回值
    Array 数组对象本身
    Boolean 布尔值
    Date 从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
    Function 函数本身
    Number 数字值
    Object 对象本身
    String 字符串值
    Math和Error 没有valueOf方法

    语法

    obj.valueOf()
    
    Tips:Object.prototype.toString()

    toString() 方法返回一个表示该对象的字符串。

    每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

    语法

    obj.toString()
    

    用例:使用toString()检测对象类型:

    
    Object.prototype.toString.call(new Array())//"[object Array]"
    Object.prototype.toString.call([1,2,3])//"[object Array]"
    Object.prototype.toString.call(new Date())//"[object Date]"
    Object.prototype.toString.call(new String('hhh'))//"[object String]"
    Object.prototype.toString.call(Math)//"[object Math]"
    Object.prototype.toString.call(undefined)//"[object Undefined]"
    Object.prototype.toString.call(null)//"[object Null]"
    

    示例

    [] == ![] //true
    /* 转换步骤
    * 右侧[]为object,自动转换为true,取反后变成false
    * 根据"转换规则"表格的第三条,boolean和其他类型值比较时要把boolean值先转换为Number, 右侧的false转换为0
    * 根据"转换规则"表格的第四条,object和number或string比较时要转换为原始值,即[].toString(),得到''。这时即是比较''==0
    * 根据"转换规则"表格的第二条,number和string类型比较要先把string类型化为number, Number('')得到0。这时即是比较 0==0
    × 得到结果true
    */
    
    

    3. 四则运算符带来的类型转换

    转换规则

    • 加法运算: 一方是字符串,另一方也会被转换为字符串类型。加法运算会触发3种类型转换
      • 将值转换为原始值
      • 将值转换为数字
      • 将值转化为字符串
    • 其他运算:只要其中一方是数字,另一方也会被转换为数字

    示例

    1 + '1' //'11'
    2 * '2' //4
    
    [1,2] + [3,4] //'1,23,4'
    /* 转换步骤
    * [1,2].toString() -> '1,2'
    * [3,4].toString() -> '3,4'
    * '1,2' + '3,4' -> '1,23,4'
    */
    
    'a' + +'b' //'aNaN'
    /* 转换步骤
    * +'b' -> 'NaN'
    * 'a' + 'NaN' -> 'aNaN'
    */
    

    参考资料

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

    《JavaScript高级程序设计》3.4.5 4.
    《你不知道的JavaScript》1.3.3,1.3.4

  • 相关阅读:
    解决 git 同步时 Everything up-to-date
    vs2019 git Authentication failed for xxx
    vs2015发布项目到虚拟主机组策略阻止csc.exe程序问题
    vs2017 使用 reportviewer
    var,dynamic的用法
    水晶报表报无法在资源中找到报表,请重新创建项目 错误
    css隐藏元素的方法
    css-浮动与清除浮动的原理详解(清除浮动的原理你知道吗)
    正则并不适合严格查找子串
    浏览器加载、渲染过程总结
  • 原文地址:https://www.cnblogs.com/Bonnie3449/p/9350835.html
Copyright © 2020-2023  润新知