变量、作用域、内存问题
一. 基本类型和引用类型
- 1.基本类型(Undefined,Null,Number,String,Boolean)是按值访问的,可以操作保存在变量中实际的值
- 2.引用类型的值是保存在内存中的对象,JS不允许直接访问内存中的位置,就是说不允许直接操作对象的内存空间,引用类型实际上是在操作对象的引用( 内存地址 )而不是实际的对象
- 3.复制变量值
二. 检测类型
- 1.检测一个变量是不是基本数据类型,使用 typeof 就可以,但是typeof null 会返回object,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。
- 2.使用 instanceof 操作符可以判断一个变量(的引用)是否属于某个构造函数,在检测一个引用类型值是否属于Object时,永远返回true,因为所有引用类型的值都时Object的实例。
- 基本类型值 instanceof 对象构造函数,返回false
var num = 2;
console.log(typeof num);
console.log(num instanceof Object);
var arr = [1,2,3];
console.log(typeof arr);
console.log(arr instanceof Array);
console.log(arr instanceof Object);
三. 全局作用域和局部作用域
- 全局环境只能访问全局环境中定义的变量和函数,不能向下访问 ( 局部环境 )
- 局部环境中的变量可以通过作用域链向上访问
- 在花括号 { } 或者函数内,就会开启一个局部作用域。局部变量只会在函数执行的过程中存在,在这个过程中,会为局部变量在内存上分配对应的存储空间,在函数中使用变量,直到函数结束,这个时候局部变量就没有存在的意义了,可以释放它们的内存。
四. 垃圾收集
- JS具有自动垃圾收集机制,就是找出使用完毕的变量,释放其占用的内存。
- 标记清除法:当变量进入执行环境,标记为“进入环境”,变量离开环境,标记为“离开环境”,垃圾收集器收集 “离开环境”的变量
- 引用计数法:跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型的值赋给该变量的时候,这个值的引用为1,当值的引用为0时,可以把它占用的内存回收。
- 管理内存:为执行中的代码只保存必要的数据。一旦数据不再有用,手动把它的值设置为null,释放其引用 ( 解除引用 )