Prototype 1.7.1和Native Array Usage的错误

时间:2012-09-25 09:49:10

标签: javascript exception-handling prototypejs

使用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已被删除

1 个答案:

答案 0 :(得分:4)

问题是,从Prototype 1.7.1开始,Array#inject有两个实现,它们的行为不同。 (这不是很好 tm 。)这是Prototype 1.7.1和1.7.0之间的重大变化,我们可以看到使用this fiddlethis 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}}版本。