js中的值传递与引用传递

js一共有六大数据类型。number string boolean object null underfind

要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型。

基本数据类型

基本的数据类型有:undefined,boolean,number,string,null。 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值。

var a = 10;
var b = a;
a = 20;
console.log(a);  //20
console.log(b);  //10
image.png

结论:这种赋值类似于拷贝了一份。a和b在 var b = a;后就再也没有关系了。互不影响。

引用赋值

引用类型指的是对象:js中的array和object。可以拥有属性和方法,并且我们可以修改其属性和方法。引用对象存放的方式是:在栈中存放变量名(该变量的值是堆中真实数据的指针(对象在堆中的存放地址)),在堆中存放数据(真正的数据)。

对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。


image.png

数组和对象赋值时的奇特现象

var a = [1,2,3];

var b = a;

a = [4,5,6];

alert(b); //[1,2,3]

好像数组是基本类型一样。。,但是:

var a = [1,2,3];

var b = a;

a.pop();

alert(b); //[1,2]

这是怎么回事?因为:(知乎解释)

a = [4,5,6];//改变的是a引用本身,没有改变数组对象,a和b没有了关系。简单点:在堆中开辟了内存0xx2 存放[4,5,6],而后a的值变成了0xx2,而之前堆中0xx1依旧存储着[1,2,3],b的值是0xx1,所以b不收a的影响。
a.pop();//改变的是数组对象,a引用没有改变。
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以。

作者:Intopass
链接:https://www.zhihu.com/question/26042362/answer/31903017
来源:知乎

参数传递

js的函数参数传递为值传递。

当传入的是 基本类型的参数时:就是复制了份内容给i而已,i与age之间没有关系。

function setAge(i)

{
alert(i);//24
i = 18;
alert(i);//18,i的改变不会影响外面的age
};

var age = 24;
setAge(age);
alert(age);//24
当传入的参数为引用类型时:

function setName(obj)

{
obj.name = 'haha';
};

var obj2 = new Object();
setName(obj2);
alert(obj2.name); // haha

这看起来很像是传递的是引用,因为obj.name受到改变了,但其实不是,其实还是值,因为obj2本身的值就是新对象的地址,所以传进去的就是这个地址。

这是阿里2014年的笔试题:

var a = 1;

var obj = {
b: 2
};
var fn = function () {};
fn.c = 3;

function test(x, y, z) {
x = 4;
y.b = 5;
z.c = 6;
return z;
}
test(a, obj, fn);
alert(a + obj.b + fn.c);
答案:12

首先test传递进去的实参中,a是基本类型(,复制了一份值),obj是object(指向地址,你动我也动),fn也当然不是基本类型啦。在执行test的时候,x被赋值为4(跟a没关系,各玩各的,a仍然为1),y的b被赋值为5,那obj的b也变为5,z的c变为6,那fn的c当然也会是6. 所以alert的结果应该是1+5+6 =12. (其实test不返回z也一样,z仍然改变的)。

思考:那怎么保证一个对象调用一个js方法(js方法会改变其中数据),又想之后使用调用方法前的对象呢?

var a = {name:1, value:2};
var b = JSON.parse(JSON.stringify(a));
b.name = 'mary';
console.log(a);  //{name: 1, value: 2}
console.log(b);  //{name: "mary", value: 2}

感谢

感谢原文作者:https://www.cnblogs.com/telnetzhang/p/5714920.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Js中按值传递和按引用传递 文章思路: js的数值类型(基本类型,引用类型)--数组是引用类型?--对象的参数传递...
    __越过山丘__阅读 1,019评论 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,736评论 1 45
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,842评论 2 17
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,330评论 0 7
  • 叶子的离开是对风的追求,还是树的不挽留? 我想,有时候就算叶子是对风的追求,也说不定只是因为风这个外界力量对它的诱...
    eleven_111阅读 525评论 0 1