javascript - Prototype 1.7.1 和 native 数组使用的错误

标签 javascript exception prototypejs

使用 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/

相关文章:

javascript - Angular 链接 AJAX 调用

用于在范围之间循环 if 的 Javascript

javascript - 关于 for-if 循环中 boolean 逻辑的混淆

c# - 为什么 SerializationInfo 没有 TryGetValue 方法?

java.io.IOException : The issuer can not be found in the trusted CA list

php - Prototype.js 干扰 Javascript

javascript - 将行元素从一个表移动到另一个表,并在将所选行元素添加到第二个表之前验证在第一个表中输入的数据

python - 更pythonic的异常方式?

javascript - jQuery 和 Prototype 之间有什么相似之处?

javascript - Low Pro Prototype DOM Builder 可以在 IE 中运行吗?