javascript内存机制

javascript内存机制

原始值和引用值存储在内存中的位置分别为栈和堆。原始值是存储在栈中的简单数据段,他们的值直接存储在变量访问的位置。引用值是存储在堆中的对象。
注意:原始值和引用值都在栈中,但是引用值使用指针指向它对应的堆。

var str = "Hello World"; // str:"Hello World"存在栈中
var obj = {value:"Hello World"}; // obj存在栈中,{value:"Hello World"}存在堆中,通过栈中的变量名obj(访问地址)访问
var obj1 = {name:'obj1'};
//为obj1分配栈内存访问地址:obj1,堆内存中存对象值:{name:"obj1"};
var obj2 = obj1;
//为obj2分配栈内存访问地址:obj2,引用了堆内存的值{name:"obj1"}
obj2.name='obj2';
//通过obj2访问(修改)堆内存的变量,这时候堆内存中对象值为:{name:"obj2"},由于obj1和obj2引用的是堆内存中同一个对象值,所以这时候打印都是{name:"obj2"}
console.log(obj1.name);//obj2
obj2 = {name:'newName'};
//因为改的是整个对象,这里会在堆内存中创建一个新的对象值:{name:"newName"},而现在的obj2引用的是这个对象,所以这里打印的obj1依旧是{name:"obj2"},而obj2是{name:"newName"}(两者在内存中引用的是不同对象了)。
console.log(obj1.name,obj2.name);//obj2 newName

var str_a = "Hello World";
function fn_a(arg){
    console.log(arg); // Hello World
    arg = "Hai";
    console.log(str_a,arg); // Hello World Hai
};
fn_a(str_a);

str_a:Hello World
原始值传递,传递的是栈,是值。

var obj_a = {value:1};
function fn_a(arg){
    arg={value:2};
};
fn_a(obj_a);
console.log(obj_a);//{value:1}
//传入的是引用关系.arg最开始指向obj_a对应的堆地址,然后指向新堆地址
function fn_b(arg){
    arg.value=3;
};
fn_b(obj_a);
console.log(obj_a);//{value:3}

引用值传递,传递的是内存地址

参考文章:
1.javascript的内存分配
2.JavaScript 中对内存的一些了解
3.深入理解javascript之内存分配

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注