js之浅拷贝和深拷贝
js数据类型主要分基本数据类型和引用数据类型。前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 |
1、js内存
js内存,或者说大部分语言的内存都分为栈和堆。基本数据类型的变量值分配在栈上,引用数据类型的变量值分配在堆上,栈中只是存储具体堆中对象的地址。
2、赋值
对于基本数据类型,赋值操作是拷贝,即新旧变量不会相互影响。
var a = 1; var b = a; b = 2; console.log(b); // 2
对于引用数据类型,赋值操作只是在栈中新增一个指向堆中对象的变量,即复制引用地址。新旧变量之间会互相影响,即在新变量上改变对象值,旧变量对应值也会改变。
var a = {name: "mike" }; var b = a; b.name = "jack"; console.log(a); // {name: "jack"}
3、浅拷贝
对于基本数据类型和不具有嵌套对象的数据,均是拷贝操作,新旧变量之间不会相互影响。
var a = {name: "mike" }; var b = {}; b.name = a.name; b.name = "jack"; console.log(a) // {name: "mike"}
但是对于具有嵌套对象的数据,浅拷贝只拷贝第一层对象,深层次的值仍然是复制引用地址。
var a = {name: "mike",language: {first: "english",second: "chinese"} }; var b = {}; b.name = a.name; b.name = "jack"; b.language = a.language; b.language.first = "japanese" console.log(a) // { language : {first: "japanese", second: "chinese"}}
js实现浅拷贝,思想:遍历target的每个属性,将起属性名和值赋值给新变量。
如果你明白了赋值的含义,那么在代码的第四行,当此时的target[key]的值是对象的时候,通过赋值赋予新变量,本质上是复制引用数据类型在堆中的地址,就不难理解为什么浅拷贝对于是否是嵌套对象的有不同结果了。
function shallowCopy(target) {let result = {};for (const key in target) {result[key] = target[key];}return result; }
4、深拷贝
深拷贝是完完全全的拷贝,新旧变量之间不会相互影响。
对于参数是否是对象有不同的处理方法,如果是对象,对于对象的每个属性和值赋值然后递归处理; 否则直接返回。
function clone(target) {if (typeof target === "object") {//判断是否是数组let result = Array.isArray(target)? [] : {};for (const key in target) {result[key] = clone(target[key]);}return result;} else {return target;} }
到此这篇关于js中的赋值 浅拷贝和深拷贝详细的文章就介绍到这了
js之浅拷贝和深拷贝相关推荐
- 【js】浅拷贝与深拷贝
一.理解 1.浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址. 浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言 ...
- js实现浅拷贝和深拷贝
一.数据类型 数据分为基本数据类型和引用数据类型 基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 引用数据类型(Object[Array ...
- 小tips:JS之浅拷贝与深拷贝
浅拷贝: function extendCopy(p) {var c = {};for (var i in p) {c[i] = p[i];}return c; } 深拷贝: function dee ...
- js 对象浅拷贝和深拷贝
var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...
- JS中浅拷贝和深拷贝的使用,深拷贝实现方法总结
1.浅拷贝:两个对象经过拷贝后虽然具有相同的属性,但是他们都指向同一个内存空间.操作会引起引用,同一地址的变量一起改变. let a = {x: 1} let b = a b.x = 2 consol ...
- js对象浅拷贝与深拷贝
一.简介 浅拷贝是拷贝一层,如果数据是基本数据类型,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么只能拷贝其引用,对象的改变会反应到拷贝对象上. 深拷贝是拷贝多层,每一层的数据都 ...
- js关于浅拷贝、深拷贝,数组的深拷贝
- 说说JS中的浅拷贝与深拷贝
outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...
- js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解
(一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...
最新文章
- 使用dom4j解析XML例子
- 【Verilog HDL 训练】第 08 天(二进制、Johnson、环形计数器)
- python中的time库安装步骤-python time模块的使用
- css中background-image背景图片路径设置
- 深入学习js之——词法作用域和动态作用域
- 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。...
- 英文文档: 如何使用 OpenSSL 创建与吊销数字证书
- oracle去除首个字符,oracle如何去除字符串中的重复字符
- 01-SA8155P Flat Build QFIL刷机
- 【C语言】实现 4阶(经典)龙格-库塔法 求解二阶微分方程
- 台达触摸屏和vfd-m变频器通讯控制监视程序 使用modbus rtu通讯方式,在触摸屏可以直接控制变频器
- 编程猫的python咋样_编程猫的课程怎么样?
- 非单射一致性和单射一致性的概念辨析
- jquery 校验中国身份证号码
- 极限和连续+偏导+方向导数+可微+梯度+链式法则+hessian矩阵
- 交换瓶子(蓝桥杯入门)
- 树莓派Raspberry Pi - 文件共享
- 大学自我测试成绩的软件,2021输入分数预测大学软件-在线估分选大学app
- 劳特巴赫的基础使用(一)
- MPS 电源芯片调试文档