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

posted @ 2016-08-30 14:05  liangzi4000  阅读(2018)  评论(0编辑  收藏  举报