JavaScript基本类型和引用类型

xiaoxiao2021-02-28  35

============================基本类型和引用类型================================= 基本类型有哪些? Undefined, Null, Number, Boolean, String 基本类型在内存中占据固定内存大小的空间,保存在栈空间上。 对基本类型的复制是的的确确的复制,复制的是基本变量自身,得到的是一个副本。 判断某个值是哪种基本类型,可以使用typeof操作符。 引用类型本身保存在栈上,但是引用指向的对象保存在内存中。对象在内存中占据的内存是不确定的, 因为随着程序的运行,完全有可能动态地为对象添加或者剔除属性和方法。那么内存显然会存在变化。 复制引用仅仅是复制引用本身,而不是复制引用所指向的对象。引用和引用副本指向的是同一个对象。 判断某个引用所指向的对象是哪种类型,可以采用instance of操作符。 ======================从作用域的角度理解变量和函数============================== 执行环境是JavaScript最为重要的一个概念: 执行环境相当于容器,遇一个变量对象想关联。 一般定义的变量和函数都是放在执行环境对应的 变量对象中,但是这个变量对象我们无法访问。 执行环境可以理解成作用域 当一个函数被执行,那么这个函数所在的执行环境就会被添加到环境栈中。 执行完毕,那么该执行环境就会从环境栈中弹出。 那么在执行一个函数中调用另一个函数,就相当于在一个执行环境中嵌套 另一个执行环境。也即是执行环境的嵌套。 那么这就会引出一个问题:那就是变量在作用域中的可见性问题。 子作用域中定义的变量在父作用域中不可见,但是父作用域中定义的变量在子作用域中可见。 如果父作用域中和子作用域中存在同名变量,那么在子作用域中使用的是子作用域中定义的变量, 这就变量的月蚀问题。同时,这也是变量的搜索问题:变量从子作用域开始搜索,子作用域没有 的情况下,行进到父作用域。父作用域没有继续上溯。依据就近原则,找到了同名变量就终止搜索。 作用域的这个问题可以从继承的角度去理解: 父类中的属性和方法可以被子类继承,因此子类可以访问父类中的变量和方法。 JavaScript竟然没有块级作用域,区分函数不是块级作用域 for (var i = 0; i <= 10; i++) {} alert(i); ==================================垃圾回收机制================================== JavaScript具有自动回收垃圾机制,但是了解垃圾收集器的工作原理,有助于程序的优化。 局部变量的垃圾回收:局部变量是在程序执行过程中产生的,也是在局部函数执行结束以后被销毁。 问题是:这个机制是如何实现的。 当程序流执行到局部变量时,局部变量被创建,此时,局部变量被打上一个标记——‘进入环境’标志, 当变量离开环境时使用标记——‘离开环境’。垃圾收集器会将那些被标记为‘离开环境’的变量清除。 另一种机制,不是采用标记法,而是采用引用计数法。A变量指向B变量,那么B对象的引用计数变量C就会加一, 如果A改变了指向,不再指向了B,那么B的引用计数变量C就会减一。但是引用计数法存在循环引用的困境, 由于这个原因,后来的浏览器唯一例外在垃圾回收机制上都是采用标记法,而不是引用计数法。 当然我们可以强制断开引用,比如A=Null。 另外还有一点就是垃圾收集器什么时候工作?周期性工作。 全局变量的垃圾回收机制:手工解除引用。局部变量在执行完毕以后引用会自动被解除,但是全部对象不会。 对象被解除引用并不意味着立马就启动垃圾回收器进行回收,而是让该对象脱离执行环境。之后让垃圾回收器 去回收垃圾。
转载请注明原文地址: https://www.6miu.com/read-2624015.html

最新回复(0)