разница между "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", есть ли разница в использовании или два случая хорошо?.

редактировать

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

тест

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

код и тест

IE 8:
для вызова typeof: 228ms
неопределен: 62ms
void 0: 57ms

Firefox 3.6:
для вызова typeof: 10мс
не определено: 3МС
недействительными 0: 3 мс

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

Chrome 8:
для вызова typeof: 3МС
неопределен: 5 мс
недействительными 0: 3 мс

4 ответов


из MDN:

на void оператор оценивает данный expression и затем возвращает undefined.

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

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

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


Re: op комментарий

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

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


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

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

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

})();

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

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

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

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

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

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


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

void 0 === undefined

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