红宝书阅读笔记!第十四天_变量、作用域与内存

250 阅读3分钟
JavaScript变量是松散类型的,而且变量是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命期内可以改变。

原始值和引用值

ECMAScript变量可以包含两种不同类型的数据,原始值和引用值。原始值是最简单的数据,引用值则由多个值构成的对象。

在把一个值赋给变量时,JavaScript引擎必须确定这个值是原始值还是引用值。保存原始值的变量是按值访问的,因为我们操作的就是储存在变量中的实际值。

引用值是保存在内存中的对象,与其他语言不同,JavaScript不允许直接访问内存位置,因此不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用而非实际的对象本身。为此,保存引用值的变量是按引用访问的。

1.动态属性

原始值和引用值定义方式类似,但是用起来不一样。对于引用值,可以随时添加修改和删除其属性和方法。但是原始值不能有属性。

emmmm,我是这么理解的,定义原始值时,只是分配给变量一个小房间,只能住一个人,定义引用值时,分配给了一个大楼,里面有很多房间可以添加属性方法。

let person = new Object();
person.name = 'sky';
console.log(person.name);	//sky

let name = 'sky';
name.age = 21;
console.log(name.age);		//undefined

2.复制值

除了存储方式不同,原始值和引用值通过变量复制的方式也不同。

原始值:会完全复制一个一模一样的副本,相互独立👇

引用值:复制过去的是一个指针,它指向堆内存中的对象,一个对象上面的变化,会在另一个对象上反应出来👇

3.传递参数

📕赢了,我被绕晕了,反正这里讲的是函数中传参过程中的问题,不重要,会用函数就行了。

4.确定类型

原始值可以用typeof操作符来确定,如果值是对象或null,那么typeof会返回object

当想知道是什么类型的对象时候,ECMAScript提供了instanceof操作符。

执行上下文与作用域

上下文中的代码在执行的时候,会创建变量对象的一个作用域链。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。如果上下文是函数,则其活动对象用作变量对象。

1.作用域增强

某些语句会导致在作用域链前端临时添加一个上下文,这个上下文执行后会被删除。

⚪try/catch语句的catch块

⚪with语句

2.变量声明

这个写过很多次了,就不多讲了var let const.

垃圾回收

JavaScript是使用垃圾回收的编程语言,开发者不需要操心内存分配和回收。JavaScript的垃圾回收程序可以总结👇

离开作用域的值会被自动标记为可回收,然后在垃圾回收期间被删除。

主流的垃圾回收算法是标记清理,即先给当前不使用的值加上标记,再回来收他的内存。

引用计数是另一种垃圾回收策略,需要记录值被试用了多少次。

引用计数在代码中存在循环引用时会出现问题。

解除变量的引用不仅可以消除循环引用,而且对垃圾回收也有帮助。

文章内容参考:JavaScript高级程序设计(第四版)

标题样式来自:juejin.cn/post/684490…

哪里写错了就联系我🐧:54269504