JavaScript 中的对象是通过引用传递的。对此类对象的异步函数之外的任何更改都会稍后反映在对象本身中。
一个简单的解决方案是通过创建一个具有原始所有属性(可能还有方法...)的新对象来复制对象。
数组的示例是这个简洁的小代码:[].concat(collection);
. 但既然我们在这里谈论对象,那是行不通的。使用 jQuery,这将像 一样简单$.extend({}, collection);
,但是由于您没有标记它,所以让我们制作我们自己的该方法版本。
function extend( to, from, deep ) {
// Double negation to force deep to be a boolean even if not provided. Thus: defaults to false.
deep = !!deep;
for( var i in from ) {
if( deep ) {
if( typeof from[i] == 'object' ) {
// Array?
if( from[i].length && typeof from[i].splice == 'function' ) {
to[i] = [].concat(from[i]);
}
// nested object!
else {
to[i] = {};
extend(to[i], from[i], deep);
}
}
else {
to[i] = from[i];
}
}
}
return to;
}
将其应用于socket.emit
:
socket.emit('object', {
'object' : extend({}, collection, true)
});
请注意,循环引用在深度复制时会导致无限循环。