разница между "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 ответов
на
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 символы длиннее, я думаю, именно поэтому они используют его таким образом.