分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

js深复制

发布时间:2023-09-06 02:24责任编辑:胡小海关键词:js

在JavaScript中,数据类型可分为基本类型(String、Number、Boolean、Null、Undefined)引用类型(Arrray、Object)

其中:

基本类型的值保存栈内存中,变量复制时会重新开辟新的内存,变量重新赋值时不会互相影响

引用类型的堆地址保存栈内存中,值保存在堆地址指向的堆内存中,变量复制时会在栈内存开辟新的空间保存堆地址的副本,指向同一个堆内存。所以某个变量值的变化会导致堆内存中的数据相应变化

浅复制:只在栈内存开辟新的空间

深复制:在栈内存和堆内存都开辟新的空间

一、利用递归进行深复制

 ???function cloneObj(obj) { ???????var newObj; ???????/* 数据、对象 */ ???????if (obj && typeof obj == "object") { ???????????newObj = Array.isArray(obj) ? [] : {}; ???????????for (var key in obj) { ???????????????/* 只查询自身的属性 */ ???????????????if (obj.hasOwnProperty(key)) { ???????????????????/* 子属性仍为对象 */ ???????????????????if (typeof obj[key] == "object") { ???????????????????????newObj[key] = cloneObj(obj[key]); ???????????????????} ???????????????????/* 直接赋值 */ ???????????????????else { ???????????????????????newObj[key] = obj[key]; ???????????????????} ???????????????} ???????????} ???????} ???????/* 字符串、布尔值、数字直接赋值 */ ???????else if (obj) { ???????????newObj = obj; ???????} ???????return newObj; ???} ???var arr3 = [1, 2, 3]; ???var arr4 = cloneObj(arr3); ???arr4[0] = 4; ???var str3 = "字符串3"; ???var str4 = cloneObj(str3); ???str4 = "字符串4"; ???console.log(str3, str4); ???console.log(arr3, arr4);

二、利用JSON对象进行深复制

 ???function copyObj(obj) { ???????var _obj = JSON.stringify(obj); ???????var newObj = JSON.parse(_obj); ???????return newObj; ???} ???var arr1 = [1, 2, 3]; ???var arr2 = copyObj(arr1); ???arr2[0] = 4; ???var str1 = "字符串1"; ???var str2 = copyObj(str1); ???str2 = "字符串2"; ???console.log(str1, str2); ???console.log(arr1, arr2);

js深复制

原文地址:https://www.cnblogs.com/zgdawdl/p/10041629.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved