Javascript值引用和對象引用


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 UndefinedNullBooleanNumber, or String.

示例一:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM