2012-02-23 63 views
6

我想了解JavaScript八进制和十六进制计算。我知道我可以使用parseInt(string, radix)来获得整数值。将八进制和十六进制数字转换为基数10

例如,当我尝试这个为什么值不同?

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 
+0

你是对的。第一部分是不必要的。 'alert(026)'将产生'22'。阵列如何? – theking963 2012-02-23 19:47:02

+1

请注意,'var foo = new Array(...);'几乎永远不会比'var foo = [...]更可取;'因为前者的字节更多,速度更慢,功能也相同。 – Phrogz 2012-02-23 19:49:14

回答

6

parseInt的参数字符串转换解析它之前:

  1. 令inputString是的ToString(字符串)

所以:

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"); 
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 

你在做什么是传递已经转换到base10整数到parseInt(),然后将它们转换为字符串并将base10解释为base16,再次执行基本转换。

+0

'026 === 22'在EcmaScript 5中不一定是有效的表达式,因为八进制文字是非标准的。有关详细信息,请参见[spec](http://es5.github.com/#B.1.1)。 – 2012-02-23 19:59:36

1

我已经写了一个函数,可以将数字从一个基地转换到另一个,其中起始基地和新基地被指定为参数。

function convertFromBaseToBase(str, fromBase, toBase){ 
    var num = parseInt(str, fromBase); 
    return num.toString(toBase); 
} 

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

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

相关问题