我正在使用“闭包编译器”,在编译我的脚本时,我花费了以下内容:
编译前:
// ==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”的使用问题,使用上有什么区别或者两种情况都很好吗?。
编辑
如果我定义用“void 0”编译的“var undefined”,如果我没有定义用“undedined.”编译的“undefine”,那么就不是“undefined”和“void 0”之间字符数的问题
编辑二:性能,基于此链接
IE 8:
类型:228ms
未定义:62ms
无效 0:57ms
火狐3.6:
类型:10ms
未定义:3ms
无效 0:3ms
歌剧11:
类型:67ms
未定义:19ms
无效0:20ms
Chrome 8:
类型:3ms
未定义:5ms
无效 0:3ms
运算符计算给定的
void
,然后返回
expression
。
undefined
此运算符允许将产生副作用的表达式插入到需要计算结果为未定义的表达式的位置。
void 运算符通常仅用于获取
原始值,通常使用“
undefined
”(相当于“
void(0)
”)。在这些情况下,可以使用全局变量
void 0
来代替(假设它尚未分配给非默认值)。
undefined
闭包编译器交换
void 0
,因为它包含的字符比 undefined
少,因此生成等效的、更小的代码。
回复:OP评论
是的,我阅读了文档,但在我给出的示例中,在使用“void 0”和另一个“未定义”的情况下“谷歌关闭”
我相信这实际上是 Google Closure 编译器中的 bug!
void expr
和 undefined
之间真正唯一的语义差异是,在 ECMAScript 3 上,全局对象的 undefined
属性(浏览器环境中的 window.undefined
)是可写的,而 void
运算符将返回未定义值总是。
经常实现的一种流行模式,无需担心即可使用
undefined
,只需声明一个参数,而不向其传递任何内容:
(function (undefined) {
//...
if (foo !== undefined) {
// ...
}
})();
这将允许缩小器将参数缩小到一个字母(甚至比
void 0
短:),例如:
(function (a) {
//...
if (foo !== a) {
// ...
}
})();
只是之前所有答案的后续。
它们看起来一样,但对于编译器来说它们完全不同。
这两个代码段编译为不同的输出,因为其中一个代码段引用了局部变量(var 未定义),并且编译器只是将其内联,因为它仅使用一次并且不超过一行。 如果多次使用,则不会发生这种内联。 内联提供“未定义”的结果,更短地表示为“void 0”。
没有局部变量的是指全局对象下名为“undefined”的变量,它被闭包编译器自动“extern'ed”(事实上,所有全局对象属性都是)。 因此,不会发生重命名,也不会发生内联。 瞧!仍然“未定义”。
没有什么区别,自己尝试一下:
void 0 === undefined
将评估为
true
。undefined
长了 3 个字符,我想这就是他们这样使用它的原因。