1. 在JS中,数据分为两大类:基本数据类型 和 引用数据类型;基本数据类型包括: string、number、Boolean、null、undefined、symbol、biglnt七大类,引用数据类型包括: Array、Object、Function。这两种数据类型的数据传递也有两种方式: 值复制 和 引用复制。
  2. 在内存中分为:栈(stack) 和 堆(heap)。简单数据类型存放在栈区,复杂(引用)数据类型存放在堆区。在开发时,可以直接操作栈区的变量,不能直接操作堆区的数据,堆区需要JS引擎来操作。

值复制

  1. 变量赋值
var a  = 5,b  =  a
console.log('a:', a)  // 5
console.log('b:', b)  // 5
a  =  9
console.log('a:', a)  // 9
console.log('b:', b)  // 5

由上可知: a = 5 是一个number类型, b 被赋值为 a, 但变量b被赋值时,赋的是a的值,而不是变量a本身。因此当变量a的值改变时,变量b的值没有影响。不仅是number类型,所有基本数据类型都是值赋值;

由图可知: 当设置一个变量a时,是在栈内存中开辟出一块内存,用于存放变量a以及它的值,当变量a的值改变时,栈区中对应内存的数据值也会发生改变;声明一个变量b,并把a赋值给变量b, 就是在栈内存中重新开发出一块新的内存空间,用于存放b,b的值是变量a传递的;

  1. 函数传参
let a = 3toProjectFunction(x) {const x = x + 2
}this.toProjectFunction(a) // 5 (x = 5)
console.log(a) // 3

函数传参:传递的是参数的值,而非参数本身,无论函数中的 x 如何变化,对外部的变量a没有任何影响;
综上:无论是变量赋值还是函数传参,只要是基本数据类型,都只是值传递,拷贝一份值的副本进行运用;

引用复制

注意: 复杂数据类型(Array、Object)里面如果也存在Array或Object, 也将存在引用赋值的情况;

  • 当声明一个对象obj1(复杂数据类型)时,会在堆内存中开辟出一块新的内存空间,用于存放obj1的数据: 即 address1: { name: ‘zhao’, id: 2 };
  • 但是变量obj1是存放在栈内存中的,栈内存中不能直接存放复杂数据类型的值,因此会存给obj1一个地址,用于指向堆内存中对应的值;
  • 声明一个对象obj2(复杂数据类型),将obj1赋值给obj2,就是把obj1的地址赋给了obj2,此时obj1和obj2公用一个地址,也就是在堆中共享同一块内存空间,任何一个对象更改数据另外一个对象也会随之改变;
  • 若重新给obj1赋值,相当于给obj1在堆中重新开辟一块新的内存空间,此时obj1 和 obj2 的地址不一样,即不再和obj2共享同一块内存空间,其中一个对象改变时,另外一个无影响;

注意:

  • 若每次给obj2赋值时都想要互不影响,就要进行转换赋值JSON.parse(JSON.stringify()), 但是转换赋值后的对象如果作为函数参数传递时,仍然存在引用赋值情况;
  • 引用赋值后如果将对象置空,相互之间没有影响;

js中的直接赋值和引用赋值相关推荐

  1. js中函数参数值传递和引用传递

    2019独角兽企业重金招聘Python工程师标准>>> js中函数参数值传递和引用传递: 在阅读本章节之前建议参阅一下两章节: 1.值类型可以参阅javascript的值类型一章节. ...

  2. 直接赋值和引用赋值的区别

    1.直接赋值和引用赋值的区别? (1)直接赋值 let str = "aaa"; let str2 = str; //这里是直接赋值 str2 = "aaa222&quo ...

  3. JS中的基本数据类型与引用数据类型

    JS中的数据类型可以这样分类: 原始数据类型: number, string ,boolean, undefined, null, symbol 基本类型(简单类型): 值类型: number((整数 ...

  4. js中引用类型赋值(拷贝)问题

    问题来源 在js中,引用类型的变量引用的只是内存的地址信息,所以在用其给其他变量赋值时,另一个变量得到的是该内存地址,不是内存中的内容,所以在另一个变量改变某个值的时候会反映在原始变量中. 例如: v ...

  5. 一个 js 中值传递和引用传递的坑。

    今天在调试代码时遇到一个问题,刚开始想不明白,然后分析了一下后,才知道其中的问题,这也是一个基础的问题,(所以基础是很重要的) 代码如下: var a = 3; a = a * 2; console. ...

  6. 聊一聊 JS 中的循环引用及问题

    本文主要从 JS 中为什么会出现循环引用,垃圾回收策略中引用计数为什么有很大的问题,以及循环引用时的对象在使用 JSON.stringify 时为什么会报错,怎样解决这个问题简单谈谈自己的一些理解. ...

  7. Js中函数式编程的理解

    函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...

  8. JS中变量的存储方式 -- 栈和堆

    栈空间和堆空间 JS变量都存储在内存中,而内存给变量开辟了两块存储空间,分别为栈(stack)空间和堆(heap)空间 栈空间:存放JS基本数据类型,通过按值访问,可以直接操作保存在变量中的实际值. ...

  9. js 浅拷贝直接赋值_第二十二篇 JS中浅拷贝的方法有哪些?

    重要:什么是拷贝?之前也写过类似的文章,大家可以看<理解js的深拷贝和浅拷贝原理和实现的方法> 首先来直观的感受一下什么是拷贝. let arr = [1, 2, 3]; let newA ...

最新文章

  1. ollections 库中常用的 4 个数据结构
  2. 相位语谱图或将打破机械音
  3. USNews 2020美国大学排名公布:UCLA超越伯克利;计算机专业MIT第一,斯坦福跌出前四...
  4. [CSS]关于z-index与position的一次奇异经历
  5. 漫步者蓝牙只有一边有声音_漫步者Dreampods新品体验,蓝牙耳机黑科技来了
  6. java web的友好页面_JavaWeb 之 由 Tomcat 展示友好的错误信息页面
  7. IIS支持下载.config后缀名的文件
  8. 使用idea将本地项目上传至github及clone
  9. java仿百度分页_java仿百度假分页代码实现
  10. 小记-一些问题的解决方法
  11. Duplex Generative Adversarial Network for Unsupervised Domain Adaptation
  12. 「基因组组装」用AMOS/minimus2合并两个contig
  13. 机器学习——周志华(1)
  14. POJ 2240 Arbitrage——spfa判正环||flody
  15. flutter网络请求基础知识铺垫、及实战举例
  16. C++ 统计n个学生三门课的平均成绩,统计各学生三门课的平均成绩。
  17. 盛水容器问题php代码,盛水容器的形状如图2-13所示,已知各水面高程为▽1=1.15m,▽2=0.68m,▽3=0.44m...
  18. 【小米路由器3】breed刷机救砖-nand flash硬改SPI flash-编程器救砖(解决ttl无法救砖问题)
  19. Mac电脑的效率超高的输入法,自动切换输入法
  20. ssh登录ubuntu

热门文章

  1. 发那科机器人网段_发那科“蜘蛛手”机器人工艺调试流程详解
  2. 概率论与数理统计浙大第五版 第八章 部分习题+R代码
  3. 结合实际问题的 Bitcode 适配指南 (一)
  4. Proxmox VE 6.0管理指南——3.主机系统管理
  5. Revit项目和族文件升级后出现无响应死机情况
  6. systemctl status mysqld.service或者systemctl start mysqld 启动失败的解决办法
  7. 豆瓣音乐播放器XPlayer
  8. 网卡驱动,不好使,无线网卡没有了,上不了网
  9. Codeforces 1198 简要题解
  10. stm32驱动LED点阵屏(LY-LED16x16)