欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript--内存空间(栈空间、堆空间)

程序员文章站 2022-05-12 12:24:55
...

JavaScript在内存分配管理上使用栈内存和堆内存,简单的基本数据类型的数据一般存储在栈内存中(其值有固定的大小范围),而像复杂的 Object 类型的数据则使用堆内存来存储(其大小不固定如数组对象等)。
栈内存中存储js声明的变量名和变量值,由于基本数据类型的值直接存储在栈内存中可以直接获取数据的值,而Object类型存储在堆内存中,栈内存存放的是使用Object类型数据名和该数据在堆内存中的地址值,相当于引用该种类型的数据。
JavaScript--内存空间(栈空间、堆空间)
正是由于Object类型的数据是通过地址值引用的,在js开发中会出现一些问题,比如:

        // 引用类型复制变量
        var person={//堆内存中存储对象数据{name:'name',age:'age'},person保存的值是数据在内存中的地址值
            name:'name',
            age:'age'
        }
        var student=person//复制person变量值即地址值
        student.name='student'
        console.log(person.name) //student

当引用类型的数据被复制时,复制的是其引用的地址值,变量person和student共用一个对象,当student.name属性被修改时,存储在堆内存中的对象的属性即被修改,因此才会出现深拷贝浅拷贝的问题。

// 基本类型复制变量
var a = 10;
var b = a;
b = 20;

a // 10
b // 20

对于基本数据类型,栈中存储的就是它自身的数据值,将 a 变量的值赋值给 b 变量,就是将 a 的值10复制了一份给 b ,存储在栈内存中。

JS中调用函数时传递参数,是值传递,只是基本数据类型传递的值即是在内存中保存的数据,而Object类型的数据传递的值是其数据在内存中保存的地址值。参考如下代码:

        var a=3;//全局变量 a 值为3
        function fn(a) {//局部变量 a,将全局变量 a 的值3复制给局部变量 a
            a=a+1;   //局部变量 a 值加1,其值为 4
        }
        fn(a);//将全局变量 a 的值3传递给局部变量 a
        console.log(a);//3 打印的是全局变量 a

        function fn2(obj) {//局部变量 obj 与全局变量 obj 引用同一个对象
            obj.age=13;
            console.log(obj.name);// Tom
        }
        var obj={name:'Tom'};
        fn2(obj);//调用fn2函数,传递obj对象值即保存在内存中的地址值
        console.log(obj.age);// 13