我正在使用Backbone.js,并且在重写集合的add
方法中,我正在尝试使用slice
复制数组,方法如下:
var modelsBefore = this.models.slice(0);
console.log('COPIED', modelsBefore, this.models);
但副本似乎不起作用,这是我的(铬)日志显示的内容:
COPIED [] [child]
知道可能导致这种情况的原因吗?
编辑:
这是一个重现问题的jsfiddle:http://jsfiddle.net/hYDbw/5/
答案 0 :(得分:3)
答案 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()。