JS有两种大的数据类型:基本数据类型(值类型)和引用数据类型
值类型
值类型有六种:
- number
- string
- boolean
- null
- undefined
- symbol
引用数据类型
包括对象和函数。
- 对象有:
{ } 普通对象
[ ] 数组
/^$/ 正则
Math 对象
… … - 函数有:
function 普通函数
类
… …
JS代码在浏览器中执行,遇到对象和遇到函数的时候,执行不同的操作步骤:
1. 对象的操作
(1) 浏览器为其开辟一个新的内存空间(堆内存),为了方便后期可以找到这个空间,浏览器给空间分配一个16进制的地址。
(2) 按照一定顺序,分别的把对象键值对存储到空间中。
(3) 把开辟的内存地址赋值给变量(或者其他东西,如事件),以后变量就可以通过地址找到内存空间,然后进行一些操作。
举个栗子:
var a = {
name: "AAA"
};
var b = a;
b.name = "BBB";
console.log(a); // =>{ name: 'BBB' }
console.log(b); // =>{ name: 'BBB' }
b = {
name: "CCC"
};
console.log(a); // =>{ name: 'BBB' }
console.log(b); // =>{ name: 'CCC' }
2. 在JS中函数的操作步骤,先创建函数,再执行函数
- 创建函数(再堆内存中):
(1) 先开辟一个内存空间(为其分配了一个16进制的地址)。
(2) 把函数体重编写的js代码当做字符串存储到空间中(函数只创建不执行的时候毫无意义
)。
(3) 把分配的地址赋值给声明的函数名(function fn
和var fn = function
操作原理相同,都是在当前作用域中声明了一个名字)。 - 执行函数(在栈内存中自上而下执行函数中的代码):
(1) 函数执行的时候,浏览器会形成一个新的私有作用域(即栈内存,只能执行函数体中的代码)供函数体中的代码执行。
(2) 执行代码之前,先把创建函数时存储的那些字符串变为真正的js表达式,按照从上到下的顺序在私有作用域中执行。
总结函数执行的步骤:
浏览器形成私有作用域 --> 形参赋值 --> 变量提升 --> 代码自上而下执行
注意两点:
① 一个函数可以被执行N次,每一次执行相互之间互不干扰(有特殊情况)。
② 形成的私有作用域把函数体中的私有变量等都包裹(保护)起来了,在私有作用域中操作私有变量和外界没关系,外界也无法直接地操作私有变量,我们把函数执行形成的这种保护机制叫做闭包
。