基本类型和引用类型的值
ECMAScript规定了5种基本类型:Undefined、Null、Boolean、Number和String。
注:String在ECMAScript中不是对象。
1、动态的属性
对于引用类型的值,我们可以为其添加属性和方法,也可以动态的改变和删除其属性和方法,例如:
注:只能作用于引用类型。
2、复制变量值
基本类型复制:复制基本类型会在被复制成功的变量上创建新值。两个变量可以参与任何
操作而不受影响。
引用类型复制:复制引用类型是创建一个指针,指向被复制的对象,两个变量操作同一个对象。
3、传递参数
ECMAScript中所有函数的参数都是按值传递的,基本类型值传递如同基本类型变量复制一样,引用类型传递如同引用类型变量复制一样(传递的是地址)。
可以把基本类型传递的参数想象成局部变量。
注:如果传入的参数变量是引用类型,则对该参数的操作会影响函数外部的变量。
4、检测类型
typeof:检测基本类型,可以确定一个变量是字符串、数值、布尔值还是undefined,检测函数时会返回”function”,但如果变量是null和对象,则会返回”object”。
instanceof:检测引用类型,返回值是true和false,检测基本类型始终返回false,具体使用如下所示:
执行环境及作用域
全局执行环境是最外围的一个执行环境,根据ECMAScript实现所在的宿主环境不同,其执行环境对象也不一样,在Web浏览器中,全局执行环境为window对象。
因此,所有的全局变量和函数都是作为window对象的属性和方法创建的。每个函数也有自己的执行环境,当函数执行时,函数的环境就会被推入一个环境栈中,再函数执行完毕,栈将其环境弹出。
当代码在一个环境中执行时,会创建变量对象的作用域链,其作用时保证所有函数和变量的有序访问。
每个环境都可以向上搜索作用域链,所以内部环境可以通过作用域链访问所有的外部环境,外部环境不能访问内部环境的任何变量和函数。
1、延长作用域链
try-catch语句的catch块
2、没有块级作用域
JavaScript没有块级作用域,在if或for中声明的变量会添加到当前的执行环境中。
在函数中没有使用var声明变量,该变量就会添加到全局环境中(一定要先声明变量)。
标识符的搜索顺序:先从当前的执行环境中寻找,如果没有再向上搜索作用域链,一直到找到该标识符或到了全局环境。
垃圾收集
1、标记清除
最常用的垃圾收集方式。垃圾收集器在运行的时候会给存储在内存中的变量都加上标记,然后,去掉环境中的变量以及被环境中变量所引用的的变量的标记。而在此之后再被加上标记的变量被视为准备删除的变量。
2、引用计数
不太常见的垃圾收集策略。
注:会导致循环引用
3、性能问题
垃圾收集器是周期性运行的,在IE中可以调用window.CollectGarbage()来立即执行
垃圾收集。在Opera7及更高版本中调用window.opera.collect()也会启动垃圾收集。
注:不建议手动触发垃圾收集过程。
4、管理内存
确保占用最少的内存可以让页面获得更好的性能,所以一旦有数据不再有用,最好将其设置为null来释放其引用。
这一做法适用于大多数全局变量和全局对象的属性,不过解除一个值的引用并不意味着自动回收该值所在的内存,而是让其脱离执行环境,方便垃圾收集器运行时将其回收。