JavaScript数组解构用作函数参数时的异常问题
展开空数组导致参数位置异常的原因及解决方法
你遇到的问题核心是展开空数组...[]不会产生任何参数占位,它相当于完全不传递对应位置的参数。
看你的代码:
test(...[], 2, 3);
这里...[]展开后没有任何值,所以实际传递的参数顺序是:第一个参数是2,第二个是3,第三个参数根本没传,所以three是undefined,而one是2,这和你预期的完全相反。
你的需求是把数组作为单个函数参数传递(不管数组空还是只有一个对象),那根本不需要用展开语法,直接把数组作为参数传进去就行:
正确写法示例
场景1:函数需要接收数组作为第一个参数
// 函数第一个参数接收数组 let test = (arr, two, three) => { console.log('数组参数:', arr); // 空数组或者单个对象的数组 if (three === undefined) { console.log("3 is undefined"); } }; // 直接传数组,不用展开 test([], 2, 3); // 输出: // 数组参数: [] // 3 is undefined
场景2:希望数组元素填充第一个参数(空数组时第一个参数为undefined)
如果你的函数原本设计是让数组元素填充第一个参数,空数组时第一个参数为undefined,那要把展开的数组放在参数的第一个位置:
let test = (one, two, three) => { console.log('one:', one); // 数组为空时是undefined console.log('two:', two); // 2 console.log('three:', three); // 3 }; // 把要展开的数组放在第一个参数位置 test(...[], 2, 3); // 输出: // one: undefined // two: 2 // three: 3
关键总结
- 展开空数组不会生成任何参数,相当于跳过对应位置的参数传递
- 如果要把数组作为单个参数传递,直接传数组,不要用展开语法
- 如果要让数组元素填充指定参数位置,确保展开的数组放在对应的参数顺序位置
内容的提问来源于stack exchange,提问作者nathan-w
相关产品推荐
相关产品推荐

