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之浅拷贝和深拷贝相关推荐

  1. 【js】浅拷贝与深拷贝

    一.理解 1.浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址. 浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言 ...

  2. js实现浅拷贝和深拷贝

    一.数据类型 数据分为基本数据类型和引用数据类型 基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 引用数据类型(Object[Array ...

  3. 小tips:JS之浅拷贝与深拷贝

    浅拷贝: function extendCopy(p) {var c = {};for (var i in p) {c[i] = p[i];}return c; } 深拷贝: function dee ...

  4. js 对象浅拷贝和深拷贝

    var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...

  5. JS中浅拷贝和深拷贝的使用,深拷贝实现方法总结

    1.浅拷贝:两个对象经过拷贝后虽然具有相同的属性,但是他们都指向同一个内存空间.操作会引起引用,同一地址的变量一起改变. let a = {x: 1} let b = a b.x = 2 consol ...

  6. js对象浅拷贝与深拷贝

    一.简介    浅拷贝是拷贝一层,如果数据是基本数据类型,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么只能拷贝其引用,对象的改变会反应到拷贝对象上.    深拷贝是拷贝多层,每一层的数据都 ...

  7. js关于浅拷贝、深拷贝,数组的深拷贝

  8. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  9. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

最新文章

  1. 使用dom4j解析XML例子
  2. 【Verilog HDL 训练】第 08 天(二进制、Johnson、环形计数器)
  3. python中的time库安装步骤-python time模块的使用
  4. css中background-image背景图片路径设置
  5. 深入学习js之——词法作用域和动态作用域
  6. 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。...
  7. 英文文档: 如何使用 OpenSSL 创建与吊销数字证书
  8. oracle去除首个字符,oracle如何去除字符串中的重复字符
  9. 01-SA8155P Flat Build QFIL刷机
  10. 【C语言】实现 4阶(经典)龙格-库塔法 求解二阶微分方程
  11. 台达触摸屏和vfd-m变频器通讯控制监视程序 使用modbus rtu通讯方式,在触摸屏可以直接控制变频器
  12. 编程猫的python咋样_编程猫的课程怎么样?
  13. 非单射一致性和单射一致性的概念辨析
  14. jquery 校验中国身份证号码
  15. 极限和连续+偏导+方向导数+可微+梯度+链式法则+hessian矩阵
  16. 交换瓶子(蓝桥杯入门)
  17. 树莓派Raspberry Pi - 文件共享
  18. 大学自我测试成绩的软件,2021输入分数预测大学软件-在线估分选大学app
  19. 劳特巴赫的基础使用(一)
  20. MPS 电源芯片调试文档

热门文章

  1. 如何将全景分割用到养猪场?
  2. PyCharm为什么这么牛?
  3. Django博客系统(写博客页面展示)
  4. 学好算法?不花钱好好看这个 GitHub 项目就够了!
  5. 验证ArrayList是线程不安全的集合
  6. 如何对DevOps数据库进行源代码控制
  7. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计
  8. HTML5调用本地摄像头画面,拍照,上传服务器
  9. Linux web 网站服务器 虚拟主机
  10. 2014/08/24——升级stepbystep修复tc不刷新问题并加入杭电bc