注:栈内存应该是先进后出的,图示的顺序可能有点问题
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。
以上内容全是个人见解,欢迎大神斧正!