1、基本类型和引用类型的值
检测类型(typeof 和 instanceof)
-
typeof 操作符可以确定一个变量的数据类型,如string、number、undefined、boolean和object(null也是object)
var a = null; alert(typeof a);//object -
instanceof 操作符用来检测对象的类型,如果变量是给定引用类型的实例,那么 instanceof 操作符就会返回 true。
alert([] instanceof Array);//true
2、执行环境及作用域
延长作用域链
虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有其他办法来延长作用域链。 因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在两种情况下会发生这种现象。具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:
-
try-catch 语句的 catch 块:创建一个新的变量对象,其中包含的是被抛出的错误对象的声明;
-
with 语句:将指定的对象添加到作用域链中。
function buildUrl() {
var qs = "?debug=true";
with(location){
var url = href + qs;
}
return url;
}
/*在此,with 语句接收的是 location 对象,因此其变量对象中就包含了 location 对象的所有属
性和方法,而这个变量对象被添加到了作用域链的前端。buildUrl()函数中定义了一个变量 qs。当在
with 语句中引用变量 href 时(实际引用的是 location.href),可以在当前执行环境的变量对象中
找到。当引用变量 qs 时,引用的则是在 buildUrl()中定义的那个变量,而该变量位于函数环境的变
量对象中。至于 with 语句内部,则定义了一个名为 url 的变量,因而 url 就成了函数执行环境的一
部分,所以可以作为函数的值被返回。*/
3、垃圾收集
JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略可能会因实现而异,但具体到浏览器中的实现,则通常有两个策略——标记清除和引用计数。
标记清除
JavaScript 中最常用的垃圾收集方式是标记清除。当变量进入环境(例如,在函 数中声明一个变量)时,就将这个变量标记为“进入环境”;当变量离开环境时,则将其 标记为“离开环境”。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
引用计数
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是 1。 如果同一个值又被赋给另一个变量,则该值的引用次数加 1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那些引用次数为零的值所占用的内存。
管理内存
解除引用:一旦数据不再有用,最好通过将其值设置为 null 来释放其引用,这样做可以优化内存使页面获得更好的性能。
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除 globalPerson 的引用
globalPerson = null;
解除引用不意味着回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。