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

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

引用赋值

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

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

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

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引用造成影响,改变数组对象可以。

参数传递

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}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlwaysWM丶

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值