是否需要此或(||)语句?

4 javascript underscore.js

在最新的代码,这里是下划线,在211行,读取

result || (result = iterator.call(context, value, index, list))) return breaker;
Run Code Online (Sandbox Code Playgroud)

是需要的还是声明?它可以被替换

(result = iterator.call(context, value, index, list))) return breaker; // ?
Run Code Online (Sandbox Code Playgroud)

result 最初设置为false,除了这一行之外,代码中没有其他地方被修改.

请注意,JavaScript或(||)语句返回第一个操作数(如果它是真实的),第二个操作数(如果它'是第一个操作数)是假的.这是直接来自Crockford,Good Parts.还注意到|| 做一个或与truthy/falsy值不是真/假值.

以下是从上面的链接复制的整个方法:

var any = _.some = _.any = function(obj, iterator, context) {
    iterator || (iterator = _.identity);
    var result = false;
    if (obj == null) return result;
    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
    each(obj, function(value, index, list) {
      if (result || (result = iterator.call(context, value, index, list))) return breaker;
    });
    return !!result;
  };
Run Code Online (Sandbox Code Playgroud)

geo*_*org 7

这让我觉得result||检查只是为了以防万一...或支持forEach定义的环境(例如通过垫片),但事实some并非如此.

正如在评论中指出,强调对本地循环方法依赖(forEach,map和朋友)似乎并没有成为一个绝妙的主意,有几个原因:

  • 它们比简单的循环慢
  • 你不能破坏(嗯,你可以有一个专门的例外,但下划线不这样做)
  • Array.prototype 可被其他(恶意或愚蠢)代码篡改

  • @the_web_situation查看[此行](https://github.com/documentcloud/underscore/blob/master/underscore.js#L79).这意味着如果存在本地`forEach`,则使用它.当发生这种情况时,返回`breaker`将不会停止任何事情.答案是对的 (4认同)
  • 这超出了我的理解,很容易使每个自定义的执行速度比内置的快一个数量级,但是下划线回退到本机,这不仅慢得多,而且语义也有很大差异.耶稣基督,为什么. (2认同)