14

我正在研究 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);
  };

问题:

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

4

1 回答 1

9

void 运算符的 MDN 参考中,它指出:

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

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

澄清

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

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

缩小和优化

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

于 2013-10-18T15:57:32.073 回答