开始阅读JavaScript高级程序设计(第5版)学习JS,总共有1000+页,非常全面,短期看完不太现实,找到了一篇博客,花些时间跟着这篇博客过一下红宝书。
红宝书《JavaScript高级程序设计(第5版)》学习大纲 - 大前端全栈开发 - SegmentFault 思否
相比于其他语言,JavaScript中的变量可谓独树一帜。正如ECMA-262所规定的,JavaScript变量是松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命期内可以改变。这样的变量很有意思,很强大,当然也有不少问题。
原始值和引用值:
ECMAScript变量可以包含两种不同类型的数据:原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。在把一个值赋给变量时,JavaScript引擎必须确定这个值是原始值还是引用值。保存原始值的变量是按值(by value)访问的。
引用值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。为此,保存引用值的变量是按引用(by reference)访问的。
动态属性:
对于引用值而言,可以随时添加、修改和删除其属性和方法。
这里,首先创建了一个对象,并把它保存在变量person中。然后,给这个对象添加了一个名为name的属性,并给这个属性赋值了一个字符串 “Alice”。在此之后,就可以访问这个新属性,直到对象被销毁或属性被显式地删除。
1
2
3
let person = new Object();
person.name = "Alice";
console.log(person.name); // "Alice"
原始值不能有属性,尽管尝试给原始值添加属性不会报错。 在此,代码想给字符串name定义一个age属性并给该属性赋值27。紧接着在下一行,属性不见了。只有引用值可以动态添加后面可以使用的属性。
1
2
3
let name = "Alice";
name.age = 27;
console.log(name.age); // undefined