JavaScript的一个不好的部分是,如果你将parseInt用于以0开头的东西,那么它可以将数字视为八进制。
i = parseInt(014); // Answer: 12
问:如何重新定义parseInt,使其默认为基数为10?我假设你会使用原型方法。
编辑:
也许我应该这样做:
$.fn.extend({
parseInt:function(X) {
return parseInt(X,10);
}
});
答案 0 :(得分:13)
如果存储对原始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);
}
答案 1 :(得分:6)
首先,parseInt
方法假设以下 source :
所以你可以选择解决方案,永远不要从0开始;)
使用ECMA-262(又名EcmaScript 5,又名JavaScript版本5),其中一项新功能是严格模式,您可以使用"use strict"
启用
当您选择加入严格模式时,规则会更改 source :
获得八进制的唯一方法是将radix参数设置为8。
在撰写本文时,ECMAScript 5的支持在所有浏览器中并不一致,因此某些浏览器根本不支持它,这意味着该解决方案对它们没用。其他浏览器的实现都被破坏了,所以即使宣称它支持它,它们也不会。
下图是IE 10发布预览与Chrome 19的比较 - IE正确运行但Chrome没有。
检查浏览器的简便方法是转到:http://repl.it/CZO# 你应该得到10,10,8,10,16,如果那么好 - 如果不是你的浏览器坏了:(
答案 2 :(得分:5)
我认为您的意思是parseInt('014')
,而不是parseInt(014)
。
如果你真的想用你自己的功能替换parseInt
(我强烈反对这个),我想你可以用以下的东西来做:
(function(_parseInt)
{
parseInt = function(string, radix)
{ return _parseInt(string, radix || 10);
};
})(parseInt);
答案 3 :(得分:4)
我个人会为此使用部分功能应用程序模式。类似的东西:
function createIntParser(radix) {
return function(val) {
return window.parseInt(val, radix);
}
}
decimalParseInt = createIntParser(10);
alert(decimalParseInt("010"));
但我喜欢明确。
答案 4 :(得分:2)
i = parseInt('014',10);
无论如何,当你说014
时,它已经意味着数字12,所以parseInt
对它没有任何用处。
的javascript:警报(014 === 12);
答案 5 :(得分:1)