概念

在JavaScript中调用函数时,传递的实际参数是将数据进行拷贝,并拷贝到形式参数中,进行使用。

例子1:基本类型的数据

  1. function demo2(n){
  2. n=3;
  3. }
  4. let num =1;
  5. demo2(num);
  6. console.log(num);//1

最终输出为1,因为调用函数时会将实际参数里保存的数据进行拷贝放入形式参数中,而num保存的数据就是栈里空间的1,所以形式参数n保存的数据就是1,并且n是一个变量,所以在栈里是单独的内存空间。而对n进行赋值为3后,改变了n变量在栈里空间的 数据,但不会影响到num变量对应空间的数据。

例子2:引用类型的数据

  1. function demo(obj){
  2. obj.name ='张三';
  3. obj = {};
  4. obj.name="赵六";
  5. };
  6. let o = {name:"王五"};
  7. demo(o);
  8. console.log(o.name);//张三

最终输出”张三”。因为值传递的关系,在调用demo(o)时,会将变量o保存的数据进行拷贝到形式参数中,而变量o保存的是对象在堆中的地址。所以形式参数obj也是将对象在堆中的地址保存在栈里的新空间中。也就是说obj和o目前是指向的同一个对象。而改变了obj.name=”张三”,也会反映在变量o中。而执行obj={}后,obj就保存的是另一个对象在堆中的地址了,也就是obj和o是指向不同的对象了,所以这时候执行obj.name=”赵六”并不会影响变量o对应的对象。

  1. function demo3 (obj) {
  2. obj.n = n;
  3. n = 2;
  4. obj = {};
  5. }
  6. let a = {};
  7. let n = 3;
  8. demo3(a);
  9. console.log(a);//{n:3}
  10. console.log(n);//2