Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取对象数据的浅拷贝的最快方法是什么?_Javascript - Fatal编程技术网

Javascript 获取对象数据的浅拷贝的最快方法是什么?

Javascript 获取对象数据的浅拷贝的最快方法是什么?,javascript,Javascript,请仅限香草JS 也就是说,它的输出应该是一个只包含数据的对象,并且忽略原始的方法/原型。从默认对象继承的复杂数据结构,如数组,可以作为引用以浅层方式复制。我现在的做法是: function shallowCopyObjectData(obj) { output = {}; for (var i in item) { output[i] = obj[i]; } return output; }; 我看到的另一种方式是: function shallowCopyObject

请仅限香草JS

也就是说,它的输出应该是一个只包含数据的对象,并且忽略原始的方法/原型。从默认
对象
继承的复杂数据结构,如
数组
,可以作为引用以浅层方式复制。我现在的做法是:

function shallowCopyObjectData(obj) {
  output = {};
  for (var i in item) {
    output[i] = obj[i];
  }
  return output;
};
我看到的另一种方式是:

function shallowCopyObjectData(obj) {
  return JSON.parse(JSON.stringify(obj));
};
最有效的方法是什么

我做了一个跑步jsPerf来比较速度。如果您提出了解决方案,请随时提出并添加:

编辑
@Barmar:我知道a,但它询问了克隆对象的最快方式,这意味着保留构造函数、原型等的深度复制。这个问题问的是复制顶层数据的最快方式。

我想你问的是深度克隆(copy)。浅复制与将原始对象指定给新变量一样简单

var originalObj = { someKey: 1 };
var copyObj = originalObj; 
该方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 如果源中的属性具有相同的键,则目标对象中的属性将被源中的属性覆盖

varobj={a:1,b:2,};
var new_obj=Object.assign({},obj);
控制台日志(新的_obj)//{a:1,b:2,}

log(new_obj==obj)//false
您可以使用
对象。将
分配给快速克隆对象。语法是
Object。分配(原始对象、扩展对象)
。它将返回具有originObject和extendObject属性的对象

例如,我这里有代码:

var originObject={value:1};
var extendObject={key:2};
var shadowObject={};
//现在我想克隆originObject到阴影对象
阴影对象=对象。赋值(originObject,{});
//shadowObject={value:1}
//如果要将originObject和extendObject克隆到一个对象
阴影对象=对象。指定(原始对象、阴影对象);
//shadowObject={value:1,key:2}

@Barmar,我认为将此标记为重复不公平。另一个问题是关于克隆对象的最快方法,这意味着一个保存构造函数、原型等的深度复制。这个问题是关于只复制顶层数据的最快方法。我觉得这是两件不同的事情……一个有趣的例子:我有一个Web应用程序,可以遍历和缓存53000个对象上的数据。当我的节点应用程序运行时,它给了我一个巨大的延迟,需要75829ms才能完成加载。我用parse/stringify替换了它,速度提高到718ms。你真的需要浅拷贝整个对象吗?或者您是否可以使用一些可预测的属性名称集?我想补充一点,即函数似乎无法通过parse/stringify正确保存|如果已知对象具有相同的结构(表格数据),则可以生成克隆器。并获得巨大的性能提升,因为您的对象将共享相同的隐藏类。我认为有很大的不同。指定引用不会创建新对象,而浅复制会创建新对象。在您给出的示例中,
copyObj===originalObj
将给出
true
,但对于浅拷贝,它应该是
false
。这完全是错误的。你把身份和价值混为一谈。可以为新标识(变量名)赋值,而无需复制基础值。OP询问有关浅层复制的问题。这只能在操作定义的实际值上发生<代码>对象。分配
或JS扩展运算符aka
{…obj}
是方法。您好-您能为您的答案添加多一点上下文/解释吗?:)eslint建议使用spread操作符
var new_obj={…obj}
它在所有现代web浏览器中都可用: