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