Number

<< Tipos básicos de datos Boolean >>

En JS no hay diferencia entre números enteros y decimales. El tipo de dato para cualquier número es number. Además, se pueden representar los números en notación exponencial, además de la notación decimal clásica.

console.log(typeof 3); // Imprime number
console.log(typeof 3.56); // Imprime number

let num = 3.2e-3; // 3.2*(10^-3)
console.log(num); // Imprime 0.0032

Los números son objetos

En JavaScript todo es un objeto, incluso los valores de tipos básicos o primitivos, cosa que no ocurre en otros lenguajes (Java, C++, etc.). Esto se puede comprobar si ponemos un punto después de escribir el número (si es un número entero debemos envolverlo entre paréntesis), lo que nos permite acceder a algunos métodos o propiedades.

console.log(3.32924325.toFixed(2)); // Imprime 3.33
console.log(5435.45.toExponential()); // Imprime 5.43545e+3
console.log((3).toFixed(2)); // Imprime 3.00 

Existe también la clase Number, desde la cual podemos acceder a propiedades y métodos estáticos bastante útiles.

console.log(Number.MIN_VALUE); // 5e-324 (número más pequeño)
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308 (Número más grande)

Hay también valores especiales para los números fuera de rango (Infinito y -Infinito). Para saber si un número es finito o no, podemos comparar con el valor Infinity, o -Infinity. También existe una función llamada isFinite(value) que nos devuelve falso cuando el valor es Infinity o -Infinity.

console.log(Number.MAX_VALUE * 2); // Infinity
console.log(Number.POSITIVE_INFINITY); // Infinity
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(typeof Number.POSITIVE_INFINITY); // number

let number = Number.POSITIVE_INFINITY / 2; // Todavía Infinity!!
if(Number.isFinite(number)) {
    console.log("El número " + number + " es finito");
} else {
    console.log("El número es infinito!");
}

No deberíamos utilizar Number como constructor, ej: new Number(34), para crear números, ya que es más lento, y además genera comparaciones erróneas entre números al no utilizar el valor primitivo, sino la referencia a memoria, para compararlos.

let x = new Number(500);
let y = new Number(500);
console.log(x == y); // false
console.log(x === y); // false

let a = 500;
console.log(x == a); // true
console.log(x === a); // false

console.log(typeof a); // number
console.log(typeof x); // object

// Sin embargo, ambos tienen las mismas propiedades y métodos
console.log(a.__proto__) // Number {...}
console.log(x.__proto__) // Number {...}

Conversión a tipo 'number'

Puedes convertir un dato de otro tipo a number usando la función global Number(value). También puedes añadir el signo '+' antes de la variable para forzar la conversión, ya que el dicho signo solo se puede aplicar a un valor de este tipo.

let s1 = "32";
let s2 = "14";

console.log(s1 + s2); // 3214 (concatena cadenas)
console.log(Number(s1) + Number(s2)); // 46
console.log(+s1 + +s2); // 46

console.log(+true); // true equivale a 1
console.log(+false); // false equivale a 0

Valor especial NaN

Cuando intentamos convertir un dato a número y eso no es posible (por ejemplo una cadena que no represente un número), se devuelve el valor especial NaN (Not a Number). Cualquier operación aritmética con este valor produce a su vez otro valor NaN.

 Para comprobar si el resultado de una conversión u operación es NaN, tenemos la función Number.isNaN(valor), que nos devolverá un valor booleano indicando si es un número válido o no.

let nombre = "Juan";
let num = +nombre;
console.log(num); // NaN
console.log(Number.isNaN(num)); // true
console.log(num + 23); // NaN (no se puede operar)

<< Tipos básicos de datos Boolean >>