将八进制和十六进制数转换为十进制

8

我试图理解JavaScript中的八进制和十六进制计算。我知道我可以使用parseInt(string, radix)来获取整数值。

例如,当我尝试这样做时,为什么值不同呢?

var octal = parseInt('026', 8); 
var octal1 = parseInt('030', 8); 
alert(octal); //22
alert(octal1); //24    

var hex = parseInt('0xf5', 16); 
var hex1 = parseInt('0xf8', 16); 
alert(hex); //245
alert(hex1); //248

但是,如果我尝试将它保存在数组中,为什么答案会不同且不正确?

var x = new Array(026, 5, 0xf5, "abc");
var y = new Array(030, 3, 0xf8, "def");

alert('026 is ' + parseInt(x[0],8)); //18
alert('0xf5 is ' + parseInt(x[2],16)); //581
alert('030 is ' + parseInt(y[0],8)); //20
alert('0xf8 is ' + parseInt(y[2],16)); //584

你是对的。第一部分是不必要的。alert(026)将产生22。那么数组呢? - theking963
1
请注意,var foo = new Array(...); 几乎从来不优于 var foo = [...];,因为前者更占用字节、速度较慢且在功能上等效。 - Phrogz
3个回答

7

parseInt在解析参数之前将其转换为字符串:

  1. 设inputString为ToString(string)

因此:

0x35.toString() // "53"
parseInt( "53", 16 ); //83
parseInt( 0x35, 16 ); //83

你的数组中大部分已经是数字,所以不需要解析它们。如果将它们更改为字符串,您将获得预期的结果:

var x = new Array("026", "5", "0xf5", "abc");
var y = new Array("030", "3", "0xf8", "def");

3
我已经编写了一个函数,可以将一个数字从一种进制转换为另一种进制,其中起始进制和新进制作为参数指定。
function convertFromBaseToBase(str, fromBase, toBase){
    var num = parseInt(str, fromBase);
    return num.toString(toBase);
}

alert(convertFromBaseToBase(10, 2, 10));

http://jsfiddle.net/jarble/p9ZLa/


0

0xf5 在字符串外面出现时,它代表的是整数 245,而不是需要解析的字符串:

console.log( "0xf5" );              //-> 0xf5
console.log( parseInt("0xf5",16) ); //-> 245
console.log( 0xf5 );                //-> 245
console.log( parseInt(0xf5,16)  );  //-> 581
console.log( parseInt("245",16) );  //-> 581
console.log( parseInt(245,16)   );  //-> 581

同样地,字符串外的026是整数22
console.log( 026 );                 //-> 22

你正在做的是将已经转换为十进制整数的值传递给 parseInt(),然后它会将它们转换为字符串并将十进制解释为十六进制,从而进行第二次基数转换。

在 EcmaScript 5 中,“026 === 22”不一定是有效的表达式,因为八进制字面量是非标准的。有关详细信息,请参见规范 - Mike Samuel

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