js中的值传递与引用传递

来源:csdn博客 分类: 文章浏览史 发布时间:2021-03-27 16:59:03 最后更新:2021-03-27 浏览:149
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2021-03-27 16:59:03

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

php技术微信