电子商务网站 技术方案,提供网站制作,宁波做简单网站的,邯郸seo快速排名开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题:
8.1 浅拷贝
首先浅拷贝和深拷贝只针对引用类型 浅拷贝#xff1a;拷贝的是地址 常见方法: 1.拷贝对象#xff1a;Object.assgin() / 展开运算符{…obj} 拷贝对象 2.拷贝数组#xff1a;Array.prototype.con…开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题:
8.1 浅拷贝
首先浅拷贝和深拷贝只针对引用类型 浅拷贝拷贝的是地址 常见方法: 1.拷贝对象Object.assgin() / 展开运算符{…obj} 拷贝对象 2.拷贝数组Array.prototype.concat() 或者 […arr] 但是浅拷贝只适用于单层简单数据类型里面不要再套复杂数据类型
【例如】 如果是简单数据类型拷贝值引用数据类型拷贝的是地址(简单理解如果是单层对象没问题如果有多层就有问题)
8.2 深拷贝
首先浅拷贝和深拷贝只针对引用类型 深拷贝拷贝的是对象不是地址 常见方法 (1)通过递归实现深拷贝 (2)lodash / cloneDeep (3)通过JSON.stringify()实现
一、通过递归实现深拷贝 函数递归: 如果一个函数在内部可以调用其本身那么这个函数就是递归函数 ●简单理解函数内部自己调用自己这个函数就是递归函数 ●递归函数的作用和循环效果类似 ●由于递归很容易发生栈溢出”错误(stack overflow)所以必须要加退出条件return
【示例】
// 拷贝函数
function deepCopy(newObj, oldObj) {for (let k in oldObj) {// 处理数组的问题if (oldObj[k] instanceof Array) {newObj[k] []// 递归调用 把数组里的值一个一个给deepCopy(newObj[k], oldObj[k])}// 处理对象问题else if (oldObj[k] instanceof Object) {newObj[k] {}// 递归调用 deepCopy(newObj[k], oldObj[k])}else {// k 属性名 oldObj[k] 属性值newObj[k] oldObj[k]}}
}深拷贝总结 1.要用到函数递归 2.当我们在普通拷贝时直接赋值即可。但是如果遇到数组或者对象就需要再次调用递归函数 3.记住先Array再Object 因为数组也属于对象
二、js库lodash里面cloneDeep内部实现了深拷贝 【示例】
body!-- 先引用 --script srclodash.min.js/scriptscriptconst obj {name: Kai,age: 18,hobby: [羽毛球, 足球],family: {sister: pink}}// 语法_.cloneDeep(要被克隆的对象)const o _.cloneDeep(obj)o.family.sister blueo.age 3console.log(o)console.log(obj)/script
/body三、利用JSON实现深拷贝 【示例】
bodyscriptconst obj {name: Kai,age: 18,hobby: [羽毛球, 足球],family: {sister: pink}}// 把对象转换为JSON字符串// JSON.stringify(obj)const o JSON.parse(JSON.stringify(obj))console.log(o)o.family.sister 1234console.log(obj)/script
/body8.3 throw抛出异常
异常处理是指预估代码执行过程中可能发生的错误然后最大程度的避免错误的发生导致整个程序无法继续运行 总结: 1.throw抛出异常信息程序也会终止执行 2.throw后面跟的是错误提示信息 3.Error对象配合throw使用能够设置更详细的错误信息
8.4 try/catch捕获错误信息
我们可以通过 try / catch 捕获错误信息(浏览器提供的错误信息) try 试试catch 拦住finally 最后 总结: 1.try-catch用于捕获错误信息 2.将可能发生错误的代码写在try代码段中 3.如果try代码段中出现错误后会执行catch代码段并截获到错误信息 4. finally不管是否有错误都会执行
8.5 debugger
使用方法