Skip to content

JS 函数参数的值传递 #23

@jtwang7

Description

@jtwang7

JS 函数参数的值传递

ECMAScript 中所有函数的参数都是按值传递的 —— 《高程3》

当函数参数是引用类型(例如对象或数组)时,上述理论仍旧是成立的。
JS 函数传参,本质上就是一个复制变量值的过程,将调用函数时外部环境的变量拷贝一个副本作用于函数内部作用域中。
对于原始类型,值复制后俩个变量完全独立,之后任何一方改变都不会影响另一方;
而对于引用类型,函数参数实际上复制的是引用(即指针),所以,任何一方改变都会映射到另一方。

我们可以把ECMAScript函数的参数想象成局部变量。在向参数传递基本类型的值时,被传递的值被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型时,会把这个值在内存中的地址(指针)复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

如何避免传递引用类型

  1. 在函数内部,进行一次深拷贝,并创建一个临时变量用于存储。
const obj = {
  a: 1,
  b: 2,
}

function (obj) {
  let tmp = deepCopy(obj) // deepCopy 表示为一个深拷贝函数
  // do something ...
}
  1. 在函数参数部分,对接收的对象进行解构赋值。
const obj = {
  a: 1,
  b: 2,
}

function ({a, b} = {}) {
  // do something ...
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions