var a = 12;
var b = a;
b = 13;
console.log(a); // =>12
var obj1 = {n:100};
var obj2 = obj1;
obj2['n'] = 200;
console.log(obj1.n); // =>200
你知道为什么 a 输出来的结果是12?而obj1.n输出来的结果是200吗?那这就得聊聊JS的运行机制了。
-
浅分析JS的运行机制
-
当浏览器(它的内核、引擎)渲染和解析JS的时候,会提供一个供JS代码运行的环境,我们把这个环境称之为“ 全局作用域(global/window scope)”
-
代码自上而下执行(之前还有一个变量提升阶段)
=>基本数据类型的值会存储在当前作用域下
var a = 12;
1)首先开辟一个空间存储12
2)在当前作用域中声明一个变量a (var a)
3)让声明的变量和存储的12进行关联(把存储的12赋值给a => 赋值操作叫做定义)
-
引用数据类型的值不能直接存储到当前的作用域下(因为可能存储的内容过于复杂),我们需要先开辟一个新的空间(理解为仓库),把内容存储到这个空间中
var obj1 = {n:100};
1)首先开辟一个新的内存空间,把对象中的键值对依次存储起来(为了保证后面可以找到这个空间,此空间有一个16进制的地址)
2)声明一个变量
3)让变量和空间地址关联在一起(把空间地址赋值给变量)
引用类型不是按照值来操作,它操作的是空间的引用地址:把原来的地址赋值给新的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响了。
JS中的值类型和引用类型的区别: 值类型的结构比较简单,会在当前作用域中开辟一个位置,把值直接存进去;值类型之间的操作都是把原来的值复制一份,然后放在一个新位置,之前的位置和新位置之间是没有关联的(总结:基本值不会让两个变量产生关联。)
而引用类型由于结构比较复杂,所以它是开辟一个新的空间,用来存储键值对,为了能够找到,会有一个16进制地址,变量引用数据关联是通过地址来进行关联的,共用同一个地址(总结:引用类型可能会让两个变量产生关联。)
数据类型区别
1、基本数据类型按照值来操作
2、引用数据类型按照空间地址来操作