我正在研究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'那样。
答案 0 :(得分:6)
在MDN reference for the void operator中声明:
void运算符通常仅用于获取未定义的运算符 原始值,通常使用“void(0)”(相当于“void” 0“)。在这些情况下,可以使用未定义的全局变量 (假设它尚未分配给非默认值)。
所以它确实等同于undefined
,但undefined
变量的问题在于它可以重新定义为其他东西。就个人而言,我总是只是return;
因为它始终产生完全相同的结果(如:(function() {})() === void 0
)。
由于一些评论者认为这不是一个合适的答案:
(function() {})() === void 0
总是产生true,这意味着它与return;
完全相同。所以你可以认为这是Underscore库中的一个不一致,因为在其他地方使用了普通的return语句(是的,即使它可能发生)。
另一个附录,看起来好像它在缩小时也没有更好地优化。使用closure compiler上述代码示例的return void 0;
vs return;
版本仍然大约增加5%。