把这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(遥控器),他就复制一个遥控器,还是自己用
只是由于遥控器的功能都是控制电视
这让你觉得,传引用好像真的把那个变量传进去了
其实只是他偷偷磨了一把钥匙
下一篇要啃闭包了...