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)让变量和空间地址关联在一起(把空间地址赋值给变量)
*
* 引用类型不是按照值来操作,它操作的是空间的引用地址:把原来空间的地址赋值给新的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响了
*/
2、
/*
* 1、形成一个全局作用域(栈内存)
* 2、代码自上而下执行
* 1.首先开辟一个新的堆内存(AAAFFF111),把键值对存储到堆内存中
* n:10
* m:obj.n*10 =>obj.n 此时堆内存信息还没有存储完成,空间的地址还没有给obj,此时的obj是undefined,obj.n<=>undefined.n
*/
/*
var obj = {
n: 10,
m: obj.n * 10 //=>Uncaught TypeError: Cannot read property 'n' of undefined
};
console.log(obj.m);
*/
var obj = {
n: 10
};
obj.m = obj.n * 10;
console.log(obj.m);//=>100
3、
var ary1 = [3, 4];
var ary2 = ary1;
ary2[0] = 1;
ary2 = [4, 5]; //=>开辟新的堆内存,修改ary2内存地址
ary2[1] = 2;
ary1[1] = 0;
console.log(ary1, ary2); //=>[1,0] [4,2]