Javascript 默认的parseInt基数为10

Javascript 默认的parseInt基数为10,javascript,Javascript,JavaScript的一个不好的部分是,如果使用以0开头的parseInt,那么它可能会将数字视为八进制 i = parseInt(014); // Answer: 12 问:如何重新定义parseInt,使其默认为基数10?我假设你会使用原型方法 编辑: 也许我应该这样做: $.fn.extend({ parseInt:function(X) { return parseInt(X,10); } }); 无论如何,当你说014时,它已经表示数字12,因此pa

JavaScript的一个不好的部分是,如果使用以0开头的parseInt,那么它可能会将数字视为八进制

i = parseInt(014); // Answer: 12
问:如何重新定义parseInt,使其默认为基数10?我假设你会使用原型方法

编辑:

也许我应该这样做:

$.fn.extend({
    parseInt:function(X) {
        return parseInt(X,10);
    }
});
无论如何,当你说
014
时,它已经表示数字12,因此
parseInt
对它没有任何用处


console.log('014==12:',014==12)
我想你的意思是
parseInt('014')
,而不是
parseInt(014)

如果您真的想用自己的函数替换
parseInt
(我强烈反对这样做),我想您可以使用以下方法:

(function(_parseInt)
{   
    parseInt = function(string, radix)
    {    return _parseInt(string, radix || 10);
    };

})(parseInt);
function createIntParser(radix) {
    return function(val) {
        return window.parseInt(val, radix);        
    }
}

decimalParseInt = createIntParser(10);

alert(decimalParseInt("010"));​

如果存储对原始
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);
}

parseInt()
还有第二个参数:

parseInt(x,[基数])


我个人会为此使用部分函数应用程序模式。比如:

(function(_parseInt)
{   
    parseInt = function(string, radix)
    {    return _parseInt(string, radix || 10);
    };

})(parseInt);
function createIntParser(radix) {
    return function(val) {
        return window.parseInt(val, radix);        
    }
}

decimalParseInt = createIntParser(10);

alert(decimalParseInt("010"));​
但我喜欢直截了当。

引言 首先,
parseInt
方法假设如下:

  • 如果它以0x-开头,那么它就是十六进制
  • 如果它以0开头,那么它就是八进制
  • 否则它是十进制的
因此,您可以使用解决方案,而不要从0开始;)

解决方案 ECMA-262(又名EcmaScript 5,又名JavaScript版本5)的一个新特性是严格模式,您可以使用
的“使用严格模式”

当您选择进入严格模式时,规则会发生变化:

  • 如果以0x-开头,则为十六进制
  • 否则它是十进制的
获得八进制的唯一方法是将基数参数设置为8

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

下图是IE 10版本预览版与Chrome 19版本的对比——IE运行正常,但Chrome没有

检查浏览器的简单方法是转到:
你应该得到10,10,8,10,16作为结果,如果这样好的话-如果不是你的浏览器坏了:(

也许在jQuery的长期传统中,应该有一个$.parseInt()。我想你的意思是
parseInt('014')
,而不是
parseInt(014))
014
是一个八进制数。
0x14
是十六进制数。这不是十六进制。它是八进制数。所以
014=10x8+4=12
如何
var myParseInt=function(num,radix){return parseInt(num,radix | 10)}
?不确定如果将
myParseInt
更改为
parseInt
,会发生什么情况。我想知道我是否可以将decimalParseInt命名为:Int。或者Int会被视为no no吗?是的,看起来Int是从Java带来的保留字(根据JavaScript的权威指南).表2-2为ECMA扩展保留的单词此帖子可以编辑,因为不再适合假设存在javascript浏览器。谢谢Yuri!我在问题中没有明确表示我已经知道这一点,所以我感谢你这么说。不,我是指parseInt(014)。解决方案是“使用strict”Crockford说永远不要使用双等号。它应该是“基数===未定义”吗?既然您在上面的函数中更改了基数,那么在调用例程中是否也会更改它,或者变量是否作为值传递?@Pedro:Crockford是一个迂腐的%*^。更精确地说,您可以使用
==
,但是
=
@Pedro:它们的行为就像传递值一样。除非您传递数组或obje在这种情况下,它们的行为类似于引用。从您提供的ECMA-262链接中:“再次注意,无论严格模式和数字语法扩展如何,新的parseInt算法都将被应用:”。
parseInt
在ES5中发生了变化,即使没有严格模式。