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

Javascript 使用切片复制数组时的奇怪行为,javascript,backbone.js,Javascript,Backbone.js,我使用的是Backbone.js,在覆盖的集合的add方法中,我试图用slice复制一个数组,方法如下: var modelsBefore = this.models.slice(0); console.log('COPIED', modelsBefore, this.models); 但复制似乎不起作用,以下是我的(铬)日志显示的内容: COPIED [] [child] 你知道这是什么原因吗 编辑: 这里有一个JSFIDLE重现了这个问题:切片的第一个参数: 因此: slice的第一个参

我使用的是Backbone.js,在覆盖的集合的
add
方法中,我试图用
slice
复制一个数组,方法如下:

var modelsBefore = this.models.slice(0);
console.log('COPIED', modelsBefore, this.models);
但复制似乎不起作用,以下是我的(铬)日志显示的内容:

COPIED [] [child]
你知道这是什么原因吗

编辑:


这里有一个JSFIDLE重现了这个问题:

切片的第一个参数:

因此:


slice
的第一个参数:

因此:


Slice需要开始参数

Slice需要开始参数

主干中的集合。模型不是数组,而是对象。不要期望.slice()能够正确地使用它。寻找另一个可以实现.slice()所期望的功能的实现。

主干中的Collection.models不是数组,而是对象。不要期望.slice()能够正确地使用它。寻找另一个可以实现.slice()所期望的功能的实现。

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

例如:

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

foo();
在某些情况下

在您的场景中,我不完全确定发生了什么,但我怀疑
modelsBefore
在该范围内的下一次代码调用中已被重复使用并清空

但是,如果您提前进行字符串化,您可以绕过它:

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

foo();

字符串化是一个同步过程,所以您肯定会在那里看到
[]

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

例如:

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

foo();
在某些情况下

在您的场景中,我不完全确定发生了什么,但我怀疑
modelsBefore
在该范围内的下一次代码调用中已被重复使用并清空

但是,如果您提前进行字符串化,您可以绕过它:

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

foo();


字符串化是一个同步过程,所以你肯定会在那里看到
[]

为什么不将数组存储在另一个变量中?为什么你没有在
slice()中设置任何参数?
@Sarfraz:这就是他试图做的…@Sarfraz:如果他只是将数组赋给另一个变量,两者都指向同一个数组。参数不是可选的(即使在当前版本和配置中,在当前日期和当前位置,您的特定实现恰好以其他方式工作)。遵循记录在案的API,而不是纯粹的偶然性为什么不将数组存储在另一个变量中?为什么您没有在
slice()
@Sarfraz:这就是他试图做的…@Sarfraz:如果他只是将数组赋给另一个变量,那么这两个变量都指向同一个数组。参数不是可选的(即使在当前版本和配置中,在当前日期和当前位置,您的特定实现碰巧以其他方式工作).遵循记录在案的API,而不是纯粹的APIchance@sebpiq:是时候用测试用例重现问题了。此外,正确使用
slice
并不能解决问题,这并不意味着你应该决定不正确地使用它。你要找的词是“问题”@sebpiq:是时候用一个测试用例来重现这个问题了。而且,仅仅因为正确地使用
slice
并不能解决您的问题,并不意味着您应该决定不正确地使用它。您要找的词是“问题”,您可以制作一个JSFIDLE以便我们进行测试吗?问题是……我正在使用backbone.js,但我会尝试使用.console.log(JSON.stringify)(本章为模型)在JSFIDLE中使用它?在这里…我猜这是由于主干的某种副作用,但我甚至不知道这是怎么发生的!!??这个JSFIDLE仍然没有揭示如何初始化/分配这个。模型以及它有什么原型。试着提出一个最小的测试用例,没有任何无关的代码。你能E在没有主干网的情况下生成此文件?作为最后手段尝试此方法:
var modelsBefore=Array.prototype.slice.call(this.models,0);
您可以制作一个JSFIDLE以便我们进行测试吗?问题是……我使用的是Backbone.js,但我会尝试.console.log(JSON.stringify(this.models))在JSFIDLE中使用它?在这里…我猜这是由于主干的某种副作用,但我甚至不知道这是怎么发生的!!??这个JSFIDLE仍然没有揭示如何初始化/分配这个。模型以及它有什么原型。试着提出一个最小的测试用例,没有任何无关的代码。你能E在没有主干网的情况下生成此命令?作为最后手段尝试此命令:
var modelsBefore=Array.prototype.slice.call(this.models,0);