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 "

Prueba

Edit II: performance, basado en este enlace

Código y Prueba

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

Author: andres descalzo, 2011-01-26

4 answers

De MDN :

El operador void evalúa la expression y luego devuelve undefined.

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 global undefined (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!

 63
Author: Matt Ball,
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) {
    // ...
  }
})();
 52
Author: CMS,
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".

 8
Author: Stephen Chung,
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.

 4
Author: jAndy,
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