js:值类型/引用类型/内存回收/函数传值

把这4个概念放在一起写,因为它们是互通的

值类型:一个变量对应一块内存

var a=1;

var b=a;

a=2;

此时b还是等于1

就像你的克隆人,你心情不好去跳崖,他才不会傻乎乎地跟着你去跳

数值、boolean、null、undefined都是值类型

引用类型:有的博主这样比喻,一家店,它的引用就是它的钥匙

鉴于“作的精神”,我换一种比喻

一台电视机(内存)和它的遥控器关系(引用变量)

可以用遥控器换频道,但不可以用遥控器把电视变成冰箱

如果这电视不只一个遥控器,那么它们可以共同控制电视

var a={x:2};

var b=a;

b.x=22;

那么a.x会跟着变成22

我刚才说,不可以用遥控器把“电视”变成“冰箱”...您可能听起来有点糊涂,容我举个例子

依然是var a={x:2}和var b=a

只是这个时候我们让b=520,

这个行为有点无理取闹,也就是说我们把钥匙毁了或是把遥控器砸了

你会发现a还是个Object {x: 2}

你以为你把遥控器砸了电视就会爆掉吗?

你以为你把遥控器砸了我就没有其它遥控器了吗?

太天真了少年

我还有a这个遥控器

而它所控制的电视依然是{x:2}

。。。夸张点是为了记忆

我这个人还是比较淡定的

垃圾回收:

但是如果我只有一台遥控器

然后它被无情地摧毁了怎么办?

比如

var a={x:2};//此时没有其它引用指向a

a=520;

好吧,你是成功地把遥控器变成木头了

你赢了

但是电视并没有爆掉

他被捡垃圾的回收了

“js里一个对象没有活引用,它的内存就会被回收”

还是挺经典的一句话,能解释许多问题

函数传值:按类型复制

用一句话简单地概括

你给他一个primitive value,他就复制一个primitive value自己用

你给他一个reference value(遥控器),他就复制一个遥控器,还是自己用

只是由于遥控器的功能都是控制电视

这让你觉得,传引用好像真的把那个变量传进去了

其实只是他偷偷磨了一把钥匙

下一篇要啃闭包了...

时间: 2024-10-12 15:21:17

js:值类型/引用类型/内存回收/函数传值的相关文章

数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override重写 无论什么情况,都是执行新的方法(成员) 继承是实现多态的一个前提,没有继承多态是不能实现的 父类与子类实现多态 抽象类与子类实现 抽象类不能实例化 抽象类中的抽象方法没有方法体 抽象类的成员有哪些   ->包含非抽象成员   ->不能实例化   ->子类必须实现父类的 抽象方法,除非子

6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱 引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并说明一些有关它们的重要原理. 最后通过一个简单的示例代码说明装箱拆箱带来的性能损耗. 声明变量的内部机制 在.NET程序中,当你声明一个变量,将在内存中分配一块内存.这块内存分为三部分:1,变量名:2,变量类型:3,变量值. 下图揭示了声

30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法

一:值类型/引用类型的区别      值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引用类型主要包括类类型,接口类型,委托类型和字符串类型等. 关于参数传递,这里有四种:        值类型参数的按值传递:        引用类型参数按值传递: 关于string引用类型参数按值传递的特殊情况:虽然string类型也是引用类型,然而在按值传递时,传递的实参却不会因方法中形参的改变而被

redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

原文:redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换 一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1   类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令.另一种命令

深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别

C#初学者经常被问的几道辨析题,值类型与引用类型,装箱与拆箱,堆栈,这几个概念组合之间区别,看完此篇应该可以解惑. 俗话说,用思想编程的是文艺程序猿,用经验编程的是普通程序猿,用复制粘贴编程的是2B程序猿,开个玩笑^_^. 相信有过C#面试经历的人,对下面这句话一定不陌生: 值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做装箱,引用类型转为值类型叫拆箱. 但仅仅背过这句话是不够的. C#程序员不必手工管理内存,但要编写高效的代码,就仍需

js 值类型和引用类型

今天来给大家介绍一下数据类型的另一种解读,值类型和引用类型(及简单类型和复合类型) 一.基本概念 ECMAscript变量包括两种不同的数据类型的值,一种叫做简单类型(值类型),指的是简单的数据段,另一种叫做复合数据类型(引用类型),是由多个值构成的对象. 在js的数据类型中,number,boolean,string,null和undefined都属于值类型,而函数和对象属于引用类型. 二.数据类型判断 基本类型:typeof 引用类型:instanceof var a=10; console

js值类型与引用类型

JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用"连锁店"和"连锁店钥匙"来理解,不知道以下比喻合不合适,^-^. (1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关.各自运营. [值类型例子] 代码如下: function chainSt

【基础巩固】js值类型和引用类型

示例 值类型 let a = 100; let b = a; a = 200; console.log(b); // 100 (互不影响) 引用类型 let a = { age: 20 }; let b = a; a.age= 21; console.log(b.age); // 21 (b.age随a.age的改变而改变) 存储方式 值类型 js变量存储在栈中,至于怎么存储咱先不管(毕竟我也不懂),这是js引擎的事情. 如图所示,key为变量名,value为存储内容,值类型变量的值直接存储在v

js 基本类型&引用类型

1.基本的数据类型有:undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值 基本类型的比较是值的比较.用==比较两个不同类型的变量时会进行一些类型转换.但是当两个值的类型相同的时候,即使是==也相当于是=== 基本类型的变量是存放在栈区的(栈区指内存里的栈内存) 2.对象是属性和方法的集合.也就是说引用类型可以拥有属性和方法 引用类型的存储需要内存的栈区和堆区共同完成.栈区内存保存变量标识符和指向堆内存中该对