
2024-12-5 日报 Day26

今日的鸡汤
只有努力多一点,人生的遗憾才会少一点。
今日学习内容
1、JS红皮书P83-86 第四章:变量、作用域与内存
今日笔记
1、原始值和引用值:ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。原始值就是简单的数据,而引用值则是由多个值构成的对象。6 种原始值:Undefined、Null、Boolean、Number、String 和 Symbol。保存原始值的变量是按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。
引用值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引(reference)而非实际的对象本身。为此,保存引用值的变量是按引用(by reference)访问的。
2、注意,原始类型的初始化可以只使用原始字面量形式。如果使用的是 new 关键字,则 JavaScript 会创建一个 Object 类型的实例,但其行为类似原始值。下面来看看这两种初始化方式的差异:
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
3、原始值和引用值在通过变量复制时也有所不同。在通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。
let num1 = 5;
let num2 = num1;
这里,num1 包含数值 5。当把 num2 初始化为 num1 时,num2 也会得到数值 5。这个值跟存储在num1 中的 5 是完全独立的,因为它是那个值的副本。这两个变量可以独立使用,互不干扰。
4、在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。区别在于,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际
上指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来,如下面的例子所示:
let obj1 = new Object();
let obj2 = obj1;
obj1.name = “Nicholas”;
console.log(obj2.name); // “Nicholas”
5、ECMAScript 中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。变量有按值和按引用访问,而传参则只有按值传递。
注意 ECMAScript 中函数的参数就是局部变量。