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之内存分配