资讯专栏INFORMATION COLUMN

JavaScript实现parseInt()

yzd / 1870人阅读

摘要:当参数的值为,或没有设置该参数时,会根据来判断数字的基数。如果以开头,那么允许的一个实现把其后的字符解析为八进制或十六进制的数字。只有字符串中的第一个数字会被返回。开头和结尾的空格是允许的。

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

只有字符串中的第一个数字会被返回。

开头和结尾的空格是允许的。

function _parseInt (string, radix) {
    if (typeof string !== "string" && typeof string !== "number") return NaN;
    if (radix && (typeof radix !== "number" || /^[1-9]d*.d*|0.d*[1-9]d*$/.test(radix) || radix > 36 || radix < 2)) return NaN;
    string = String(string)
    var rexp = (radix == 10) ? /(-?)([0]?)([0-9]+)/ : /(-?)([0]?[Xx]?)([0-9a-fA-F]+)/,
        a = string.match(rexp),
        sign = a[1],
        rawRadix = a[2],
        rawNum = a[3],
        result = 0,
        strArr = rawNum.split(""),
        len = strArr.length,
        numArr = [];
    if (a && !radix) {
        if ( rawRadix.toUpperCase() === "0X") {
            radix = 16;
        } else if (rawRadix === "0") {
            radix = 8;
        } else {
            radix = 10;
        }
    }
    for (var i = 0; i < len; i++){
        var num;
        var charCode = strArr[i].toUpperCase().charCodeAt(0);
        if(radix <=36 && radix >= 11) {
            if (charCode >= 65 && charCode <= 90) {
                num = charCode - 55;
            } else {
                num = charCode - 48;
            }
        }  else {
            num = charCode - 48;
        }
        if (num < radix) {
            numArr.push(num);
        } else {
            return NaN
        };
    }
    if(numArr.length > 0) {
      numArr.forEach(function(item, j){
          result += item * Math.pow(radix, numArr.length-j-1);
      })
    }
    if(sign === "-"){
      result = -result;
    }
    return result
}

来自MDN关于parseInt()里面的测试用例

// 以下例子均返回15:
console.log(_parseInt("F", 16));
console.log(_parseInt("17", 8));
console.log(_parseInt("15", 10));
console.log(_parseInt(15.99, 10));
console.log(_parseInt("FXX123", 16));
console.log(_parseInt("1111", 2));
console.log(_parseInt("15*3", 10));
console.log(_parseInt("12", 13));

// 以下例子均返回 NaN:
console.log(_parseInt("Hello", 8)); // Not a number at all
console.log(_parseInt("546", 2));   // Digits are not valid for binary representations

// 以下例子均返回 -15:
console.log(_parseInt("-F", 16));
console.log(_parseInt("-0F", 16));
console.log(_parseInt("-0XF", 16));
console.log(_parseInt(-15.1, 10));
console.log(_parseInt(" -17", 8));
console.log(_parseInt(" -15", 10));
console.log(_parseInt("-1111", 2));
console.log(_parseInt("-15e1", 10));
console.log(_parseInt("-12", 13));
// 下例中也全部返回 17,因为输入的 string 参数以 "0x" 开头时作为十六进制数字解释,而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。
console.log(_parseInt("0x11", 16));
console.log(_parseInt("0x11", 0));
console.log(_parseInt("0x11"));

// 下面的例子返回 224
console.log(_parseInt("0e0",16));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84780.html

相关文章

  • 怪异的JavaScript系列(二)

    摘要:函数不是函数这是一个低版本的,,或则。对应的进制数为。因此最安全的方法是调用的时候指定进制。它会将字符串形式的整数转换为,非字符串的,,和也会被转换。对于不能转换的值,返回。而浏览器主要指系列,其实已经没有必要支持这个特性了。 译者按: JavaScript有很多坑,经常一不小心就要写bug。 原文: What the f*ck JavaScript? 译者: Fundebug ...

    YacaToy 评论0 收藏0
  • JavaScript Puzzlers! 解惑(一):为什么 ["1", &qu

    摘要:第一题为的返回值。返回值其中的每个元素均为关联的原始数组元素的回调函数返回值的新数组。修改数组对象数组对象可由回调函数修改。方法启动后的条件元素是否传递给回调函数在数组的原始长度之外添加元素。 JavaScript Puzzlers! 被称为 javascript 界的专业八级测验,感兴趣的 jser 可以去试试。 我试了一下, 36 道题只做对了 19 道, 算下来正确率为 53%,...

    k00baa 评论0 收藏0
  • JavaScript学习笔记之数组(三)

    摘要:学习笔记之数组二输出什么为什么有三个参数数组元素,元素索引,数组本身有两个参数元素本身以及进制语法参数可选。表示要解析的数字的基数。如果该参数小于或者大于,则将返回。当参数的值为或没有设置该参数时,会根据来判断数字的基数。 JavaScript学习笔记之数组(二) 1.[1,2,3].map(parseInt) 输出什么,为什么? [1,2,3].map(parseInt)//[1,N...

    YPHP 评论0 收藏0
  • JavaScript 转换数字为整数的方法

    摘要:另外自己写代码测试了下和的速度,比较结果如下位操作转换整数的原理参考上面对于位操作的说明,点击下面链接有这样一段话中,数字存储是双进度位浮点数。但是位操作却会把要操作的运算元当做位带符号的整数。因此进行位操作时,会自动把数字先转换为整数。 本文将会列举并说明JavaScript 把一个number(或者numerical的对象)转换成一个整数相关方法。 使用parseInt parse...

    YanceyOfficial 评论0 收藏0
  • 你真的了解javascript吗?(一)

    摘要:表示要解析的数字的基数。回调函数接收四个参数,依次是通过上一次调用回调函数获得的值。如果向方法提供,则在首次调用函数时,为。当前数组元素的值。 原题出处:JavaScript Puzzlers!当初以为不过是一些小题目,结果做到怀疑人生,都要怀疑可能我javascript白学了。读者可以去试试。 不多说,直接上题: 第一题 [1, 2, 3].map(parseInt) 不要被套路,这...

    whatsns 评论0 收藏0

发表评论

0条评论

yzd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<