js形参传值原理

451 阅读1分钟

js形参传值有两种方式,值传递和地址传递,分别对应(对象类型、数组类型)和其他基础数据类型

例1:基础数据类型传参

function swip(num1, num2) {
  const temp = num1;
  num1 = num2;
  num2 = temp;
}

let num1 = 0;
let num2 = 1;
swip(num1, num2)
console.log("num1=", num1, "num2=", num2)  // num1= 0 num2= 1 ,原值未发生改变

例2:对象数据类型传参

function swipObjNum(obj1, obj2) {
  const temp = obj1.num;
  obj1.num = obj2.num;
  obj2.num = temp;
}

let obj1 = {
  num: 0
}
let obj2 = {
  num: 3
}

swipObjNum(obj1, obj2)
console.log("obj1.num=", obj1.num, "obj1.num=", obj2.num) 
// obj1.num= 3 obj2.num= 0 ,原对象的属性发生改变

例3:数组数据类型传参


function swipArrNum(arr1, arr2) {
  const temp = arr1[0];
  arr1[0] = arr2[0];
  arr2[0] = temp;
}

let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]

swipArrNum(arr1, arr2)
console.log("arr1[0]=", arr1[0], "arr2[0]=", arr2[0])
// arr1[0]= 4 arr2[0]= 1 ,原数组的元素发生改变

例4:字符串数据类型传参


function swipString(str1, str2) {
  const temp = str1;
  str1 = str2;
  str2 = temp;
}

let str1 = "黄"
let str2 = "红"

swipString(str1, str2)
console.log("str1=", str1, "str2=", str2)  // str1= 黄 str2= 红 ,原值未发生改变

结论:

1.形参为基础数据类型的函数,是拷贝形式传值,因此函数内的操作并不会影响到原对象的值

2.形参为《对象类型、数组类型》的函数,传递的是原对象的内存地址,因此原对象的属性会被函数内的操作所修改