整体思维导图
变量
当复制基本类型变量时:
此时num2中的5和num1的5是相互独立的,num2的5只是num1的复制值,和num1完全不相关,此后两个参数参加任何操作而不会相互影响。
var num1=5
var num2=num1
var num1=6
console.log('num1',num1) //6
console.log('num2',num2) //5
当复制引用类型变量时:
var obj1= new Object()
var obj2 = obj1
obj1.name = "mjc"
console.log(obj2.name ) //mjc
当一个变量复制一个引用类型的变量时,虽然也会复制一个值到新的变量,但是不同于基础变量的是:这个复制的值只是一个指针,obj2的值的指向和obj1的指向是一样的,都是堆内听一个值,所以当obj1改变后,obj2 的值也会跟着变化。
传递参数
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
在把person传递给setName()后,其name属性被设置为"Nicholas"。然后,又将一个新对象赋给变量obj,同时将其name属性设置为"Greg"。如果person是按引用传递的,那么person就会自动被修改为指向其name属性值为"Greg"的新对象。但是,当接下来再访问person.name时,显示的值仍然是"Nicholas"。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
检测类型
检测基本类型最好用的办法是typeof,唯一的区别就是null,它会返回object
检测引用类型的方法是instanceof 只要是验证引用类型是不是object,结果都是true
var arr=[]
console.log(arr instanceof Object) //true
console.log(arr instanceof Array) //true
执行环境以及作用域
所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执
行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几点总结:
执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;
每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全
局环境;
全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
变量的执行环境有助于确定应该何时释放内存。