zoukankan      html  css  js  c++  java
  • JS中parseInt()、Numer()深度解析

    文章来自:https://www.cnblogs.com/breezeljm/p/6138763.html

    1、parseInt函数

    定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt

    语法:parseInt(string [ , radix])

    参数:

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

        radix:一个2到36之间的整数值,用于指定转换中采用的基数。

            如果省略该参数或者为0,则数字将以 10 为基础来解析。

            如果string以 “0x” 或 “0X” 开头,将以 16 为基数。

            如果string以“0” 开头,在ECMA3中被认为是8进制;但是在ECMA5中已经强制规定此情况默认是10进制

            如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

    在ECMA规范中,对于parseInt函数解析字符串为数字的步骤如下:

    看看V8中parseInt函数的源码:【只列出一部分,如需要查看请参见V8中src/conversions-inl.h和src/compiler/js-builtin-reducer.cc】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    if (radix == 0) { //如果传入radix是0,则以10进行处理
        // Radix detection.
        radix = 10;
        if (*current == '0') {
          ++current;
          if (current == end) return SignedZero(negative);
          if (*current == 'x' || *current == 'X') {
            radix = 16;
            ++current;
            if (current == end) return JunkStringValue();
          else {
            leading_zero = true;
          }
        }
      else if (radix == 16) { //16进制
        if (*current == '0') {
          // Allow "0x" prefix.
          ++current;
          if (current == end) return SignedZero(negative);
          if (*current == 'x' || *current == 'X') {
            ++current;
            if (current == end) return JunkStringValue();
          else {
            leading_zero = true;
          }
        }
      }
      
      if (radix < 2 || radix > 36) return JunkStringValue(); //radix不在2~36之间的处理

      

    例如解析:

        parseInt('0101' , 1)   => NaN

        parseInt('453' , 2) => NaN  因为453不符合二进制数字,所以无法转换出正确的数字

    2、Number()函数

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

    计算步骤:

    两种方法的区别:

    参考链接:http://www.w3school.com.cn/js/pro_js_typeconversion.asp

    用 Number() 进行强制类型转换,并且是转换整个字符串值,如果整个字符串不能转换成数字,则输出NaN。

    例如:

    parseInt('01a02', 10)  => 1    parseInt('1.22.22', 10) => 1         parseInt('1.22' , 10) => 1

    Number('01a02') => NaN      Number('1.22.22') => NaN          Number('1.22')  =>  1.22

    JS中数字利用parseInt进行转换成整数:

    由parseInt中定义:parseInt是用于将字符串根据基数转换成整数,如果传入参数不是字符串,会首先利用toString方法转换为字符串,再转换为整数

    例子:

    parseInt(0.000001)   =>  0    parseInt('0.000001')    =>  0

    parseInt(0.0000001) => 1     parseInt('0.0000001')  =>  0

    转换0.000001和0.0000001数字时出现结果不同,那么先将看看这两个数字转换为字符串的结果:

    var a = 0.000001   ;   a.toString() ;  => '0.000001'

    var b = 0.0000001 ;   b.toString() ;  => '1e-7'

    由此不难看出:为什么会出现上述结果。

    究其原因:在ECMA规范中

    可以解释0.000001和0.0000001转换为字符串后的不同结果。

    所以在日常使用parseInt函数时:常用的情况无非为将字符串转换为整数或者将数字转换为整数,所以在使用将数字转换为整数时,最好需要进行判断

    function newParseInt(value) {

         if(typeof value === 'number') {

             return Math.floor(value);

        }

        return parseInt(value);

    }

     
     
  • 相关阅读:
    [译]Vulkan教程(09)窗口表面
    [译]Vulkan教程(08)逻辑设备和队列
    [译]Vulkan教程(07)物理设备和队列家族
    Linux命令行文本工具
    go语言周边
    go第三方常用包
    Centos6安装gcc4.8及以上版本
    pyenv设置python多版本环境
    Redis慢日志
    PHP-CPP开发扩展(七)
  • 原文地址:https://www.cnblogs.com/FineDay/p/9101350.html
Copyright © 2011-2022 走看看