js之变量、数据、内存篇

内存:用于存放变量对象常量的物理空间。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(){
	......
}

猜你喜欢

转载自blog.csdn.net/HuaiCheng9067/article/details/88863862