一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
基本类型传递方式
由于js中存在复杂类型和基本类型,对于基本类型而言,是按值传递的.
var a = 1;
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // 1
虽然在函数 test 中 a 被修改,并没有有影响到外部 a 的值,基本类型是按值传递的
复杂类型按引用传递?
我们将外部 a 作为一个对象传入 test 函数.
var a = {
a: 1,
b: 2
};
function test(x) {
x.a = 10;
console.log(x);
}
test(a); // { a: 10, b: 2 }
console.log(a); // { a: 10, b: 2 }
可以看到,在函数体内被修改的 a 对象也同时影响到了外部的 a 对象,可⻅复杂类型是按引用传递的.可是如果再做一个实验:
var a = {
a: 1,
b: 2
};
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // { a: 1, b: 2 }
外部的 a 并没有被修改,如果是按引用传递的话,由于共享同一个堆内存, a 在外部也会表现为 10 才对. 此时的复杂类型同时表现出了按值传递和按引用传递的特性
按共享传递
复杂类型之所以会产生这种特性,原因就是在传递过程中,对象 a 先产生了一个副本a ,这个副本a 并不是深克隆得到的副本a ,副本a 地址同样指向对象 a 指向的堆内存.因此在函数体中修改 x=10 只是修改了副本a , a 对象没有变化. 但是如果修改了 x.a=10 是修改了两者指向的同一堆内存,此时对象 a 也会受到影响。有人讲这种特性叫做传递引用,也有一种说法叫做按共享传
JavaScript的基本类型和复杂类型是储存在哪里的?
- 基本类型储存在栈中,但是一旦被闭包引用则成为常住内存,会储存在内存堆中。
- 复杂类型会储存在内存堆中
栈和堆的区别?
- 栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
- 堆(数据结构):堆可以被看成是一棵树,如:堆排序;栈(数据结构):一种先进后出的数据结构