[更新]:我想检查(递归地)复制到var中的对象是否是原始对象的ByVal副本。这意味着它的所有孩子都将是ByVal(深层复制)。
我想知道是否有任何Javascripters找到了检查var是否包含ByVal或ByRef副本的方法。我不担心这样的事情,我也对如何执行这样的检查的想法感兴趣。效用函数对TDD很有用。
Javascript中的所有数据类型都被复制ByVal。但是,当对象被复制到var中时,它可以存储原始对象的ByRef副本 - 它将指针存储在var中。但在某些情况下,您希望通过克隆或使用深层复制技术复制对象ByVal。克隆为您提供浅的ByVal副本,但其中的嵌套对象和数组可以是ByRef副本。使用"深拷贝"技术这样的jQuery $ .extend可以克服这个问题来复制所有嵌套元素ByVal。可能存在不同的情况,您需要真正的ByVal(深拷贝),真正的ByRef或浅拷贝。
我希望能够检查复制的对象及其中的元素,看它是否是真正的ByVal副本。有没有办法做到这一点?
如果您决定编写一个检查ByVal副本的实用程序函数,那么如果它以递归方式遍历嵌套元素,您将获得奖励积分。一个好的实用程序函数可以传递一个数组,一个对象或任何其他数据类型。这在我们检查作为ByRef副本(指针)的对象的属性时非常有用。
最后,这可能是在ES2014,2015或2016年。我要求2014年,但ES2015答案是可以接受的。此外,知道是否有任何javascript框架具有内置的内容或者node.js世界中是否存在相关的包,这将会很有趣。
答案 0 :(得分:0)
function isCopied(val){
return typeof val!=="object" || !!val.clonedfrom;
}
function deepcopy(obj){
var nobj=Object.create(Object.getPrototypeOf(obj));
Object.assign(nobj,obj);
for(key in nobj){
if(typeof nobj[key]==="object"){
nobj[key]=deepcopy(nobj[key]);
}
}
nobj.clonedfrom=obj;
return nobj;
}
console.log(
isCopied(123),//true
isCopied({}),//false
isCopied(deepcopy({}))//true
);