11.17 复习JavaScript红宝书的笔记——

发布时间 2023-11-17 21:58:58作者: katyjohn

一、原始值与引用值

对于原始值和引用值的判断类型各自有对应的操作符,前者可以用typeof操作符

let s = "Nicholas"; 
let b = true; 
let i = 22; 
let u; 
let n = null; 
let o = new Object(); 
console.log(typeof s); // string 
console.log(typeof i); // number 
console.log(typeof b); // boolean 
console.log(typeof u); // undefined 
console.log(typeof n); // object 
console.log(typeof o); // object 

而后者可以用instanceof操作符来判断是什么类型的对象

console.log(person instanceof Object); // 变量 person 是 Object 吗?
console.log(colors instanceof Array); // 变量 colors 是 Array 吗?
console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

 

二、垃圾回收

(一)JavaScript中的垃圾回收策略目前主流有两种,一是标记清理,当声明一个变量后,进入上下文时就会被标记,垃圾回收程序运行的时候,会标记内存中存储的所有变量(记住,标记方法有很多种)。然后,它 会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后再被加上标记 的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内 存清理,销毁带标记的所有值并收回它们的内存。二是引用计数:是对每个值都记录它被 引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为 1。如果同一个值又被赋给另一个变 量,那么引用数加 1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1。当一 个值的引用数为 0 时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。垃圾回收程序 下次运行的时候就会释放引用数为 0 的值的内存。但这个会出现严重的漏洞,现在主流的浏览器基本放弃使用该策略进行垃圾回收。

(二)性能——垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的 时间调度很重要。

(三)内存管理——影响浏览器内存泄露的两个主要因素:一是意外声明了全局变量:

function setName() { 
 name = 'Jake'; 
} 

此时,解释器会把变量 name 当作 window 的属性来创建(相当于 window.name = 'Jake')。 可想而知,在 window 对象上创建的属性,只要 window 本身不被清理就不会消失。这个问题很容易 解决,只要在变量声明前头加上 var、let 或 const 关键字即可,这样变量就会在函数执行完毕后离开作用域。

二是使用闭包会不知不觉的造成内存泄漏。

三、原始值包装类型与单例内置对象:1.每种包装类型都映射到同名的原始类型。

2.以读模式访问原始值时,后台会实例化一个原始值包装类型的对象,借助这个对象可以操作相 应的数据。

3.涉及原始值的语句执行完毕后,包装对象就会被销毁。

下面以字符串为例子:

let s1 = new String("some text"); 
let s2 = s1.substring(2); 
s1 = null;

 

 

当代码开始执行时,全局上下文中会存在两个内置对象:Global 和 Math。其中,Global 对象在 大多数 ECMAScript 实现中无法直接访问。不过,浏览器将其实现为 window 对象。所有全局变量和函 数都是 Global 对象的属性。Math 对象包含辅助完成复杂计算的属性和方法

console.log(person instanceof Object); // 变量 person 是 Object 吗? console.log(colors instanceof Array); // 变量 colors 是 Array 吗? console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?