// 浅聊js的运行机制(堆栈内存和不同的数据类型的操作方式)
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
/*
* 浅分析js的运行机制
* 1. 浏览器(它的内核/引擎)渲染和解析js的时候,会提供一个js代码运行的环境,我们把这个环境称之为“全局作用域(global/window(客户端) scope)”
* 2. 代码自上而下执行(在此之前还有一个变量提升阶段)
=> 基本数据类型的值会存储在当前作用域下(按值操作)
var a = 12;
1).先在当前作用域下开辟一个空间存储12(栈内存)
2).在当前作用域中声明一个变量a (var a)(变量没有意思)
3).让声明的变量和存储的12关联(把存储的12的赋值给a => 赋值操作叫做定义)
基本类型(也叫做值类型),是按照值来操作的,把原有的值复制一份放到新的空间位置上,和原来的值没有关系(为了让两个位置和空间没有关系),一个变量只能跟一个值关联
=> 引用数据类型的值不能直接存储到当前的作用域下(因为可能存储的内容过于复杂),我们需要先开辟一个新的空间(理解为仓库),把内容存储到这个空间中(按地址操作)(堆内存)
var obj1 = { n: 100 }
1). 首先开辟一个新的内存空间,把对象中的键值对依次存储起来(为了保证后面可以找到这个空间,此空间有一个16进制的地址)
2). 声明一个变量
3). 让变量和空间地址关联在一起(把空间地址赋值给变量)
引用类型不是按值来操作,他操作的空间的引用地址:把原来空间的地址赋值给新的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响了
栈内存(作用域): ==>(值类型)
栈内存提供js代码运行的环境
代码都在栈内存中进行执行
所有的值类型都会在栈内存中开辟一个位置进行存储
堆内存: ==> (引用类型)
用来存储引用类型的信息的值
对象存储的是键值对
函数存储的是代码字符串
*/
堆栈内存练习
案例一:
var obj = {
n: 10,
m: obj.n * 10 //Can not read property 'n' of undefined
};
console.log(obj.m) //报错=>
var obj = {
n: 10
}
obj.m = obj.n *10;
console.log(obj.m) // 10
/*
* 1.形成一个全局作用域(栈内存)
* 2.代码自上而下执行
1).首先开辟一个新的堆内存,把键值对存储到内存中
=n: 10,
m: obj.n *10 => 此时对内存信息还没有存储完成,空间的地址还没有给obj,此时的obj是undefined,obj.n<=>undefined.n
*/
案例二:
var ary1 = [3,4];
var ary2 = ary1;
ary2[0] = 1;
ary2 = [4,5];
ary2[1] = 2;
ary1[1] = 0;
console.log(ary1,ary2) //(1) [1, 0] (2) [4, 2]