Javascript 使用切片复制数组时的奇怪行为
我使用的是Backbone.js,在覆盖的集合的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的第一个参
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);