js机制3: 栈、堆、垃圾回收

2,062 阅读2分钟

语言类型

  • 静态语言:使用前需要确认其变量数据类型(c)
  • 动态语言:运行过程中需要检查数据类型(js)
  • 强类型语言:不支持隐式类型转换
  • 弱类型语言:支持隐式类型转换(c、js)

js:可以用同一个变量保存不同类型的数据,且不需要提前定义变量的数据类型

js 数据类型:只有obj 是引用类型,其他都是原始类型

  1. null

  2. undefined

  3. number

  4. object

  5. string

  6. boolean

  7. symbol:符号类型

  8. bigint:新的数字类型

    function demo() { var a = "掘金" var b = a var c = {name: "社区"} var d = c } // 原始类型保存在栈(空间小)中,引用类型保存在堆(空间大)中

栈和堆

为何需要堆和栈两种数据结构?

栈来维护程序执行期间上下文状态,所有数据放到栈中,会影响上下文切换效率,进而影响整个程序的执行效率

// 闭包是个对象,存在堆中,栈中方引用地址
function demo() {
    var myName = "掘金社区"
    let test1 = 1
    const test2 = 2
    var innerFun = {
        getName:function(){
            console.log(test1)
            return myName
        },
        setName:function(newName){
            myName = newName
        }
    }
    return innerFun
}
var test = demo()
test.setName("掘金世界")
test.getName()
console.log(test.getName())

垃圾回收策略

  • 手动回收:c  free()
  • 自动回收:js 、 java、 python -> 垃圾回收器释放内存

栈回收:

ESP: 记录当前执行状态的指针

函数执行结束后,ESP 向下移动到下一个执行上下文中,这个过程就是栈销毁内存

堆回收

老生区:标记-清除、标记-整理

垃圾回收造成卡顿?

js 运行在主线程上,一旦执行垃圾回收,需要将目前正在执行的js 暂停,影响应用性能和响应性能,为了避免卡顿,实行增量标记算法