在JavaScript中深度克隆对象的最有效方法是什么?
克隆JavaScript对象的最有效方法是什么? 我见过obj = eval(uneval(o));
正在使用,但这是非标准的,仅受Firefox支持 。
我已经完成了obj = JSON.parse(JSON.stringify(o));
但质疑效率。
我还看到了具有各种缺陷的递归复制功能。
我很惊讶没有规范的解决方案存在。
#1楼
码:
// extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned
function extend(from, to)
{if (from == null || typeof from != "object") return from;if (from.constructor != Object && from.constructor != Array) return from;if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function ||from.constructor == String || from.constructor == Number || from.constructor == Boolean)return new from.constructor(from);to = to || new from.constructor();for (var name in from){to[name] = typeof to[name] == "undefined" ? extend(from[name], null) : to[name];}return to;
}
测试:
var obj =
{date: new Date(),func: function(q) { return 1 + q; },num: 123,text: "asdasd",array: [1, "asd"],regex: new RegExp(/aaa/i),subobj:{num: 234,text: "asdsaD"}
}var clone = extend(obj);
#2楼
结构化克隆
HTML标准包括一个内部结构化克隆/序列化算法 ,该算法可以创建对象的深层克隆。 它仍然仅限于某些内置类型,但除JSON支持的几种类型外,它还支持日期,正则表达式,地图,集合,Blob,文件列表,ImageData,稀疏数组,类型数组,并且将来可能还会更多。 它还在克隆的数据中保留引用,从而使其能够支持会导致JSON错误的循环和递归结构。
Node.js中的支持:实验性
当前(从节点11开始)Node.js中的v8
模块直接公开了结构化序列化API ,但是此功能仍标记为“实验性”,并且在将来的版本中可能会更改或删除。 如果使用兼容版本,则克隆对象非常简单:
const v8 = require('v8');const structuredClone = obj => {return v8.deserialize(v8.serialize(obj));
};
浏览器中的直接支持:也许最终?
在JavaScript中深度克隆对象的最有效方法是什么?相关推荐
- 深度克隆对象【前端每日一题-19】
深度克隆对象的方法有哪些?并把你认为最好的写出来. 此题不多说,必须掌握,工作中经常需要用到. JSON.stringify 很明显可以看到输出的对象中没有say方法和undefined属性,所以JS ...
- Javascript基础与面向对象基础~第四讲 Javascript中的类对象
今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...
- 【从0到1学Web前端】javascript中的ajax对象(一)
[从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...
- php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...
JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...
- JavaScript id_好程序员web前端分享Javascript中函数作为对象
好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...
- 在 JavaScript 中创建 JSON 对象
<html> <body> <h2>在 JavaScript 中创建 JSON 对象</h2><p> Name: <span id=& ...
- [js] 请写一个性能最好的深度克隆对象的方法
[js] 请写一个性能最好的深度克隆对象的方法 const deepClone = (obj) => {const copy = obj instance Array ? [] : {};for ...
- JavaScript中的arguments对象
JavaScript中的arguments对象 arguments 是一个类似数组的对象, 对应于传递给函数的参数. 语法 arguments 描述 arguments对象是所有函数中可用的局部变量. ...
- 选择嵌套_如何优雅地在JavaScript中访问嵌套对象
在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...
最新文章
- 西游记里河水让人怀孕的秘密:是寄生虫!我往河里放了寄生虫!
- DS-5/RVDS4.0变量初始化错误
- 并联串联混合的电压和电流_电流互感器一次绕组串联、并联,二次绕组串联、并联的相关问题...
- 10. javacript高级程序设计-DOM
- ASP.NET 1.1与ASP.NET 2.0 应用运行并存
- 穿越沙漠问题c语言算法,穿越沙漠问题---递推法
- 微信小程序之扫一扫功能
- Android APP启动图标尺寸
- 【信号处理】单通道盲源分离(SSA-ICA)算法
- SqLite3基本操作
- Oracle 数据库迁移
- NLP:不要重新造轮子
- 《大学生Python学习》社区正式运行,加入我们,每日学习,引燃青春~
- 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
- Verilog中$finish和$stop的区别
- Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示)
- 人工智能的就业方向有哪些?
- ProSpec BCA-1人重组 (CXCL13)说明书
- 谈对Spring框架的大策大悟
- 一点也不流氓的搜狗输入法皮肤
热门文章
深度克隆对象的方法有哪些?并把你认为最好的写出来. 此题不多说,必须掌握,工作中经常需要用到. JSON.stringify 很明显可以看到输出的对象中没有say方法和undefined属性,所以JS ...
今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...
[从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...
JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...
好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...
<html> <body> <h2>在 JavaScript 中创建 JSON 对象</h2><p> Name: <span id=& ...
[js] 请写一个性能最好的深度克隆对象的方法 const deepClone = (obj) => {const copy = obj instance Array ? [] : {};for ...
JavaScript中的arguments对象 arguments 是一个类似数组的对象, 对应于传递给函数的参数. 语法 arguments 描述 arguments对象是所有函数中可用的局部变量. ...
在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...