第四章 变量、作用域和内存问题
ECMAscript变量包含两种不同数据类型的值:基本类型值(基本数据类型)和引用类型值(多个值构成的对象)。
1、对引用类型的值,可为其添加、改变、删除其属性及方法。而基本类型不可以。
var person=new Object();
person.name="Mike";
2、复制变量值
对于基本类型的值,从一个变量向另一个变量复制,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。
var num1=5;
var num2=num1;
两个值完全独立。可参与任意操作而不影响。
而对于引用类型的值,虽然也会将存储在变量对象中的值复制一份到为新变量分配的空间中,但其实这个复制的副本是一个指针,指向存储于堆中的那个对象,操作结束后,两者实际上将引用一个对象。改变任意一个变量就会影响另一个变量。
var person=new Object();
person.name="Mike";
var personcopy=person;
3、传参
所有函数的参数都是按值传递的,也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样
把函数的参数想象成局部变量。
ps:不懂的时候画存储图更好理解。
4、检测类型
typeof只能检测是object,但有时候需要更精确的知道是什么类型的对象。使用instanceof,语法为
variable instanceof constructor
如:person instanceof Array //返回true说明person是数组对象。
5、执行环境及作用域
代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的所有变量和函数的有序访问)。如果这个环境是函数,将其活动对象作为变量对象,活动对象一开始只包含argument对象(全局环境中不存在),下一个变量对象来自包含环境,再下一个来自下一个包含环境,一直到全局执行环境。
var color=“blue”;
function(){
if (color==“blue”) //true
...
}
也就是说,可以使用定义在上一级及以上的变量。内部环境可以访问外部环境,反之不可。
函数内部如果没有使用var定义则被默认为全局变量。外部都可以使用。
6、垃圾收集
自动垃圾收集机制,标记无用变量并清除内存。
性能优化:为执行中的代码只保存必要的数据,一旦数据不再使用,设置为null,便于垃圾收集器下次回收。