Coffeescript / Javascript 为什么,克隆数组中的对象在传递给方法时似乎丢失了它们的引用?
Coffeescript / Javascript Why, do the objects in a cloned array seem to lose their references when passed to a method?
我正在使用 slice()
克隆一个对象数组,但是当我将该克隆的数组传递给另一个方法时,该数组的内容正在丢失它们的引用并变成 undefined
.
class Chooser
constructor: (@order, @items) ->
# do stuff
choose: ->
console.debug "Choosing", @order.size, "from", @items.slice()
@process(@order.size, @items.slice())
# do stuff
process: (count, items) ->
console.debug "count", count
console.debug "items", items
console.debug "@items", @items
# do recursive stuff that includes an items.shift()
第一个 console.debug
给了我预期的结果:
Choosing 10 items from [Item, Item]
其中 Item
和 Item
正是我所期望的。
但是接下来的 console.debug
行给了我
count 10
items [undefined x 2]
@items [Item, Item]
我知道 @items.slice()
创建了 @items
的 浅层 副本,因此数组中的对象是对相同 Item
对象。 Item
对象显然仍然存在,因为它们仍在原始 @items
数组中。
为什么,克隆数组中的对象似乎在 process
方法中丢失了一次引用?
查看此答案以了解您的代码中发生的情况:
如您所见,切片工作正常:
var MyClass = (function() {
function MyClass(items) {
this.items = items;
}
MyClass.prototype.fn1 = function() {
console.log(this.items);
this.fn2(this.items.slice());
};
MyClass.prototype.fn2 = function(items){
console.log(items);
};
return MyClass;
})();
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();
您看到的是您的数组在您在控制台中展开之前被移动了。如果你真的将对象字符串化,你可以看到它已成功传入。
var MyClass = (function() {
function MyClass(items) {
this.items = items;
}
MyClass.prototype.fn1 = function() {
console.log(this.items);
this.fn2(this.items.slice());
};
MyClass.prototype.fn2 = function(items){
console.log(items);
console.log(JSON.stringify(items, null, 2));
items.shift();
items.shift();
};
return MyClass;
})();
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();
我正在使用 slice()
克隆一个对象数组,但是当我将该克隆的数组传递给另一个方法时,该数组的内容正在丢失它们的引用并变成 undefined
.
class Chooser
constructor: (@order, @items) ->
# do stuff
choose: ->
console.debug "Choosing", @order.size, "from", @items.slice()
@process(@order.size, @items.slice())
# do stuff
process: (count, items) ->
console.debug "count", count
console.debug "items", items
console.debug "@items", @items
# do recursive stuff that includes an items.shift()
第一个 console.debug
给了我预期的结果:
Choosing 10 items from [Item, Item]
其中 Item
和 Item
正是我所期望的。
但是接下来的 console.debug
行给了我
count 10
items [undefined x 2]
@items [Item, Item]
我知道 @items.slice()
创建了 @items
的 浅层 副本,因此数组中的对象是对相同 Item
对象。 Item
对象显然仍然存在,因为它们仍在原始 @items
数组中。
为什么,克隆数组中的对象似乎在 process
方法中丢失了一次引用?
查看此答案以了解您的代码中发生的情况:
如您所见,切片工作正常:
var MyClass = (function() {
function MyClass(items) {
this.items = items;
}
MyClass.prototype.fn1 = function() {
console.log(this.items);
this.fn2(this.items.slice());
};
MyClass.prototype.fn2 = function(items){
console.log(items);
};
return MyClass;
})();
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();
您看到的是您的数组在您在控制台中展开之前被移动了。如果你真的将对象字符串化,你可以看到它已成功传入。
var MyClass = (function() {
function MyClass(items) {
this.items = items;
}
MyClass.prototype.fn1 = function() {
console.log(this.items);
this.fn2(this.items.slice());
};
MyClass.prototype.fn2 = function(items){
console.log(items);
console.log(JSON.stringify(items, null, 2));
items.shift();
items.shift();
};
return MyClass;
})();
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();