使用 chrome 21 和原型(prototype) 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
已被删除
最佳答案
问题是从 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
.
如果您搜索 Prototype 1.7.1 源代码,您可以看到这一点。首先在 Enumerable
中找到非 reduce
版本,然后在 Array
中找到 reduce
版本东西,如果 reduce
不存在,您会看到 Array
版本获取 Enumerable
版本。
关于javascript - Prototype 1.7.1 和 native 数组使用的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12580410/