Javascript值引用和对象引用
A variable
can hold one of two types of values: primitive values and reference values
.
Primitive values
are data that are stored on the stack.Primitive value
is stored directly in the location that the variable accesses.Reference values
are objects that are stored in the heap.Reference value
stored in the variable location is a pointer to a location in memory where the object is stored.- Primitive types inlcude
Undefined
,Null
,Boolean
,Number
, orString.
示例一:
var v1 = [] var v2 = {}; var v3 = {}; function foo(v1, v2, v3) { v1 = [1]; v2 = [2]; v3 = {a:3} } foo(v1, v2, v3); alert(v1); // 空白 alert(v2); // [object Object] alert(v3.a); // undefined
上面这个例子是对象引用,但是因为在foo这个函数内,使用了赋值,从而改变了变量的指针地址。
示例二:
var v1 = [] var v2 = {}; var v3 = {a:0}; function foo(v1, v2, v3) { v1.push(1); v2.a = 2; v3.a = 3; } foo(v1, v2, v3); alert(v1); // 1 alert(v2.a); // 2 alert(v3.a); // 3
修改之后的代码,没有赋值,而是直接在对象上进行操作,不会改变变量的指针地址。
示例三:
function setName(obj){ obj.name = "xiaoxiaozi"; obj = new Object(); obj.name = "admin"; } var person = new Object(); setName(person); alert(person.name); // 结果依旧是 xiaoxiaozi
obj.name这行代码在执行时指针地址没变,所有这个属性赋值可以在全局作用域读取成功。obj = new Object()这行代码修改了指针地址,它已经指向了局部作用域下的一个新地址,后面的obj.name属性赋值也相应的指向了局部作用域下的新地址,从而全局作用域无法读取。
参考链接:
http://stackoverflow.com/questions/13266616/primitive-value-vs-reference-value
http://www.cnblogs.com/youxin/p/3354903.html
-------------------
20170428:
C#里面有类似的机制,而且c#有ref关键字,可以保证在传参数的过程中,传入原始引用或值,而不是新创建的副本。
http://www.albahari.com/valuevsreftypes.aspx