Javascript void 0:Cuando comencé a aprender JavaScript hace unos ocho años, una situación extraña para mí fue la existencia de valores indefinidos y nulos que representan valores vacíos. ¿Cuál es la clara diferencia entre ellos? Ambos parecen definir valores vacíos, y además la comparación null == undefined se evalúa como verdadera.
La mayoría de los lenguajes modernos como Ruby, Python o Java tienen un único valor nulo (nulo o nulo), lo que parece un enfoque razonable.
En el caso de JavaScript, el intérprete devuelve indefinido cuando accede a una propiedad de variable u objeto que aún no se ha inicializado. Por ejemplo:
Pruebe en repl.it
dejar compañía;
empresa; // => indefinido
let person = {name: ‘John Smith’};
personaje; // => indefinido
Por otro lado, null representa una referencia de objeto faltante. JavaScript por sí mismo no establece variables o propiedades de objeto en nulo.
Algunos métodos nativos como String.prototype.match () pueden devolver null para denotar un objeto perdido. Eche un vistazo a la muestra:
Pruebe en repl.it
let array = null;
formación; // => nulo
let movie = {name: ‘Starship Troopers’, musicBy: null};
movie.musicBy; // => nulo
‘abc’.match (/ [0-9] /); // => nulo
Debido a la naturaleza permisiva de JavaScript, los desarrolladores tienen la tentación de acceder a valores no inicializados. Soy culpable de tan malas prácticas también.
A menudo, estas acciones arriesgadas generan errores relacionados indefinidos, lo que termina rápidamente con la secuencia de comandos. Los mensajes de error comunes relacionados son:
TypeError: ‘undefined’ no es una función
TypeError: no se puede leer la propiedad ‘<prop-name>’ de undefined
y errores de tipo similares.
El desarrollador de JavaScript puede entender la ironía de esta broma:
función indefinida () {
// problema resuelto
}
Para reducir el riesgo de tales errores, debe comprender los casos en los que se genera un valor indefinido. Y lo más importante es suprimir su apariencia y propagación dentro de su aplicación, aumentando la durabilidad del código.
Vamos a detallar la exploración de indefinido y su efecto sobre la seguridad del código.
1. Lo que no está definido
JavaScript tiene 6 tipos primitivos:
Booleano: verdadero o falso
Número: 1, 6.7, 0xFF
Cadena: “Gorila y plátano”
Símbolo: Símbolo (“nombre”) (iniciando ES2015)
Nulo: nulo
Indefinido indefinido.
Y un tipo de objeto separado: {nombre: “Dmitri”}, [“apple”, “orange”].
De los 6 tipos primitivos indefinidos, es un valor especial con su propio tipo Indefinido. De acuerdo con la especificación ECMAScript:
El valor primitivo de valor indefinido se usa cuando a una variable no se le ha asignado un valor.
La norma define claramente que recibirá un valor indefinido cuando acceda a variables no inicializadas, propiedades de objetos no existentes, elementos de matriz no existentes y similares. Por ejemplo:
Pruebe en repl.it
deja número;
número; // => indefinido
let movie = {name: ‘Interstellar’};
movie.year; // => indefinido
let movies = [‘Interestelar’, ‘Alexander’];
películas [3]; // => indefinido
El ejemplo anterior demuestra que accediendo:
un número variable no inicializado
una propiedad de objeto no existente movie.year
o un elemento de matriz no existente películas [3]
son evaluados a indefinido
La especificación ECMAScript define el tipo de valor indefinido:
El tipo no definido es un tipo cuyo único valor es el valor indefinido.
En este sentido, el operador typeof devuelve cadena “indefinida” para un valor indefinido:
Pruebe en repl.it
typeof undefined === ‘undefined’; // => true
Por supuesto, typeof funciona bien para verificar si una variable contiene un valor indefinido:
Pruebe en repl.it
no dejes nada;
typeof nothing === ‘undefined’; // => true
2. Escenarios comunes que crean indefinido
2.1 variable no inicializada
Una variable declarada que aún no está asignada con un valor (sin inicializar) no está definida por defecto.
Simple y simple:
Pruebe en repl.it
deja myVariable;
myVariable; // => indefinido
myVariable está declarado y aún no asignado con un valor. El acceso a la variable se evalúa como indefinido.
Un enfoque eficiente para resolver los problemas de las variables no inicializadas es siempre que sea posible asignar un valor inicial. Mientras menos exista la variable en un estado no inicializado, mejor. Lo ideal sería asignar un valor inmediatamente después de la declaración const myVariable = ‘Valor inicial’, pero esto no siempre es posible.
Consejo 1: Favor const, de lo contrario use let, pero diga adiós a var
En mi opinión, una de las mejores características de ECMAScript 2015 es la nueva forma de declarar variables usando const y let. Es un gran avance que estas declaraciones tengan un ámbito de bloque (a diferencia de la var de ámbito de función más antigua) y que existan en una zona muerta temporal hasta la línea de declaración.
Cuando la variable recibe un valor de una vez y para siempre, recomiendo usar una declaración const. Crea una unión inmutable.
Una de las características interesantes de const es que debe asignar un valor inicial a la variable const myVariable = ‘initial’. La variable no está expuesta al estado no inicializado y acceder a indefinido simplemente no es posible.
Comprobemos la función que verifica si una palabra es un palíndromo:
Pruebe en repl.it
function isPalindrome (palabra) {
const length = word.length;
const half = Math.floor (longitud / 2);
for (let index = 0; index <half; index ++) {
if (palabra [índice]! == palabra [longitud – índice – 1]) {
falso retorno;
}
}
devolver verdadero;
}
isPalindrome (‘madam’); // => true
isPalindrome (‘hola’); // => falso
Palabras claves relacionadas:javascript void 0