【问题标题】:return void 0; vs return; [duplicate]返回无效0;与回报; [复制]
【发布时间】:2013-10-18 15:53:54
【问题描述】:

我正在研究 Underscore.js 的注解源码。

http://underscorejs.org/docs/underscore.html#section-41

这是 _.first 方法:

  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    return (n == null) || guard ? array[0] : slice.call(array, 0, n);
  };

问题:

为什么'return void 0;'而不仅仅是“返回”; ? 据我所知,return 从函数中隐式返回 undefined(值!)。就像'return void 0'一样。

【问题讨论】:

  • 这似乎是不一致的,因为在源的其他部分使用return;
  • 可能是为了让代码更清晰。
  • 这可能是永远无法解释的事情之一。 (即使你问写它的程序员)
  • 2010-12-01上作者首次将return;添加到代码中,return void 0;出现2012-10-06。把它归结为两年时间的流逝?

标签: javascript underscore.js


【解决方案1】:

MDN reference for the void operator 中声明:

void 运算符通常仅用于获取未定义的 原始值,通常使用“void(0)”(相当于“void 0")。在这些情况下,可以使用全局变量 undefined 来代替 (假设它没有被分配给一个非默认值)。

所以它确实等同于undefined,但undefined 变量的问题在于它可以重新定义为其他东西。就我个人而言,我总是简单地return;,因为它始终产生完全相同的结果(如:(function() {})() === void 0)。

澄清

由于一些评论者认为这不是一个合适的答案:

(function() {})() === void 0 始终返回 true,这意味着它与 return; 完全相同。因此,您可以认为这是 Underscore 库中的不一致,因为在其他地方使用了普通的 return 语句(是的,即使在那里也可能发生)。

缩小和优化

另一个附录,它看起来好像在缩小过程中也没有更好地优化。使用上述代码示例的closure compiler return void 0;return; 版本仍然大约5%。

【讨论】:

  • 使用没有undefined的return,不会出现reassignment问题。这似乎根本没有答案。
  • @guypursey 词法标识符undefined 可以在非全局范围内用作变量名:(function() { var undefined = "foo"; console.log(undefined); })()
  • 这是我的意思的一个小提琴:jsfiddle.net/dXjFy reassigned 可能是错误的术语,应该重新定义。
  • @guypursey 是的,您可以在早期版本的 ECMAScript 中更改全局变量 undefined 的值。请参阅mozilla's reference 上的注释。它说 根据 ECMAScript 5 规范,从 JavaScript 1.8.5 (Firefox 4) 开始,undefined 是不可写的。
  • 我还问了创作者github.com/jashkenas/underscore/issues/…。所以这一切看起来都不一致。一个简单的return; 就可以了。
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2017-06-13
  • 2013-12-03
  • 2015-02-06
相关资源
最近更新 更多