Javascript 赋值机制详解

今天回答了一个关于 Javascript 的问题,涉及到了赋值问题,因此想把这个问题好好总结下。

  复制代码 代码如下:

  var a = 'test';

  var b = function() {};

  b.a = 'test';

  function change(m, n) {

  m = 'change';

  n.a = 'change';

  }

  change(a, b);

  执行上述代码后,变量 a 和 b 的值会发生改变吗?

  原始值和引用值

  在 之前的文章中介绍过原始值和引用值,原始值指的 Undefined, Null, Boolean, Number, String 等,它们存放在栈中,而引用值则集成自 Object,它被存放在堆中。

  这里要把两者区分清楚:

  复制代码 代码如下:

  var a = 'test';

  var b = new String('test');

  var A = 'true';

  var B = new Boolean('true');

  以上四个变量,a 和 A 为原始值,而 b 和 B 则为引用值。

  赋值机制

  清楚了原始值和引用值的区别后,就可以具体介绍 Javascript 的赋值机制:

  在 Javascript 中,对于原始值类型的变量,每次赋值都将生成一份拷贝,而对于引用值,则正如其名,是通过引用赋值,指向同一个存储对象的内存处。

  原始值的赋值:

  复制代码 代码如下:

  var a = 1;//原始值

  var b = a;//生成一份拷贝给变量 b

  b = 2;//与 a 无关

  alert(a);//输出 1

  引用值的赋值:

  复制代码 代码如下:

  var A= new Object();//引用值

  A.x = 1;

  var B = A;//引用赋值,指向同一个内存处

  B.x = 2;//修改 B 将影响 A

  alert(A.x);//输出 2

  参数传递

  现在我们来看看传递两种类型的值给函数形参时时怎么处理的。

  1.传递原始值

  复制代码 代码如下:

  var a = 1;

  function test(m) {

  m = 2;

  }

  test(a);

  alert(a);//输出 1

  输出为1,所以我们知道函数只是将变量的值传递进去了,所以在函数体内的 m 得到传来的值1,再被赋值为2,这个过程不影响外部的变量 a。

  2.传递引用值

  复制代码 代码如下:

  var A= new Object();

  A.x = 1

  function test(M) {

  M.x = 2;

  }

  test(A);

  alert(A.x);//输出 2

  输出为2,所以我们知道函数将变量的地址传递进去了,所以函数体内的 M 得到传递来的地址,因此属性 x 被赋值为2的同时也会影响指向同一内存地址的 A。

  总结

  现在再回到开篇的问题:

  复制代码 代码如下:

  var a = 'test';

  var b = function() {};

  b.a = 'test';

  function change(m, n) {

  m = 'change';

  n.a = 'change';

  }

  change(a, b);

  变量 a 为原始值,变量 b 为引用值,传递进函数体内一个为值,一个为地址,所以函数运行后,变量 a 不会改变,而变量 b 的值将会改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值