validacion que formularios ejemplos ejemplo con carga asincrona javascript undefined

javascript - formularios - innerhtml que es



¿Qué sucede si establecemos el valor de indefinido? (3)

undefined es una propiedad del objeto global, es decir, es una variable de alcance global. El valor inicial de undefined es el valor primitivo undefined .

Ver https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

Entonces, es solo una variable, no tiene nada de especial. Ahora, para responder a sus preguntas:

  1. undefined = ''A value''; intenta asignar una cadena ''A value'' a la variable global undefined
  2. En navegadores antiguos, el valor cambia, es decir, undefined === ''A value''; // true undefined === ''A value''; // true . En los navegadores más nuevos en modo estricto, la operación produce un error.

Puede probar lo siguiente en una consola del navegador (estoy usando un navegador moderno aquí: Google Chrome):

undefined = true; console.log(undefined); // undefined // in older browsers like the older Internet Explorer it would have logged true

El valor de undefined no cambia en el ejemplo anterior. Esto es porque (énfasis mío):

En los navegadores modernos (JavaScript 1.8.5 / Firefox 4+), undefined es una propiedad no configurable, no editable según la especificación ECMAScript 5.

En modo estricto:

''use strict''; undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property ''undefined'' of object

¿Qué hace esta línea a continuación?

undefined = ''A value'';

Si no cambia el valor de undefined , ¿qué sucede detrás de escena?


A diferencia de cosas como true , 123 o null , undefined no es un literal . Eso significa que usar el identifier undefined no es una forma infalible de obtener el valor indefinido . En cambio, puede usar el operador void , por ejemplo, void 0 .

Por defecto, undefined define una propiedad del objeto global , es decir, variable global. Antes de ECMAScript 5, esa propiedad era escribible, así que

undefined = "A value";

reemplazó el valor de window.undefined , asumiendo que no estaba sombreado por una variable local. Entonces, si usó "A value" === undefined , se volvería true . Y void 0 === undefined produciría false .

ECMAScript 5 cambió este comportamiento y ahora la propiedad no se puede escribir ni configurar. Por lo tanto, las asignaciones a undefined se ignorarán en modo no estricto, y arrojarán una excepción en modo estricto. Bajo el capó,

  1. undefined = "A value"; es una tarea simple
  2. Que utiliza PutValue para poner el valor "A value" en una referencia con base en el objeto global, el nombre de referencia "undefined" y una marca estricta si la asignación se realiza en modo estricto.
  3. Llama al método interno [[Put]] del objeto global, pasando "undefined" como el nombre de la propiedad, "A value" como el valor y la bandera estricta como la bandera de lanzamiento.
  4. Llama al método interno [[DefineOwnProperty]] del objeto global, pasando "undefined" , el descriptor de propiedad {[[Value]]: "A value"} , y la marca de lanzamiento como argumentos.
  5. Rechaza, es decir, lanza una excepción TypeError si el indicador de lanzamiento es verdadero; de lo contrario, devuelve falso.

Sin embargo, aún puede declarar variables locales undefined :

(function() { var undefined = "A value"; alert(undefined); // "A value"; })();


He hecho un pequeño POC con y sin strict mode .

El efecto es que, si no está utilizando el strict mode todo va bien. Si está utilizando el strict mode tendrá un buen:

TypeError: no se puede asignar a la propiedad de solo lectura ''undefined''

Ahora vamos al POC:

"use strict" var c; if (c === undefined) { console.log("nothing happened") } undefined = "goofy" c = "goofy" if (c === undefined) { console.log("c is ''goofy'' and it''s equal to undefined.. gosh.. we broke js") }

Ahora, como dije, con el modo estricto TypeError un TypeError mientras TypeError el "use strict" el script funciona bien y la salida es simplemente que nothing happened .

He encontrado este Q / A que podría ser útil si quieres saber más

NOTA : He probado este código usando Node.js