Js堆棧理解

栈(stack) 自动分配的内存空间,它由系统自动释放

堆(heap) 动态分配的内存,大小不定也不会自动释放。

眾所周知,js的變量分基礎類型引用類型;

基礎類型: (String, Number, Boolean, Null, UndefinedSymbol)基礎類型在內存中具有: 佔據空間小,大小固定的特點,且值保存在棧(stack)空間,按值訪問.

引用類型: (對象, 數組, 函數)引用類型在內存中具有: 佔據空间大、大小不固定的特點, 棧內存中存放的地址指向堆(heap)内存中的对象。是按引用訪問的.

接下來我們看兩個例子:


堆棧理解

從上面的例子我們可以看到,基礎類型變量發生複製的行為時,系統會為新的變量分配一個值,跟複製的變量值是互相獨立的且沒有絲毫的影響的,

但引用類型的複製就不一樣了,可以看到當d引用了c的對象值後c發生改變,d也隨之發生改變.

堆棧內存&垃圾回收機制

如我上述所言,基礎類型是存放在棧裡面,按值訪問,引用類型是存放在棧裡面的地址引用了堆內存的對象,是引用訪問.又因為要實現垃圾回收機制,所以每一個基礎類型的值在當前的執行調用棧環境裡面執行完後,就會被自然銷毀.而引用類型的對象,存放在堆內存中並不一定會隨之執行棧的結束而自動銷毀.當對象被其它變量引用時,系統就不會回收它,只有當一個對象沒有任何變量引用它時,系統才會回收.所以我們常見一些對象或者方法在執行完後會有 A = null 的類似賦值.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java 基礎總結 面向對象的特征有哪些?封裝 隱藏一切可隱藏的東西,只向外提供簡單的編程接口繼承多態:方法重載和...
    sukianata阅读 310评论 2 1
  • 大多数的开发者在使用Java或C#等基于类的语言的过程中学会了面向对象编程。由于JavaScript没有对类的正式...
    WanLum阅读 598评论 0 4
  • 尽管javascript里有大量内建引用对象,很可能你还说会频繁创建自己的对象。当你在这么做的时候,记得javas...
    WanLum阅读 542评论 1 3
  • 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...
    青石电影阅读 10,470评论 1 2
  • 今天主要学习了flex布局,学习笔记如下: 1.指定flex布局: display:flex(任意容器)...
    riku_lu阅读 3,182评论 2 3