将默认的parseInt基数设置为10。

6

JavaScript中不好的一点是,如果您使用parseInt处理以0开头的数字,则可能会将该数字视为八进制。

i = parseInt(014); // Answer: 12

问:如何重新定义parseInt函数以默认使用基数10?我假设您会使用原型方法。

编辑:

也许我应该这样做:

$.fn.extend({
    parseInt:function(X) {
        return parseInt(X,10);
    }
});

或许在 jQuery 的悠久传统中,应该有一个 $.parseInt()。 - Phillip Senn
2
我猜你是指 parseInt('014') 而不是 parseInt(014) - James M
2
014 是一个八进制数。0x14 是十六进制。 - Marc B
这不是十六进制,而是八进制。所以 014=10x8+4=12 - Shiplu Mokaddim
那么只使用 var myParseInt = function (num, radix) { return parseInt(num, radix || 10); }; 怎么样?如果将 myParseInt 更改为 parseInt,不确定会发生什么。 - powerbuoy
6个回答

14
如果您存储了对原始parseInt函数的引用,您可以使用自己的实现覆盖它。
(function () {
    var origParseInt = window.parseInt;

    window.parseInt = function (val, radix) {
        if (arguments.length === 1) {
            radix = 10;
        }

        return origParseInt.call(this, val, radix);
    };

}());

然而,我强烈建议不要这样做。修改您不拥有的对象是不好的实践,更不用说修改您不拥有的对象的签名。如果您的其他代码依赖于八进制是默认值会发生什么?

定义自己的函数作为快捷方式会更好得多

function myParseInt(val, radix) {
    if (typeof radix === "undefined") {
        radix = 10;
    }

    return parseInt(val, radix);
}

Crockford说永远不要使用双等号。应该是“radix === undefined”吗? - Phillip Senn
由于您正在上面的函数中更改基数,那么这是否也会在调用例程中更改它,还是变量作为值传递? - Phillip Senn
2
@Pedro:Crockford 是一个过于追求细节的人。你可以使用 === 来更加精确,但是使用 == 也能正常工作。 - Matt
@Pedro:它们表现得被传递了值一样。除非你传递一个数组或对象,否则它们会像引用一样操作 - Matt

7

介绍

parseInt方法有以下假设来源:

  • 如果以0x开头 - 则是十六进制。
  • 如果以0开头 - 则是八进制。
  • 否则为十进制。

所以你可以采用不要以0开头的解决方案;)

解决方案

使用ECMA-262(也称为EcmaScript 5,也称为JavaScript版本5)之一的新功能严格模式,使用"use strict"打开它

当您选择启用严格模式时,规则会更改来源:

  • 如果以0x开头 - 则是十六进制
  • 否则为十进制

唯一获取八进制的方法是将基数参数设置为8。

问题

在撰写本文时,ECMAScript 5的支持并不在所有浏览器中都一致,因此某些浏览器根本不支持它,这意味着该解决方案对他们无用。其他浏览器实现是有问题的,因此即使它支持它,它们也不支持。

下面的图像是IE 10发布预览版与Chrome 19的比较 - 其中IE正确运行,但Chrome不会。

Chrome 19 versus IE 10 Release Preview

检查您的浏览器的简单方法是转到:http://repl.it/CZO# 如果结果为10, 10, 8, 10, 16,则很好 - 如果不是,则表示您的浏览器存在问题:(


从您提供的ECMA-262链接中可以看到:“请再次注意,即使没有启用严格模式和数字语法扩展,也将应用新的parseInt算法:”。parseInt在ES5中已经发生了变化,即使没有启用严格模式。 - Wilfred Hughes

5
我想你的意思是parseInt('014'),而不是parseInt(014)
如果你真的想用自己的函数替换parseInt(我强烈反对这样做),我猜你可以这样做:
(function(_parseInt)
{   
    parseInt = function(string, radix)
    {    return _parseInt(string, radix || 10);
    };

})(parseInt);

不,我的意思是parseInt(014)。解决方法是“使用严格模式”。 - Phillip Senn

4
我个人建议使用部分函数应用模式来完成此任务。例如:
function createIntParser(radix) {
    return function(val) {
        return window.parseInt(val, radix);        
    }
}

decimalParseInt = createIntParser(10);

alert(decimalParseInt("010"));​

但我喜欢说得明白。

(但是我喜欢表达得明确。)

嗯...我在想是否可以将decimalParseInt简单地命名为Int。或者Int会被认为是不合适的吗? - Phillip Senn
是的,看起来 Int 是从 Java 中带过来的保留字(根据《JavaScript 权威指南》)。 - Phillip Senn
表2-2 ECMA扩展保留字 - Phillip Senn
这篇文章可能需要进行编辑,因为不再适合假设JavaScript有一个浏览器。 - Cookie

2
i = parseInt('014',10);

无论如何,当你说014时,它已经表示数字12,因此parseInt对其无用。

console.log('014===12:', 014===12);


1

谢谢Yuri!我在问题中没有明确表明我已经知道了这一点,所以感谢你的提醒。 - Phillip Senn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接