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 deundefined
es el valor primitivoundefined
.
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:
-
undefined = ''A value'';
intenta asignar una cadena''A value''
a la variable globalundefined
-
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ó,
-
undefined = "A value";
es una tarea simple -
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. -
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. -
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. - 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