第四章 变量,作用域与内存
通过变量使用原始值
- 1. 原始值与引用值
+ 原始值: 最简单的数据
+ 引用值: 多个值构成的对象
- 2. 原始值有哪些
+ Undefined Null Boolean Number String Symbol
+ 访问时 直接访问存储在变量中的实际值
+ 由于JavaScript不允许直接访问内存,所以不能直接操作对象所在的内存空间。在操作对象时,实际上操作的式对改对象的引用,而非对象本身。
- 3. 动态属性
+ 只有引用值可以动态的增加或者显示的删除该属性
+ 而给原始值增加属性的时候,不报错,但是增加无效,打印时 : undefined
+ let name = "Nicholas";
name.age = 19;
console.log(age); //expected output : undefined
- 4. 复制值
+ 原始值:利用赋值运算符便可进行
+ 引用值:简单的进行赋值,实现的是俩个引用值指向的是一块存储空间
- 5. 传递参数
+ 原始值传递参数和引用值传递参数都一样,都是传值。引用值也不是传引用:看一下例子:
+ function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Tom";
}
let persion = new Object();
setName(persion.name);
console.log(persion.name); // expected output : "Nicholas"
- 6 确定类型
+ typeof 确定原始值类型
+ instanceof 确定Object类型
+ console.log(person instanceof Object);
+ console.log(colors instanceof Array);
+ console.log(pattern instanceof RegExp);
+ instanceof 操作符检测任何引用值和Object构造函数都会返回true 若是检测到原始值,会返回false
理解执行上下文
- 1 执行上下文与作用域
- 表示全局上下文的对象可能不一样,所有通过var定义的全局变量和全局函数都会成为window对象的属性和方法
- 使用let 和 const 的顶级声明不会定义在全局上下文中,但在作用域解析上效果是一样的,上下文在其所有代码执行完毕后会被销毁,包括定义在它上面的所有变量和函数。
- 每个函数都有自己的上下文,函数的上下文会被推到一个上下文栈上。在函数执行完,上下文栈会弹出该函数的上下文。
- 作用域链:
+ 决定访问各级上下文中的代码在访问变量和函数时的执行顺序。
+ 如果上下文是函数,活动对象作为变量对象,活动对象最初只有一个定义变量:arguments 全局上下文中没有这个变量。作用域链中的下一个对象来自包含上下文,再下一个对象来自下一个包含上下文,依次类推,知道window上下文。
+ 内部上下文通过作用域链可以访问到所有父级上下文,而父级上下文不能访问自己上下文。
- 作用域链增强:
+ 某些语句会导致在作用于前端临时添加一个上下文,在这个上下文执行后会被删除
+ try/catch 语句中的catch块
+ catch 会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明
+ with 语句
+ 会向作用域链前端添加指定对象
+ function buildUrl() {
let qs = "?debug=true";
with (location) {
let url = href + qs;
}
return ul;
}
理解垃圾回收
- JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内
- 浏览器的发展史上,用到过两种主要的 标记策略:标记清理和引用计数
+ 标记清理
+ 引用计数
|