小白都能看懂的javascript内存模型

javascript的数据类型分为两大类,基本类型(Undefined、Null、Boolean、Number和String)和引用类型(BOM,DOM,函数,数组等等),分别存储在栈内存和堆内存之中,对应值复制和值引用两种传值方式


    const log = console.log;
	const print = JSON.stringify;


    let a = 100;
	let b = a;
	a = 999;
	log('a:' + print(a) + ' ||| b:' + print(b));
	
	let aa = 100;
	let bb = aa;
	aa = {};
	log('aa:' + print(aa) + ' ||| bb:' + print(bb));

输出 a:999 ||| b:100
aa:{} ||| bb:100

b只是复制了a的值,两个变量是相互独立的,即便aa变成了引用类型,两者并没有联系


    let c = { xyz: 100 };
	let d = c;
	c.xyz = 999;
	log('c:' + print(c) + ' ||| d:' + print(c));
	
	let cc = { xyz: 100 };
	let dd = cc;
	cc = 999;
	log('cc:' + print(cc) + '	||| dd:' + print(dd));

输出  c:{"xyz":999} ||| d:{"xyz":999}
cc:999    ||| dd:{"xyz":100}

d引用了c的值,两者指向同一块内存,但是cc一旦变成基本类型,dd就失去了和cc的同步关系

    
    let e = [100, {xyz: 999}];
	let f = e[0];
	let g = e[1];
	f = 999;
	g.xyz = 100;
	log('e:' + print(e));

输出  e:[100,{"xyz":100}] 

e的两个元素的内存模型不同传值的方式也不同,前者为值复制后者为值引用

let a = "China No.1";
a = "China No.1";

//Uncaught TypeError: Assignment to constant variable.
const a = "China No.1";
a = "China No.1";

a.name = "primary type";
a.value = 55555;

console.warn("a", a);

注意基本类型对象可以使用成员操作符"."而且不报错,但是不会起作用

let b = {};
b = {};

//Uncaught TypeError: Assignment to constant variable.
const b = {};
b = {};

b.name = "object type";
b.value = 10000;

console.warn("b", b);

基本类型被const修饰直接变成常量,也就是值不可变重新赋值会直接报错,引用类型被const修饰表示地址不可变,但是值可变,通过"."改变对象的字段值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free5156

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值