使用chrome 21和原型1.7.1,我发现使用throw $break
不起作用。
当Error
应该被
if (e != $break) { ... }
我怀疑这是因为inject
在Chrome中具有原生实现,并且它不会被其他内置函数包含在相同的功能中。
我在假设这个时是否正确,或者我的代码是否有问题?
代码re-create:
var a = [1,2,3,4,5,6,7,9].inject([], function(arr, e) {
console.log(e);
if (e === 5) {
throw $break;
}
arr.push('Done ' + e);
return arr;
});
console.log('Final Array : ' + a)
更新
刚刚使用Firefox 14和IE 9测试过,同样的错误就出现了。
更新(2015)
这似乎由1.7.3
解决,使用Chrome 45.0.2454.101进行了测试
通过检查来源验证,reduce
已被删除
答案 0 :(得分:4)
问题是,从Prototype 1.7.1开始,Array#inject
有两个实现,它们的行为不同。 (这不是很好 tm 。)这是Prototype 1.7.1和1.7.0之间的重大变化,我们可以看到使用this fiddle与this one。
如果原生Array
对象具有来自ES5的reduce
功能,Array#inject
使用它 - 而不处理$break
- 如果不是,Array#inject
}是通过Enumerable#inject
实现的,Enumerable#each
使用$break
来处理reduce
。
如果搜索Prototype 1.7.1源,可以看到这一点。首先,您在Enumerable
中找到非reduce
版本,然后在Array
内找到Array
版本,您会看到Enumerable
如果reduce
不存在,则版本会获取{{1}}版本。