A variable can hold one of two types of values: primitive values and reference values.
-
Primitive valuesare data that are stored on the stack. -
Primitive valueis stored directly in the location that the variable accesses. -
Reference valuesare objects that are stored in the heap. -
Reference valuestored 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