变量、作用域和内存问题
1. 基本类型和饮用类型的值
a. 基本类型: 简单的数据段
b. 引用类型: 多个值构成的对象
2. 复制变量值
a. 基本类型
i. 从一个变量向另一个变量复制基本类型的值: 会在创建一个新值,然后把该值复制到新变量分配的位置上。
let num = 1;
let num 1 = num;
num 1 ( Number 类型)
num1 1 ( Number 类型)
b. 引用类型
i. 当一个变量向另一个变量复制引用类型的值时,也会讲存贮的值复制一份到新变量的分配的空间中。 而这个值时一个指针,该指针指向存储在堆中的一个对象。
ii. 复制操作结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。
3. 传递参数
a. ECMAScript 中,所有函数的参数都是按照值传递的。(把值从一个变量复制给另一个变量)
b. 基本类型值的传递: 如同基本类型变量的复制一样(值复制)
c. 引用类型值的传递: 如同引用类型变量的复制一样(传递的是指针地址)
function sayName( obj ){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
sayName( person );
alert( person.name ); // ????
/*
在函数内部修改了参数的值,原始的引用保持不变。当函数内部重写obj时,这个变量引用的就是局部对象,而这个局部对象会在函数执行完成之后被销毁。
*/
4. 检测类型
a. 检测基本类型 : typeof
alert(typeof new Object()) ; // object
alert(typeof null ); //object
alert(typeof "yema"); // string
i. 如果变量的值是对象或者 null, 返回 object
b. 检测引用类型: instanceof
i. 语法 : result = variable instanceof constructor
5. 执行环境及作用域
a. 执行环境
变量对象 : 环境中定义的多有变量和函数都保存在这个对象中。(无法访问,但解析器在处理数据时会在后台使用它)
在web浏览器中,全局执行环境被认为是window对象。
b. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,控制权返回给之前的执行环境。
c. 作用域链: 当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证执行环境有权访问所有变量和函数的有序访问,作用域链的前端始终都是当前执行的代码所在环境的变量对象。
/学习笔记,后续补充/