layui怎么实现深拷贝和浅拷贝(layui.extend/layui.each)

夏墨大大_9192

夏墨大大_9192

2026-10-07

628人浏览

原创

layui.extend 是浅拷贝,仅遍历赋值第一层属性,不递归处理嵌套对象;修改 target 的嵌套属性会同步影响 source,因其内部采用 for...in + hasownproperty 遍历,无 deep 参数支持。

layui怎么实现深拷贝和浅拷贝(layui.extend/layui.each)

layui.extend 是浅拷贝,不是深拷贝

layui.extend() 本质是属性遍历赋值,不递归处理嵌套对象,所以它只做浅拷贝。即使你传入多层嵌套对象,修改 target 中某个子对象的属性,源对象对应位置也会被改掉。

常见错误现象:layui.extend(target, source) 后修改 target.nested.name,结果 source.nested.name 也变了——这就是浅拷贝的典型表现。

  • 它内部用的是类似 for...in + hasOwnProperty 的遍历逻辑,不判断值类型是否为 object
  • 不支持 true 参数控制深度,和 jQuery.extend 不同,layui.extend 没有 deep 参数
  • 如果你需要深拷贝,不能依赖 layui.extend,必须另选方案

layui.util.deepClone 是官方推荐的深拷贝方法

Layui 2.8+ 内置了 layui.util.deepClone,这是目前最稳妥、兼容性最好的选择。它能正确处理普通对象、数组、Date、RegExp 等常见类型,且不依赖 JSON 序列化(避免丢失 function、undefined、Symbol 等)。

使用场景:树节点状态备份、表格导出前数据预处理、表单重置时还原初始值等需要隔离引用的场合。

  • 直接调用:const cloned = layui.util.deepClone(originalObj)
  • 对 null、undefined、原始类型(string/number/boolean)安全返回原值
  • 会跳过原型链上的属性,只拷贝自有可枚举属性
  • 不处理循环引用,遇到会报错;如需支持循环引用,得自己加缓存 map

为什么不用 JSON.parse(JSON.stringify()) 做深拷贝?

虽然在 Layui 项目里常看到 JSON.parse(JSON.stringify(obj)) 被当深拷贝用,但它在实际业务中容易踩坑:

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
  • function、undefined、Symbol、BigInt 全部丢失或报错
  • Date 变成字符串,RegExp 变成空对象 {}
  • Map/Set/TypedArray 等无法序列化,结果为空或报错
  • 如果对象含循环引用,直接抛 TypeError: Converting circular structure to JSON
  • 在表格导出图片场景中,有人用它深拷贝含 URL 的数据,结果 avatar 字段还在,但 Date 字段已失真——这会影响后续时间比对逻辑

layui.each 配合手动递归也能实现深拷贝,但不推荐

layui.each 是个通用遍历工具,可用于手写深拷贝逻辑,但属于“造轮子”行为,除非你有极特殊需求(比如只拷贝特定 key、跳过某些字段、定制类型处理),否则没必要。

示例片段(仅示意,非完整实现):

function deepCopy(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  const copy = Array.isArray(obj) ? [] : {};
  layui.each(obj, function(key, val) {
    copy[key] = typeof val === 'object' ? deepCopy(val) : val;
  });
  return copy;
}

注意点:

  • 没处理 Date/RegExp/Map/Set 等内置对象,拷出来可能只是空对象
  • 没判断循环引用,深层嵌套时可能栈溢出
  • 性能不如 layui.util.deepClone,后者做了类型分支优化
  • 维护成本高,Layui 升级后若 layui.each 行为变化,你的深拷贝逻辑可能悄然失效

真正该花精力的地方,是确认哪些数据必须深拷贝、哪些可以共享引用——比如 tree 组件的 getChecked() 返回值已经是深拷贝,再套一层 deepClone 就是冗余操作。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui layui菜鸟教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2303

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4963

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6050

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5558

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

783

5

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4036

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1275

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1638

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

9563

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.7万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 10.9万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习