2011-01-26 3 views
53

Я использую "Closure Compiler" при составлении своих сценариев я провожу следующее:разницы между "пустотой 0" и "неопределенной"

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

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

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

если я определяю «вар неопределенного» скомпилированный с «недействительными 0», если я не определил «неопределенный» скомпилирован с «undedined.», То не вопрос количества символов между «неопределенным "и "пустота 0"

Test

Edit II: производительность, основанная на this link

Code and Test

IE 8:
TypeOf: 228ms
неопределенными: 62ms
недействительными 0: 57ms

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

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

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

ответ

59

From MDN:

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

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

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

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


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

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

Я считаю, что это на самом деле bug in Google Closure Compiler!

+1

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

+0

@andres: hmmm, я вижу, что вы говорите. Это странно ... –

+1

@andres: см. Мое редактирование. –

4

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

void 0 === undefined 

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

+0

И поэтому это оптимизация полосы пропускания: отправить меньше байтов по проводу? –

+1

@JoelCoehoorn: ну, и компилятор замыкания - тоже мини-блок, я думаю, они пытаются сжать каждый байт здесь. – jAndy

+0

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

50

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

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

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

})(); 

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

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

Ницца. Спасибо за это, я задавался вопросом, является ли значение 'undefined' значением или нет. http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html – jAndy

+0

@jAndy, хорошая статья, и спасибо за упоминание;), BTW, вы можете добавить тест против 'void 0', это может быть интересным ... – CMS

+0

Спасибо! Я установил, что 'void 0' теперь работает лучше, чем' undefined', но он все еще находится за кешированной версией. – jAndy

8

Просто продолжением на все ответы прежде.

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^