JavaScript基本类型和引用类型

本文详细解析了JavaScript中的基本类型与引用类型的区别,探讨了它们如何在内存中存储及复制的特点,并介绍了作用域的概念,包括变量与函数在不同作用域中的可见性问题,以及JavaScript的垃圾回收机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

============================基本类型和引用类型=================================
基本类型有哪些?
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。
另外还有一点就是垃圾收集器什么时候工作?周期性工作。
全局变量的垃圾回收机制:手工解除引用。局部变量在执行完毕以后引用会自动被解除,但是全部对象不会。
对象被解除引用并不意味着立马就启动垃圾回收器进行回收,而是让该对象脱离执行环境。之后让垃圾回收器
去回收垃圾。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值