2012-02-23 17 views
6

Estoy tratando de entender Javascript octales y hexadecimales cálculos. Sé que puedo usar parseInt(string, radix) para obtener el valor entero.Conversión de números octales y hexadecimales a la base 10

Por ejemplo, cuando intento por esto que son diferentes de los valores?

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 

Pero si intento guardarlo en una matriz ¿por qué las respuestas son diferentes e incorrectas?

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

tiene usted razón. La primera parte es innecesaria. 'alert (026)' arrojará '22'. ¿Qué hay de las matrices? – theking963

+1

Tenga en cuenta que 'var foo = new Array (...);' casi nunca es preferible a 'foo var = [...]; 'ya que el primero es más bytes, más lento, y funcionalmente equivalente. – Phrogz

Respuesta

6

parseInt convierte el argumento de cadena antes de analizarlo:

  1. Let inputString ser ToString (cadena)

Así:

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

Lo que tienes en tus matrices ya son números, por lo que no hay necesidad de analizarlos. Usted recibirá los resultados esperados si se les cambia a cadenas:

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

0xf5 visto fuera una cadena es el número entero 245; no es una cadena que debe ser analizada:

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 

Del mismo modo, 026 fuera de una cadena es el número entero 22:

console.log(026);     //-> 22 

Lo que está haciendo es pasar ya convertida a base10 enteros a parseInt(), que luego los convierte en cadenas e interpreta la base10 como base16, realizando la conversión base por segunda vez.

+0

'026 === 22' no es necesariamente una expresión válida en EcmaScript 5 porque los literales octales no son estándar. Ver la [especificación] (http://es5.github.com/#B.1.1) para más detalles. –

1

He escrito una función que puede convertir un número de una base a otra, donde la base de partida y la nueva base se especifican como parámetros.

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

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

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

Cuestiones relacionadas