js参数传递问题

注:栈内存应该是先进后出的,图示的顺序可能有点问题

1、js数据类型分类:基础类型和引用类型

2、参数分为:基础类型参数和引用类型参数

在js中所有类型的参数传递都是按值类型传递的

首先,先看一下基本数据类型和引用类型的赋值过程:

var a =1;var b=a;

在执行赋值语句执行之前栈内存是这样分配的:


在执行赋值语句之后:


而引用类型的赋值过程:
var obj=new Object();
var obj1=obj;
在执行赋值语句之前:


在执行赋值语句之后:


对象赋值之后,会先进行副本拷贝,两个对象的地址都指向同一段内存空间

obj1=new Object();
obj1.name="123";
console.log(obj.name);//undefined

原因:


obj和obj1所指向的地址并不相同了

那么 回到正题,js中的参数传递不论是基本类型还是引用类型,参数传递的过程和赋值过程是一样的,所以不论是基本数据类型还是引用类型的参数传递都是按值传递的。

eg:

console.log("==========test 函数参数都是按值传递的(引用类型的数据也是按照值来传递的)======================");
			function testOri(i){
				i=20;
				return i*2;
			}
			var num1=2;
			var result=testOri(num1);
			console.log(num1);
			console.log(result);
			console.log("=========================test 对象传递==========================");
			function setName(obj){
				obj.name="wky";
			}
			var person=new Object();
			setName(person);
			console.log(person.name);//wky
			function setNameObj(obj){
				obj.name="wky";
				obj=new Object();
				obj.name="wkyyc";
			}
			var person1=new Object();
			setNameObj(person1);
			console.log(person1.name);//wky
			function setNameObj1(obj){
				var p=new Object();
				p.name="wkyyc";
				obj=p;
			}
			var person2=new Object();
			setNameObj1(person2);
			console.log(person2.name);//undefined
			function setNameObj2(obj){
				var p=obj;
				return p;                                                                                                            
			}
			var person3=new Object();
			person3.name="wkyyc";
			var person4=setNameObj2(person3);
			console.log(person4.name);//wkyyc
			console.log(typeof person4);//Object
			console.log(person4===person3);//true   在内存中都指的同一段空间
			var a=new Object();
			a.name="wky";
			b=a;
			console.log(b.name);//wky
			var b=new Object();
			b.name="wkyyc";
			console.log(a===b);//flase
			console.log(a.name);//wky
			console.log(b.name);//wkyyc

ps:什么叫按引用传递? 
function test (obj){
     obj.name="123";
     obj=new Object();
     obj.name="123456";
}
var t=new Object();
console.log(t.name);//123

按引用传递:


当obj被重新赋予一个新对象时:


如果是按引用传递的话 最后t.name的值应该是123456,可是实际上并不是这样的因为是按照值传递的,最后t.name的值是123。




以上内容全是个人见解,欢迎大神斧正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值