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

转载于:https://www.cnblogs.com/liangzi4000/p/5821785.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值