使用切片复制数组时的奇怪行为

时间:2012-02-22 11:41:57

标签: javascript backbone.js

我正在使用Backbone.js,并且在重写集合的add方法中,我正在尝试使用slice复制数组,方法如下:

var modelsBefore = this.models.slice(0);
console.log('COPIED', modelsBefore, this.models);

但副本似乎不起作用,这是我的(铬)日志显示的内容:

COPIED [] [child]

知道可能导致这种情况的原因吗?

编辑:

这是一个重现问题的jsfiddle:http://jsfiddle.net/hYDbw/5/

4 个答案:

答案 0 :(得分:3)

slice is not optional的第一个参数:

array.slice(begin[, end])

所以:

this.models.slice(0);

答案 1 :(得分:1)

切片需要启动参数

答案 2 :(得分:1)

这不是复制失败的情况;这是复制数组在console.log 实际输出之前超出范围的情况,因为console.log在某些浏览器(例如Chrome)上异步工作,并且数组传递通过引用。

例如:

function foo() {
   var x = [];
   console.log(x);
   x = [1,2,3];
}

foo();

在某些情况下,you'll see [1,2,3] output rather than the [] that you'd expect

在您的方案中,我不是完全确定发生了什么,但我怀疑modelsBefore已被重新使用并清空,以便在该范围内下一次调用代码。< / p>

如果你早点字符串化,你可以解决它:

function foo() {
   var x = [];
   console.log(JSON.stringify(x));
   x = [1,2,3];
}

foo();

字符串化是一个同步过程,因此您可以确保在那里看到[]

答案 3 :(得分:0)

Backbone中的Collection.models不是数组,它是一个Object。不要指望.slice()能正常使用它。寻找另一种可以完成您期望的实现.slice()。