JavaScript函数参数到底是采用值传递还是引用传递呢?

356 阅读1分钟

前言

我先上结论:JavaScript函数参数采用值传递。这时候可能有人马上举出一个反例,比如:

  function set(obj){
    obj.a = 123;
  }
  
  let obj = {};
  set(obj);
  
  console.log(obj.a) //123

这“显然”跟值传递的结果不一样了,不急,且听我慢慢道来

值传递与引用传递概念

  1. 值传递:在函数调用时,函数内部实际使用的参数会复制一份到函数中,这样函数内部改变参数值的时候,不会影响外部传入参数的值。
  2. 引用传递:函数调用时,会将参数的地址传入到函数中,函数内部改变参数值,会影响到外部传入参数的值。

为什么说JavaScript是采用值传递

还是来看示例:

function set(obj1){
  obj1.a = 123;
  
  obj1 = new Object(); //将obj的地址指向一个新的内存地址
  obj1.a = 456;
}

let obj = {};
set(obj);
  
console.log(obj.a) //123

这时候输出的obj.a依旧为123,说明函数内部的obj1跟外部的obj实际上不是完全一致的。实际上,内部的obj1是在函数内部进行了复制,只是由于对象是引用类型,obj1与obj指向了同一个地址,obj1与obj是不同的两个变量,当改变obj1指向时,只改了函数内部obj1的指向,并不会将外部的obj的指向改变。