JavaScript红宝书笔记:(第四章)变量、作用域、内存

本章分为三部分,变量、作用域、内存,都是重点问题。目前面试中主要问到的是前两部分。

1、变量

首先来看变量。变量的数据类型,分为基本类型和引用类型,复习一下:

  • 基本类型(5种):Undefined、Null、Boolen、Number、String
  • 引用类型(5种):Object、Array、Date、RegExp、Function

他们的区别如下:

  • 基本类型的值是简单的数据段,大小固定,保存在栈中;引用类型的值是对象,保存在堆中。
  • 基本类型是值传递的,引用类型是引用传递的。(所以在复制的时候会有区别,复制基本类型的值,两个变量是独立的,而复制引用类型的值,两个变量实际上引用同一个对象)

最后要补充的是类型检测,我们知道类型检测有两种方法,typeof和instanceof,什么情况下使用呢?

  1. 检测基本数据类型用typeof
    注意以下几点:

    • 检测结果是小写的,如string
    • 检测Null类型,结果是object,而不是null
    • 检测引用类型Function,结果是function
    • 检测其他的引用类型,结果是object
  2. 检测引用类型,使用instanceof

    • 关于数组(Array)的检测,在一个页面出现多个全局作用域的情况下instanceof会出现问题,因此ES5新增了Array.isArray()方法。
  3. 除此之外,检测一个对象是原生的还是自定义对象还可以采用如下方法:

//检测是否是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来解除引用
解除引用的目的是让值脱离执行环境,以便垃圾收集器将其回收。

到这里本章就结束了。内容还是比较少的。方便记忆为主~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值