这是underscore中的一行代码。该行的加前缀是什么?

if (obj.length === +obj.length) { // plus prefix?

最佳答案

这将obj.length的值强制为Number。本质上,这样做是为了确保未重写类似数组的对象的默认length值,以便可以正确地对其进行迭代。

在这种情况下,breaker不会执行任何操作,因为与{}相比,即使是另一个空对象false也会计算为breaker,即使没有等效比较也是如此。

但是,在这种情况下不使用breaker,因为它是在.each函数之外定义的,该函数看起来与此处显示的不同。相反,它用于迫使其他循环方法“中断”:

_.every = _.all = function(obj, iterator, context) {
  /* snip */
  if (!(result = result && iterator.call(context, value, index, list)))
      return breaker;


您可以看到,如果在“每一个”中结果都不是真实的,我们希望立即打破。 _.every调用_.each,它将返回breaker,与自身相比,它为true,允许立即中断。

10-04 16:08