这是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,允许立即中断。