You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中重新赋值函数参数是否存在问题或安全风险?

你这段代码的写法其实已经避开了「重赋值函数参数」的绝大多数核心风险,不过仍然有几点可以优化的地方,也给你理清楚这个规则的适用场景:


为什么大家说不要重赋值函数参数

这个规范的核心目的是规避两类常见问题:

  • 直接修改引用类型参数的属性/本身,会污染外部传入的原始变量,比如你没写address = { ...address }这一行,直接修改address.line1,外部调用时传入的原对象会跟着被修改,很容易产生排查难度很高的隐蔽bug
  • 重赋值参数会降低代码可读性,其他维护者看到参数中途被修改,需要额外花精力梳理参数的变化逻辑,非严格模式下还会导致arguments对象和参数值不同步的问题

你当前写法的合理性

你第一行就把参数重赋值为原对象的浅拷贝,后续所有修改都是在这个新生成的拷贝对象上执行,完全不会影响外部传入的原始对象,已经规避了上面说的最核心的副作用问题,实际运行不会有参数重赋值相关的故障。


仍然需要注意的隐患

  • 浅拷贝的局限性:如果后续你的address对象新增了嵌套的引用类型属性,修改这些嵌套属性仍然会影响原对象,当前只修改line1、city两个基础类型属性的场景下没有问题
  • 缺少边界校验:如果调用时传入的address是null/undefined,展开运算会直接抛出错误;如果line1/city为空值时调用toLowerCase()也会报错,建议加上兜底逻辑,比如可以改成:
function getAddress(address, lowerCase) {
  // 声明新变量存储拷贝,完全符合no-param-reassign规范
  const processedAddress = { ...(address || {}) }

  if (lowerCase) {
    processedAddress.line1 = processedAddress.line1?.toLowerCase() || ''
    processedAddress.city = processedAddress.city?.toLowerCase() || ''
  }

  return processedAddress
}
  • 如果要完全符合no-param-reassign的规范要求,只需要把重赋值参数的逻辑改成声明新变量即可,就像上面示例里的processedAddress,可读性也更高。

内容的提问来源于stack exchange,提问作者Jim Moody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:15:02