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(遥控器),他就复制一个遥控器,还是自己用

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

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

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

下一篇要啃闭包了...

原文地址:https://www.cnblogs.com/AlexNull/p/4775735.html