JS笔记(二)

  • 变量、作用域与内存

第 4 章 变量、作用域与内存

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

4.1 原始值与引用值

原始值就是最简单的数据,引用值则是由多个值构成的对象。
保存原始值的变量是按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。
引用值是保存在内存中的对象。


4.1.1 动态属性

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

1
2
3
4
5
6
7
8
let name1 = "Nicholas"; 
let name2 = new String("Matt");
name1.age = 27;
name2.age = 26;
console.log(name1.age); // undefined
console.log(name2.age); // 26
console.log(typeof name1); // string
console.log(typeof name2); // object

4.1.2 复制值

通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。

1
2
let num1 = 5; 
let num2 = num1;

在把引用值从一个变量赋给另一个变量时,这里复制的值实际上是一个指针,指向存储在堆内存中的对象。

1
2
3
4
let obj1 = new Object(); 
let obj2 = obj1;
obj1.name = "Nicholas";
console.log(obj2.name); // "Nicholas"

4.1.3 传递参数

变量有按值和按引用访问,而传参则只有按值传递。

1
2
3
4
5
6
7
8
9
function addTen(num) { 
num += 10;
return num;
}

let count = 20;
let result = addTen(count);
console.log(count); // 20,没有变化
console.log(result); // 30

4.1.4 确定类型

前一章提到的 typeof 操作符最适合用来判断一个变量是否为原始类型。

1
2
3
4
5
6
7
8
9
10
11
12
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

typeof 虽然对原始值很有用,但它对引用值的用处不大。想知道它是什么类型的对象,使用instanceof 操作符

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

4.2 执行上下文与作用域

执行上下文(以下简称“上下文”)的概念在 JavaScript 中是颇为重要的。变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。


4.2.1 作用域链增强

4.2.2 变量声明


4.3 垃圾回收

4.3.1 标记清理

4.3.2 引用计数

4.3.3 性能

4.3.3 性能


第 5 章 基本引用类型

Author

Lamber

Posted on

2022-01-03

Updated on

2022-01-05

Licensed under