本章分为三部分,变量、作用域、内存,都是重点问题。目前面试中主要问到的是前两部分。
1、变量
首先来看变量。变量的数据类型,分为基本类型和引用类型,复习一下:
- 基本类型(5种):Undefined、Null、Boolen、Number、String
- 引用类型(5种):Object、Array、Date、RegExp、Function
他们的区别如下:
- 基本类型的值是简单的数据段,大小固定,保存在栈中;引用类型的值是对象,保存在堆中。
- 基本类型是值传递的,引用类型是引用传递的。(所以在复制的时候会有区别,复制基本类型的值,两个变量是独立的,而复制引用类型的值,两个变量实际上引用同一个对象)
最后要补充的是类型检测,我们知道类型检测有两种方法,typeof和instanceof,什么情况下使用呢?
检测基本数据类型用typeof
注意以下几点:- 检测结果是小写的,如string
- 检测Null类型,结果是object,而不是null
- 检测引用类型Function,结果是function
- 检测其他的引用类型,结果是object
检测引用类型,使用instanceof
- 关于数组(Array)的检测,在一个页面出现多个全局作用域的情况下instanceof会出现问题,因此ES5新增了Array.isArray()方法。
除此之外,检测一个对象是原生的还是自定义对象还可以采用如下方法:
//检测是否是Array类型,原理就是调用Object原生的toString()方法
//问如何判断数组和伪数组,就可以用这个方法:
function isArray(value){
return Object.prototype.toString.call(value)=="[object Array]";
}
//类似代码,检测是否是Function类型
function isFunction(value){
return Object.prototype.toString.call(value)=="[object Function]";
}
....
2、作用域
以下既是基础中的基础,也是面试中常见的问题。
1. 什么是执行环境
2. 什么是作用域
3. 什么是作用域链
首先,执行环境就是作用域,为了方便,接下来统称为作用域吧。作用域这个概念我们并不陌生,其他编程语言中都存在。作用如下:
作用域控制变量与参数的可见性及生命周期
——JavaScript语言精粹
JavaScript只有全局作用域和函数作用域,没有块级作用域(花括号中定义)。但是每个作用域都有一个变量对象与之关联,全局作用域对应的是window对象,函数作用域对应着该函数的arguments对象。
其次,作用域链就是代码在一个作用域中执行的时候创建出来的,用于搜索变量和函数,能够保证对所有的作用域的变量和函数的有序访问。搜索过程是一个向上逐级查询的过程,一直追溯到全局作用域。
3、内存管理、垃圾收集
垃圾收集
垃圾收集有两种方式:标记清除和引用计数。
标记清除:给当前不使用的值加上标记,最后销毁它们来释放内存空间。
引用计数:跟踪每个值被引用的次数,释放那些引用次数为0的值所占的内存。
内存管理
尽管JavaScript具有自动垃圾收集机制,但是我们仍然可以优化内存。
局部变量在离开执行环境时会自动解除引用
全局变量则需要我们手动将他们的值设置为null来解除引用
解除引用的目的是让值脱离执行环境,以便垃圾收集器将其回收。
到这里本章就结束了。内容还是比较少的。方便记忆为主~