前言 最近在看Vue_shop实战项目-电商管理系统(Element-UI)的B站视频,看到 P172 08.商品添加-把goods_cat从数组转换为字符串时,讲到了Lodash这个工具库的cloneDeep.../lodash/lodash Loadsh的使用介绍 下载loadsh 核心版 (~4kB gzipped) 完整版 (~24kB gzipped) CDN 加速 Lodash 遵循 MIT 开源协议发布...Lodash 的模块化方法 非常适用于: 1、遍历 array、object 和 string 2....补充工具 futil-js 是一套用来补足 lodash 的实用工具集。...loadsh中的cloneDeep方法使用 cloneDeep方法介绍 _.cloneDeep(value) 这个方法类似_.clone,除了它会递归拷贝 value。(注:也叫深拷贝)。
如果觉得没有面试题,那么lodash每一个方法就可以当作一个题目,可以看着效果反过来实现,以不同的方法实现、多种方法实现,巩固基础。除了某些一瞬间就可以实现的函数,下面抽取部分函数作为试炼。...lodash这个库在这里更像一个题库,给我们刷题的 能收获什么: 修炼代码基本功,了解常见的套路 了解到一些操作的英文命名和规范 积累经验,面对复杂逻辑问题可以迅速解决 也许可以查到自己的js基础知识的漏洞...面临大数据的性能瓶颈,才是考虑命令式编程的时候 还是老生常谈的深浅拷贝,但是我们这次彻底探究一遍各种对象的拷贝以及补回一些js冷门知识 clone & cloneDeep(不考虑不常用对象) lodash...在实现lodash的之前,我们先实现一个正常的满足大部分场景的拷贝: 浅拷贝 难度系数: ★ 建议最长用时:2min function shallowClone(v) { if (typeof v..._.cloneDeep(value)创建一个 value 的深拷贝。
如果觉得没有面试题,那么lodash每一个方法就可以当作一个题目,可以看着效果反过来实现,以不同的方法实现、多种方法实现,巩固基础。除了某些一瞬间就可以实现的函数,下面抽取部分函数作为试炼。...lodash这个库在这里更像一个题库,给我们刷题的 能收获什么: 修炼代码基本功,了解常见的套路 了解到一些操作的英文命名和规范 积累经验,面对复杂逻辑问题可以迅速解决 也许可以查到自己的js基础知识的漏洞...面临大数据的性能瓶颈,才是考虑命令式编程的时候 还是老生常谈的深浅拷贝,但是我们这次彻底探究一遍各种对象的拷贝以及补回一些js冷门知识 clone & cloneDeep(不考虑不常用对象) lodash..._.cloneDeep(value)创建一个 value 的深拷贝。...return result; } Symbol symbol类型的值,通过Symbol(value)产生,而且Symbol不能new。
对于深层复制,最简单的选择是使用可靠的外部库,如Lodash。...使用 Lodash 的 Clone 和 Clonedeep Lodash 提供两种不同的功能,允许你进行浅拷贝和深拷贝,它们是 clone 和 clonedeep。...1const clone = require('lodash/clone'); 2const cloneDeep = require('lodash/clonedeep'); 3 4// 你也可以这样做...: 5// const clone = require('lodash.clone'); 6// const cloneDeep = require('lodash.clonedeep'); 7// 取决于你自己的风格...:) 现在就用 clone 和 clonedeep 函数做一些尝试: 1const clone = require('lodash/clone'); 2const cloneDeep = require
Lodash 不同 import 方式的包大小比较 讲完上面的 demo,我们以实际的 lodash 库为例,看看不同的 import 方式对打包后的文件大小的影响。...首先,我们继续在上面的 demo 项目中安装 lodash 模块(当前版本 4.17.15) npm i -S lodash 将 index.js 修改为如下内容: import { cloneDeep...} from 'lodash' const name = cloneDeep({id:'猫哥学前班'}) console.log(name) 执行 npx webpack 后,可以看到 dist/main.js...如果我们将第一行函数引入方式修改为按需引用: import cloneDeep from 'lodash/cloneDeep' const name = cloneDeep({id:'猫哥学前班'})...cloneDeep } from 'lodash-es' const name = cloneDeep({id:'猫哥学前班'}) console.log(name) 可以看到,开启 Tree-shaking
独自编写这些代码并不容易,能用到这些库是非常有帮助的。 Lodash Lodash根据不同的使用场景提供了好几种复制对象的方法。...const _ = require('lodash'); let arrays = {first: [1, 2, 3], second: [4, 5, 6]}; let copy = _.cloneDeep...Underscore Underscore的clone()方法同Lodash的clone()几乎是一样的,它提供对象的浅拷贝。...从头编写自己的函数 出于某种原因以上解决方案不能满足需求时,你不得不自己编写一个复制方法。...幸运的是,已经有很多的解决方案,比如Lodash中的cloneDeep,也可以是内置的JSON方法。如果处于某些原因,这些都不使用了,只要做过了全面的测试你也可以编写自己的复制方法。
项目体积敏感:如果项目对打包 size 有严格要求(如移动端 H5、小程序),应避免引入 Lodash 增加额外体积(即使按需引入,也会有一定开销)。...优先选择 Lodash 的场景复杂操作场景:Lodash 提供了大量简化复杂逻辑的工具函数,例如: 深层克隆(_.cloneDeep) 数组分组(_.groupBy)、去重(_.uniqBy) 对象深比较...折中方案:按需引入 Lodash如果只需要 Lodash 的少数功能,可以通过 按需引入 减少体积: // 只引入需要的函数,而非整个库import groupBy from 'lodash/groupBy...复杂操作、兼容性要求、追求开发效率:优先 Lodash,利用其成熟的工具函数简化开发。...本质上,两者的选择取决于「开发效率」与「项目成本」的平衡—— Lodash 可以减少重复造轮子的时间,但会增加依赖;原生原生则相反,需要自己实现逻辑,但更轻量。
比如我们以为lodash为例子: import { cloneDeep } from 'lodash' // ......import cloneDeep from 'lodash/cloneDeep' // ......业务代码 复制代码 此时,由于lodash中的cloneDeep方法存在的位置是一个独立的文件--lodash/cloneDeep文件。 当我们这样引入时,相当于仅仅引入了一个js文件而已。...当然也许有同学会好奇,我直接这样可以吗: import cloneDeep from 'lodash/cloneDeep' import join from 'lodash/join' import findLast...作为一个合格的前端工程师怎么能写出这样冗余的代码呢。 import { cloneDeep,join,findLast } from 'lodash' 复制代码 相比之下,这样岂不是更清爽嘛。
多标签页很多公司的后台管理系统都会有这个需求,之前用vue一般架子也是带的,现在公司用了antd pro ,看了下官方不支持,确实会影响性能,但是架不住需求。..._remove from 'lodash/remove'; import _cloneDeep from 'lodash/cloneDeep'; import _findIndex from 'lodash...const cTags = tags.map((t) => { const ct = _cloneDeep(t); ct.active = false; return...const cTags = tags.map((t) => { const ct = _cloneDeep(t); ct.active = ct.key === newTag.key;...state) { return []; } const cTags = state.map((t) => { const ct = _cloneDeep
记一下js深拷贝的几种方法 使用递归 通过JSON对象 通过jQuery的extend方法 Object.assign() lodash函数 使用递归 //使用递归的方式实现数组、对象的深拷贝 function...deepClone(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 var objClone = Array.isArray(obj)...[] : {}; //进行深拷贝的不能为空,并且是对象 if (obj && typeof obj === "object") { for (key in obj) { if...= $.extend(true,[],array); Object.assign() 对象中只有一级属性,没有二级属性的时候,为深拷贝 对象中有对象的时候,在二级属性以后就是浅拷贝 lodash函数...lodash.cloneDeep()
1、使用递归(循环)的方式实现深拷贝 //使用递归的方式实现数组、对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝...,对象的话进行对象拷贝 //进行深拷贝的不能为空,并且是对象或者是 if (obj && typeof obj === "object") { var objClone = Array.isArray...objClone[key] = obj[key]; } } } return objClone; } return obj; } 2、lodash...函数库实现深拷贝 lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝 3、通过 JSON 对象实现深拷贝 //通过js的内置对象JSON来进行数组对象的深拷贝 function...,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
以下是一些常用的方法: 1....3.使用库: lodash库的_.cloneDeep方法: import _ from 'lodash'; const newObj = _.cloneDeep(oldObj); ramda库的cloneDeep...方法: import R from 'ramda'; const newObj = R.cloneDeep(oldObj); 这些库提供了许多实用的函数,但会增加项目的依赖。...hash); } }; let cloneObj = new Proxy(obj, handler); return cloneObj; } 这种方法是最强大的,...每种方法都有其优点和局限性,应根据具体需求选择合适的方法。
Author:Mr.柳上原 付出不亚于任何人的努力 愿我们所有的努力,都不会被生活辜负 不忘初心,方得始终 在用 antd Table 组件写一个产品选择框功能的时候,遇到了 antd Table 组件的...selectedRows 在翻页后再勾选新的 item ,不会保留上一页已勾选的 item ,而是基于当前页面的 dataSource 重新记录当前的勾选项(注: selctedRowKeys 没有这个问题...,可以正常的跨页记录总体的勾选项的 key )。...import * as _ from 'lodash'; // lodash的深拷贝函数_.cloneDeep onSelect = (record:any,selected:any,selectedRows...selected){ let productListSelectedRowsPlus = _.cloneDeep(this.state.productListSelectedRowsPlus
因此,如果我们的需求适合这个方法,可以用这个方法。但是,我们可以用 structuredClone 做这个方法有很多不能做的事情。 为什么不是 _.cloneDeep?...到目前为止,Lodash 的 cloneDeep 函数是这个问题的一个非常常见的解决方案。...事实上,这确实也像预期的那样工作: import cloneDeep from 'lodash/cloneDeep' const calendarEvent = { title: "Builder.io...如果改用更常见的方式导入,没有意识到摇树并不总是按希望的方式工作,那么可能会无意中为这个函数导入高达2 5kb 的文件 什么是 structuredClone 克隆不了的 函数不能被克隆 structuredClone...DataCloneError 异常 属性描述符 setter和getter 不能克隆 类似元数据的特性也不会被克隆。
思维导图 通过下面的思维导图,我们先对JavaScript的对象有一些基本的了解。 下文记录一些以前不了解的知识点。...eslint有一条guard-for-in规则,这条规则要求for-in语句要包含一个if判断来判断object的key是否存在,以避免一些意外的错误。...lodash 库的 _.cloneDeep(obj)用于深复制。...var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep(objects); console.log(deep[0] === objects...street ); // undefined(不报错) 但是用lodash的get会更方便!!
或者不自己造轮子,使用现成的实现,例如 JavaScript 库 lodash[3] 中的 _.cloneDeep(obj)[4]。 总结 对象通过引用被赋值和拷贝。...为了创建“真正的拷贝”(一个克隆),我们可以使用 Object.assign 来做所谓的“浅拷贝”(嵌套对象被通过引用进行拷贝)或者使用“深拷贝”函数,例如 _.cloneDeep(obj)[5]。...结构化拷贝算法: https://html.spec.whatwg.org/multipage/structured-data.html#safe-passing-of-structured-data [3] lodash...: https://lodash.com [4] _.cloneDeep(obj): https://lodash.com/docs#cloneDeep [5] _.cloneDeep(obj): https...://lodash.com/docs#cloneDeep 你“在看”我吗?
lodash中的深拷贝实现 著名的 lodash 中的 cloneDeep 方法同样是使用这种方法实现的,只不过它支持的对象种类更多,具体的实现过程读者可以参考 lodash 的 baseClone 方法...我们把测试用例用到的深拷贝函数换成lodash的: let result = _.cloneDeep(test) 结果: ?...lodash 应对环对象办法.png 因为 lodash 使用的是栈把对象存储起来了,如果有环对象,就会从栈里检测到,从而直接返回结果,悬崖勒马。...,来自于 MDN // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object...Symbol的特点 独一无二 不能隐式转换 不能与其它数据类型做运算 不能使用点运算符进行操作 总结: window.Symbol() Symbol()前面不能加new Symbol() !
博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单的数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象、对象数组的拷贝,就有浅拷贝和深拷贝之分 浅拷贝就是当改变了拷贝后的数据...、undefined、symbol,则经过 JSON.stringify() 序列化后的 JSON 字符串中这个键值对会消失 无法拷贝不可枚举的属性,无法拷贝对象的原型链 拷贝 Date 引用类型会变成字符串...key]); // 递归复制 } else { result[key] = obj[key]; } } } return result; } lodash...的深拷贝 cloneDeep 使用 lodash 插件的深拷贝方法 // 官方例子 var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep...objects); console.log(deep[0] === objects[0]); // => false 传送门:https://www.lodashjs.com/docs/4.17.5.html#cloneDeep
但是,随着项目的不断发展,团队要求我们在其中显示许多其他新内容:表单字段,不同的按钮(取决于显示在哪个页面上),卡片,页脚和列表。我发现,如果我继续使用属性来使这个组件不断扩展,似乎也可以。...这样,我可以从编辑器中直接看到导入的模块库有多大,并且可以查看导入的模块库过大时出了什么问题。 例如,在最近的项目中,导入了整个 lodash 库(压缩后大约24kB)。...问题在于,项目里仅仅使用cloneDeep 一个方法。...通过在导入费用包中识别此问题后,我们通过以下方式解决了该问题: npm remove lodash npm install lodash.clonedeep 然后可以在需要的地方导入clonedeep...函数: import cloneDeep from "lodash.clonedeep"; 的 JavaScript 为了进一步优化,您还可以使用Webpack Bundle Analyzer软件包通过交互式可缩放树状图来可视化
基本数据类型比较稳当,相对来说占用的内存较小 引用数据类型是动态的,大小不固定,占用的内存较大,但内存地址大小是固定的,因此可以将内存地址保存在栈中 浅拷贝和赋值(=)的区别 基本类型赋值,系统会为新的变量在栈内存中分配一个新值...引用类型赋值,系统会为新的变量在栈内存中分配一个值,这个值仅仅是指向同一个对象的引用,和原对象指向的都是堆内存中的同一个对象。...深拷贝的实现 JSON.parse(JSON.stringify()) 手写递归函数 函数库lodash JSON.parse(JSON.stringify())有存在以下问题: 无法解决循环引用问题...,很多情况未考虑到,比如 特殊的数据类型及兼容性的处理,更多细节的实现可以参考 lodash 中的 cloneDeep[1]方法。...[2] JavaScript数据类型的存储方法详解[3] 参考资料 [1]cloneDeep: https://github.com/lodash/lodash/blob/master/cloneDeep.js