检查var中的对象是否是副本ByVal或ByRef?

时间:2017-07-01 13:37:12

标签: javascript

[更新]:我想检查(递归地)复制到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世界中是否存在相关的包,这将会很有趣。

1 个答案:

答案 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
);
相关问题