разница между "void 0" и "undefined" - PullRequest
57 голосов
/ 26 января 2011

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

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

// ==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»

Тест

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

Код и тест

IE 8:
typeof: 228 мс
undefined: 62 мс
недействительно 0: 57мс

Firefox 3.6:
typeof: 10 мс
undefined: 3 мс
недействительный 0: 3 мс

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

Chrome 8:
typeof: 3 мс
undefined: 5 мс
недействительно 0: 3 мс

Ответы [ 4 ]

65 голосов
/ 26 января 2011

Из MDN :

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

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

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

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


Re: OP comment

да, я прочитал документацию, но вПример, который я привел, «закрытие Google» в случае использования «void 0» и другого «неопределенного» * ​​1032 *

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

52 голосов
/ 26 января 2011

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

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

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

})();

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

(function (a) {
  //...
  if (foo !== a) {
    // ...
  }
})();
8 голосов
/ 10 марта 2011

Просто продолжение всех предыдущих ответов.

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

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

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

4 голосов
/ 26 января 2011

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

void 0 === undefined

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

...