克隆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中深度克隆对象的最有效方法是什么?相关推荐

  1. 深度克隆对象【前端每日一题-19】

    深度克隆对象的方法有哪些?并把你认为最好的写出来. 此题不多说,必须掌握,工作中经常需要用到. JSON.stringify 很明显可以看到输出的对象中没有say方法和undefined属性,所以JS ...

  2. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  3. 【从0到1学Web前端】javascript中的ajax对象(一)

    [从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...

  4. php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...

    JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...

  5. JavaScript id_好程序员web前端分享Javascript中函数作为对象

    好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...

  6. 在 JavaScript 中创建 JSON 对象

    <html> <body> <h2>在 JavaScript 中创建 JSON 对象</h2><p> Name: <span id=& ...

  7. [js] 请写一个性能最好的深度克隆对象的方法

    [js] 请写一个性能最好的深度克隆对象的方法 const deepClone = (obj) => {const copy = obj instance Array ? [] : {};for ...

  8. JavaScript中的arguments对象

    JavaScript中的arguments对象 arguments 是一个类似数组的对象, 对应于传递给函数的参数. 语法 arguments 描述 arguments对象是所有函数中可用的局部变量. ...

  9. 选择嵌套_如何优雅地在JavaScript中访问嵌套对象

    在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...

最新文章

  1. 西游记里河水让人怀孕的秘密:是寄生虫!我往河里放了寄生虫!
  2. DS-5/RVDS4.0变量初始化错误
  3. 并联串联混合的电压和电流_电流互感器一次绕组串联、并联,二次绕组串联、并联的相关问题...
  4. 10. javacript高级程序设计-DOM
  5. ASP.NET 1.1与ASP.NET 2.0 应用运行并存
  6. 穿越沙漠问题c语言算法,穿越沙漠问题---递推法
  7. 微信小程序之扫一扫功能
  8. Android APP启动图标尺寸
  9. 【信号处理】单通道盲源分离(SSA-ICA)算法
  10. SqLite3基本操作
  11. Oracle 数据库迁移
  12. NLP:不要重新造轮子
  13. 《大学生Python学习》社区正式运行,加入我们,每日学习,引燃青春~
  14. 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
  15. Verilog中$finish和$stop的区别
  16. Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示)
  17. 人工智能的就业方向有哪些?
  18. ProSpec BCA-1人重组 (CXCL13)说明书
  19. 谈对Spring框架的大策大悟
  20. 一点也不流氓的搜狗输入法皮肤

热门文章

  1. Mysql数据库事务详解
  2. JavaScript语言基础12
  3. Kafka如何基于CopyOnWrite实现线程安全的Deque构建
  4. JSONSerialization.ReadingOption详解
  5. (020)java后台开发之JAVA集合中的List接口
  6. postman+Newman初步使用
  7. CSS基础学习-7.CSS元素分类
  8. 谷歌社交平台新漏洞威胁千万用户隐私 将提早关闭
  9. 译: 5. RabbitMQ Spring AMQP 之 Topic 主题
  10. 在linux 下配置firewalld