内存:用于存放变量、对象、常量的物理空间。js中内存空间可分为三种:栈(stack)、堆(heap)、池(一般归类于栈中)。
->栈:存放变量,特点:先进后出,后进先出。例如:string、number、boolean、null、undefined
->堆:存放复杂对象,特点:不能被直接访问,更不能直接操作堆空间,只能引用访问、操作。释放引用,会被浏览器自动垃圾回收,释放内存空间。例如:object、function、array
->池:存放常量
内存释放:先看下手动回收例子:
var a = 20; // 在内存中给数值变量分配空间
alert(a + 100); // 使用内存
var a = null; // 使用完毕之后,释放内存空间,等待下一次自动垃圾回收处理
自动垃圾回收机制:定时间隔的找出哪些没被使用的值,然后释放其占用的内存。所以要及时的清除无效的引用。
例如es6中的WeakMap
就是一个弱引用的map结构。不会干扰自动垃圾回收机制。
数据:储存在内存中的信息。
数据类型:
->基本数据(值)类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol
->复杂数据(引用)类型:对象(Object)、数组(Array)、函数(Function)
变量:储存在栈中的内存空间。
变量声明:var、let、const
->未声明,赋值,自动创建全局变量
->未声明,未赋值,直接使用会* 报错 *
变量提升:
->在任何地方未声明的变量,直接赋值操作,声明提前至全局,值留原地。
->var声明的变量,全局下会声明提前至全局,函数内会提前在函数块的顶端。
var name= "虾米";
function do_something(){
console.log(name); //虾米
}
function do_something_other(){
console.log(name); //undefined
var name= "酷狗";
}
->let、const声明的变量、常量,只存在于声明的块中,不会声明提前,但会存在一个暂时性死区。
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError: foo is not defined
var bar = 1;
let foo = 2;
}
let在同级块作用域中,不允许重复声明
,否则会报错。
->函数的两种方式:
//函数表达式,变量提前,函数留原地
var test= function(){
......
}
//函数声明,整个函数进行声明提前
function test(){
......
}