zoukankan      html  css  js  c++  java
  • 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(遥控器),他就复制一个遥控器,还是自己用

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

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

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

    下一篇要啃闭包了...

  • 相关阅读:
    tcp传送报文
    整理下本周工作中遇到的疑问;uid/euid/suid;docker镜像管理
    网络隔离
    ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力 )
    ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力)
    使用gdb查看栈帧的情况,有ebp
    使用gdb查看栈帧的情况, 没有ebp
    再看perf是如何通过dwarf处理栈帧的
    dwarf是如何处理栈帧的?
    数据库设计的误区—>CHAR与VARCHAR
  • 原文地址:https://www.cnblogs.com/AlexNull/p/4775735.html
Copyright © 2011-2022 走看看