“void 0”和“未定义”之间的区别

问题描述 投票:0回答:4

我正在使用“闭包编译器”,在编译我的脚本时,我花费了以下内容:

编译前:

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

javascript google-closure google-closure-compiler
4个回答
75
投票

来自MDN

void
运算符计算给定的
expression
,然后返回
undefined

此运算符允许将产生副作用的表达式插入到需要计算结果为未定义的表达式的位置。

void 运算符通常仅用于获取

undefined
原始值,通常使用“
void(0)
”(相当于“
void 0
”)。在这些情况下,可以使用全局变量
undefined
来代替(假设它尚未分配给非默认值)。

闭包编译器交换

void 0
,因为它包含的字符比
undefined
少,因此生成等效的、更小的代码


回复:OP评论

是的,我阅读了文档,但在我给出的示例中,在使用“void 0”和另一个“未定义”的情况下“谷歌关闭”

我相信这实际上是 Google Closure 编译器中的 bug


56
投票

void expr
undefined
之间真正唯一的语义差异是,在 ECMAScript 3 上,全局对象的
undefined
属性(浏览器环境中的
window.undefined
)是可写的,而
void
运算符将返回未定义值总是

经常实现的一种流行模式,无需担心即可使用

undefined
,只需声明一个参数,而不向其传递任何内容:

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

})();

这将允许缩小器将参数缩小到一个字母(甚至比

void 0
短:),例如:

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

10
投票

只是之前所有答案的后续。

它们看起来一样,但对于编译器来说它们完全不同。

这两个代码段编译为不同的输出,因为其中一个代码段引用了局部变量(var 未定义),并且编译器只是将其内联,因为它仅使用一次并且不超过一行。 如果多次使用,则不会发生这种内联。 内联提供“未定义”的结果,更短地表示为“void 0”。

没有局部变量的是指全局对象下名为“undefined”的变量,它被闭包编译器自动“extern'ed”(事实上,所有全局对象属性都是)。 因此,不会发生重命名,也不会发生内联。 瞧!仍然“未定义”。


4
投票

没有什么区别,自己尝试一下:

void 0 === undefined

将评估为

true

undefined
长了 3 个字符,我想这就是他们这样使用它的原因。

© www.soinside.com 2019 - 2024. All rights reserved.