diferencia entre "void 0" y " undefined"
Estoy usando "Closure Compiler" , al compilar mis scripts paso lo siguiente:
Antes de compilar:
// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print,print_input_delimiter
// ==/ClosureCompiler==
var myObj1 = (function() {
var undefined; //<----- declare undefined
this.test = function(value, arg1) {
var exp = 0;
arg1 = arg1 == undefined ? true : arg1; //<----- use declare undefined
exp = (arg1) ? value * 5 : value * 10;
return exp;
};
return this;
}).call({});
var myObj2 = (function() {
this.test = function(value, arg1) {
var exp = 0;
arg1 = arg1 == undefined ? true : arg1; //<----- without declare undefined
exp = (arg1) ? value * 5 : value * 10;
return exp;
};
return this;
}).call({});
Compilado:
// Input 0
var myObj1 = function() {
this.test = function(b, a) {
a = a == void 0 ? true : a; //<-----
var c = 0;
return c = a ? b * 5 : b * 10
};
return this
}.call({}), myObj2 = function() {
this.test = function(b, a) {
a = a == undefined ? true : a; //<-----
var c = 0;
return c = a ? b * 5 : b * 10
};
return this
}.call({});
Con esto creo que la cuestión del uso de "void 0" y "undefined", ¿hay alguna diferencia en el uso o los dos casos están bien?.
Editar
Si defino "var undefined" compilado con "void 0 ", si no defino "undefined" compilado con "undedined. "entonces no es una cuestión de número de caracteres entre "undefined"y" void 0 "
Edit II: performance, basado en este enlace
IE 8:
tipo de: 228ms
undefined: 62ms
void 0: 57ms
Firefox 3.6:
tipo de: 10ms
undefined: 3ms
void 0: 3ms
Opera 11:
tipo de: 67ms
undefined: 19ms
void 0: 20ms
Cromo 8:
tipo de: 3ms
undefined: 5ms
void 0: 3ms
4 answers
De MDN :
El operador
void
evalúa laexpression
y luego devuelveundefined
.Este operador permite insertar expresiones que producen efectos secundarios en lugares donde se desea una expresión que se evalúa como indefinida.
El operador void se usa a menudo simplemente para obtener el valor primitivo
undefined
, generalmente usando "void(0)
" (que es equivalente a "void 0
"). En estos casos, se puede utilizar la variable globalundefined
(suponiendo que no se ha asignado a un valor no predeterminado).
El compilador de cierre se intercambia en void 0
porque contiene menos caracteres que undefined
, por lo tanto, producir código equivalente, más pequeño.
Re: OP comment
Sí, he leído la documentación, pero en el ejemplo que he dado, "google closure" en un caso usando "void 0" y otro "undefined"
Creo que esto es en realidad un error en el cierre de Google Compilador!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 09:24:09
La única diferencia semántica real entre void expr
y undefined
es que en ECMAScript 3, la propiedad undefined
del objeto global (window.undefined
en entornos de navegador) es escribible, mientras que el operador void
devolverá el valor undefined
siempre.
Un patrón popular que a menudo se implementa, para usar undefined
sin preocupaciones es simplemente declarar un argumento, y no pasarle nada:
(function (undefined) {
//...
if (foo !== undefined) {
// ...
}
})();
Eso permitirá a los minifiers reducir el argumento tal vez a un una sola letra (incluso más corta que void 0
:), por ejemplo:
(function (a) {
//...
if (foo !== a) {
// ...
}
})();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 15:36:08
Solo un seguimiento de todas las respuestas anteriores.
Son iguales, pero para el Compilador son completamente diferentes.
Las dos secciones de código se compilan en salidas diferentes porque una se refiere a una variable local (el var indefinido), y el compilador simplemente lo alinea porque se usa exactamente una vez y no es más de una línea. Si se usa más de una vez, entonces este revestimiento interno no sucederá. El revestimiento proporciona un resultado de "indefinido", que es más corto para representar como "void 0".
El que no tiene una variable local se refiere a la variable llamada "undefined" bajo el objeto global , que es automáticamente "extern'ed" por el Compilador Closure (de hecho, todas las propiedades del objeto global lo son). Por lo tanto, no se lleva a cabo el cambio de nombre, y no se lleva a cabo el alineamiento. ¡Voila! todavía "indefinido".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 12:33:50
No hay diferencia, Pruébalo tú mismo:
void 0 === undefined
Evaluará a true
.undefined
es 3 personajes más largos, supongo que esa es la razón por la que lo usan de esa manera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 15:28:00