内存和作用域
一、基本类型和引用类型;
1、基本类型:Undefined、Null、String、Number、Boolean这五种基本数据类型是按值访问的,因此可以操作保存在变量中实际的值;
2、引用类型的值保存在内存中的对象。JavaScript不能直接访问内存中的位置,在操作对象时,实际上操作的是对象的引用而不是对象。为此,引用类型的值时按引用访问的。
二、动态属性;
基本类型是没有属性和方法的,但是引用类型是用属性和方法的,我们可以为其添加属性和方法,也可以删除属性和方法;
三、复制变量值
在从一个变量向另一个变量复制基本类型和引用类型也是存在不同。
1、基本类型的值进行复制时,会在变量对象上创建一个新值,然后把值复制到新变量分配的位置上,
var num1=5;
var num2=num1;
num1和num2内都保存着5,并且他们各自也都是完全独立的,他们互不干扰;他们之间有且仅有一次联系:num1=num2
2、引用类型的值进行复制时,也同样会创建一个新值,然后把值复制到新变量分配的位置上;
var obj=new Object();
var obj=obj1;
obj.name="zhang";
obj1.name="san";
console.log(obj.name);//san
这两个变量实际上引用的是同一个对象,一个变量一个也就会变,他们的联系不会断;
四、参数传递
不管是基本类型还是引用类型,他们传递参数的方式都是按值传递的,就像基本类型的两个变量之间的复值一样。
虽然访问变量与按值和按引用两中国方式,但参数只能按值传递。
function setName(obj){
obj.name="jack";
obj=new Object();//这里创建了一个新对象,独占一个空间;
obj.name="zhang";
}
var person=new Object();//这里的对象独占一个空间
setName(person);
alert(person.name)//jack;
//如果person是按引用传递的,那么name的值就会被覆盖,
//实际上,当在函数内部重写obj时,这个变量引用就是一个局部对象了,而这个局部对象会在函数执行完后销毁。
五、执行环境及作用域
执行环境定义了函数或变量有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个变量对象
环境中定义的所以变量和函数都保存在这个变量中,这个对象我们无法访问。
某个执行环境中的所用代码在执行完毕后,该环境被销毁,保存在其中的变量和函数定义也随之销毁。
内部环境可以通过作用域链访问到外部环境而外部环境不能访问到内部环境。这些环境之间的联系是线性、有次序的,每个环境都可以向上搜索作用域链,以查询变量和函数名。
六、JavaScript没有块级作用域
七、JavaScript具有自动垃圾收集机制。
注:动态属性、变量复制、参数传递这几个方面都是基本类型和引用类型的异同点,注意区分理解。