一、变量、作用域与内存
1、原始值与引用值
ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。
在把一个值赋给变量时,JavaScript 引擎必须确定这个值是原始值还是引用值。
- 原始值(primitive value)就是最简单的数据。
- 保存原始值的变量是按值(by value)访问的。
- 操作的就是存储在变量中的实际值。
- 引用值(reference value)则是由多个值构成的对象。
- 引用值是保存在内存中的对象。
- 在操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。
- 保存引用值的变量是按引用(by reference)访问的。
1.1、动态属性
原始值和引用值的定义方式很类似,都是创建一个变量,然后给它赋一个值。不过,在变量保存了这个值之后,可以对这个值做什么,则大有不同。对于引用值而言,可以随时添加、修改和删除其属性和方法。
如下示例:
let person = new Object(); person.name = "Nicholas"; console.log(person.name); // "Nicholas" let name = "Nicholas"; name.age = 27; console.log(name.age); // undefined
注意,原始类型的初始化可以只使用原始字面量形式。如果使用的是 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