разница между "void 0" и " undefined"


Я использую "Компилятора", при компиляции моих скриптов я провожу следующее:

перед компиляцией:

// ==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({});

составлен:

// 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({});

С этим я считаю, что вопрос об использовании "void 0" и "undefined", есть ли разница в использовании или два случая хорошо?.

Edit

Если я определяю "ВАР не определено", составленный с "пустотой 0 ", если я ничего не определяет "неопределенные", составлены с - необдуманно. "тогда не вопрос количества символов между "undefined"и" void 0"

тест

Edit II: производительность, основанная на этой ссылке

код и тест

IE 8:
typeof: 228ms
неопределен: 62ms
void 0: 57ms

Firefox 3.6:
typeof: 10ms
не определено: 3ms
недействительными 0: 3 мс

Опера 11:
typeof: 67ms
неопределен: 19ms
недействительными 0: 20 мс

Chrome 8:
typeof: 3ms
неопределенный: 5 мс
недействительными 0: 3 мс

4 57

4 ответа:

от MDN:

The void оператор вычисляет заданное expression а потом возвращается undefined.

этот оператор позволяет вставлять выражения, которые вызывают побочные эффекты, в места, где требуется выражение, которое оценивается как неопределенное.

оператор void часто используется только для получения undefined примитивное значение, обычно с помощью "void(0)" (что эквивалентно "void 0"). В в этих случаях глобальная переменная (при условии, что оно не было присвоено значению, отличному от значения по умолчанию).

компилятор закрытия меняет местами в void 0, потому что он содержит меньше символов, чем undefined, таким образом, производя эквивалентный, меньший код.


Re: OP comment

да, я читал документацию, но в приведенном примере "закрытие google" в случае использования "void 0" и другого "undefined"

Я считаю, что это на самом деле ошибка в компиляторе закрытия Google!

реальная только семантическая разница между void expr и undefined на ECMAScript 3 на undefined свойство глобального объекта (window.undefined в средах браузера) доступен для записи, тогда как void оператор вернет undefined стоимостью всегда.

популярный шаблон, который часто реализуется, чтобы использовать undefined без забот просто объявляет аргумент, а не передает ему ничего:

(function (undefined) {
  //...
  if (foo !== undefined) {
    // ...
  }

})();

что будет позвольте minifiers, чтобы уменьшить аргумент может быть в одну букву (даже короче, чем void 0 :), например:

(function (a) {
  //...
  if (foo !== a) {
    // ...
  }
})();

просто на все ответы.

Они выглядят одинаково, но для компилятора они совершенно разные.

два раздела кода компилируются на разные выходы, потому что один ссылается на локальную переменную (var undefined), а компилятор просто строит ее, потому что она используется ровно один раз и не более одной строки. Если он используется более одного раза, то это в подкладке не произойдет. Внутренняя подкладка обеспечивает результат "неопределенного", который является короче представлять как "void 0".

тот, у которого нет локальной переменной, ссылается на переменную с именем "undefined" под глобальный объект, который автоматически "extern'Ed" компилятором закрытия (на самом деле, все свойства глобального объекта). Таким образом, переименование не происходит, и никакая подкладка не происходит. Вуаля! все еще"неопределенный".

нет никакой разницы, попробуйте сами:

void 0 === undefined

будет оценено как true.
undefined и 3 символы больше, я думаю, что это причина, почему они используют его таким образом.