【红宝书学习笔记】变量、作用域与内存

变量、作用域与内存

主要内容:

  • 通过变量使用原始值、引用值
  • 理解执行上下文
  • 理解垃圾回收

原始值与引用值

原始值(primitive value):简单数据。按值访问的,物品们操作的就是存储在变量中的实际值

引用值(reference value):多个值构成的对象。操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。为此,保存引用值的变量是按引用(by reference)访问的

动态属性

对于引用值而言,可以随时添加、修改和删除其属性和方法。

let person = new Object();
 person.name = "Nicholas";
 console.log(person.name);//"Nicholas"

对于原始值而言,不能有属性,尽管添加属性不会报错。

let name = "Nicholas"; 
name.age = 27; 
console.log(name.age);//undefined

只有引用值可以动态添加后面可以使用的属性。

复制值

原始值的复制,两个变量完全独立

引用值的复制,这里的赋值实际上是一个指针,指向存储在堆内存中的对象。两个变量指向同一个对象。【即改变其中一个对象的属性值,另一个对象也会体现】

传递参数

对象是按值传进函数。 详见P111

确定类型

instanceof操作符,检测引用值返回true,检测原始值false

console.log(person instanceof Object);
console.log(person instanceof Array); 
console.log(person instanceof RegExp);

执行上下文与作用域

全局上下文(最外层的上下文),就是我们常说的window对象(通过var定义的全局变量与函数)

let和const的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的。

上下文栈控制执行流

上下文中的代码执行时,会创建变量对象的一个作用域链

见P114

作用域链增强

with语句、catch语句

变量声明

var、let、const

标识符查找

垃圾回收

标记清理(最常用的垃圾回收策略)P120

引用计数(Netscape4.0被放弃)

性能

垃圾回收程序会周期性运行

内存管理

数据不再必要,设置为null,从而释放其引用,即解除引用。(适用全局变量、全局对象属性)

1、通过const和let声明提升性能

        es6增加的这两个关键字,,有助于改进垃圾回收的过程,因其块级作用域

2、隐藏类和删除操作

        Chrome 使用V8 JavaScript引擎,V8将解释后的JavaScript代码编译为实际的机器码时会利用“隐藏类”。【性能】

        V8会针对创建的对象与隐藏类相关联起来,跟踪他们的属性特征,进行优化

3、内存泄漏

        闭包

        定时器(其实也是闭包,定时器的回调引用了外部变量)

4、静态分配与对象池

        多余的垃圾回收,会因释放内存而损失性能。要合理使用分配内存

        函数返回值中,如果返回了一个对象,且函数中未定义,那么调用这个函数时,会在堆上创建一个新对象,然后修改它,在返回给调用者。这个对象的生命周期很短,快速失去引用,成为可以被回收的值。假如。该函数被频繁调用,那么垃圾回收调度程序会发现这里的对象更替速度很快,会更频繁地安排垃圾回收。

        解决方案:不要动态创建适量对象,在函数中定义,让它使用一个已有的矢量对象

        静态分配是优化的一种极端形式,不常见

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值