JavaScript函数参数是形参占位符,不校验类型和数量;调用时按顺序绑定实参,多传或少传不报错,未传参数值为undefined;ES6支持默认参数,箭头函数无arguments但可用剩余参数,参数传递统一为值传递(基本类型传副本,对象传引用地址副本)。

函数定义语法和参数占位符怎么写
JavaScript 函数定义时,参数名只是形参占位符,不校验类型也不限制数量。调用时传入的实参按顺序绑定到形参,多传或少传都不会报错,只是值为 undefined。
-
function foo(a, b)中的a和b是形参,仅用于函数体内引用 - 调用
foo(1)时,b的值是undefined;调用foo(1, 2, 3)时,3被忽略(除非用arguments或剩余参数捕获) - ES6 支持默认参数:
function bar(x = 0, y = 'hello'),当实参为undefined时才触发默认值
箭头函数怎么传参?和普通函数有啥区别
箭头函数没有自己的 this、arguments、super 或 new.target,参数定义方式更紧凑,但语义上更严格。
- 单个参数可省括号:
x => x * 2;多个或零个必须加括号:(a, b) => a + b或() => console.log('hi') - 不能用
arguments对象,要用剩余参数替代:(...args) => args.length - 没有
caller和callee,无法在函数内获取调用栈信息
参数传递是值传递还是引用传递
JavaScript 统一按「值传递」,但这个“值”对基本类型是数据副本,对对象类型是引用地址的副本——所以修改对象属性会反映到外部,但重新赋值不会。
- 传数字、字符串、布尔值:
let n = 5; fn(n);→ 函数内改n = 10不影响外部n - 传数组或对象:
let obj = {x: 1}; fn(obj);→ 函数内obj.x = 99会影响外部,但obj = {y: 2}不会 - 想彻底隔离对象,需手动深拷贝,比如用
structuredClone(obj)(现代环境)或JSON.parse(JSON.stringify(obj))(简单场景)
常见传参错误和调试建议
很多运行时问题其实源于参数预期和实际不符,比如忘记解构、误把 Promise 当值传、或混淆回调函数签名。
立即学习“Java免费学习笔记(深入)”;
- 调用
setTimeout(fn, 1000, arg)时,arg是作为fn的第一个实参传入的,不是setTimeout的第三个参数被忽略 - 使用
fetch().then(cb),cb接收的是Response实例,不是 JSON 数据;要链式调用.json()才能拿到解析后的对象 - 解构传参容易漏默认值:
function handle({id, name} = {}) {...}必须设默认空对象,否则传undefined会报错
函数参数本身不复杂,但 JS 的隐式转换、作用域链、以及异步上下文会让实际行为偏离直觉。最常出问题的不是“怎么写”,而是“传进去的到底是什么”。











