Подтвердить что ты не робот

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

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

Edit

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

Тест

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

Код и тест

IE 8:
Тип: 228ms
undefined: 62ms
void 0: 57ms

Firefox 3.6:
Тип: 10 мс
undefined: 3ms
void 0: 3ms

Opera 11:
typeof: 67ms
undefined: 19мс
void 0: 20ms

Chrome 8:
Тип: 3 мс
undefined: 5ms
void 0: 3ms

4b9b3361

Ответ 1

из MDN:

Оператор void оценивает данное выражение , а затем возвращает undefined.

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

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

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


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

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

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

Ответ 2

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

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

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

})();

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

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

Ответ 3

Просто выполните все ответы до этого.

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

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

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

Ответ 4

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

void 0 === undefined

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