JavaScript如何动态获取函数参数对象的键列表?
动态获取函数解构参数键列表并校验必填项
问题
我通过对象传递函数参数(因参数数量较多),但JavaScript不支持Python那样的命名参数。我需要检查所有参数都已传入有效值,因此要遍历参数键列表(比如['foo', 'bar', 'baz']),但不想硬编码该列表——如何通过编程方式动态获取这些解构参数的键名?
示例代码:
function run({foo, bar, baz}) { const requiredKeys = ['foo', 'bar', 'baz']; // <- 需动态生成此列表 for (const key in requiredKeys) { if (arguments[key] === null) throw `Please provide a value for ${key}` } console.log('done:', foo, bar, baz); } run({ foo: 1});
解决方案
方法1:解析函数字符串提取解构键
通过将函数转为字符串,用正则匹配出解构对象中的键名,适合常规解构场景:
function run({foo, bar, baz}) { // 提取函数的解构参数部分 const funcStr = run.toString(); const match = funcStr.match(/\{([^}]+)\}/); if (!match) throw new Error('函数参数需为对象解构形式'); // 处理提取到的键,去除空格并转为数组 const requiredKeys = match[1].split(',').map(key => key.trim()); // 校验每个必填项是否存在且不为 null/undefined const params = arguments[0] || {}; for (const key of requiredKeys) { if (params[key] === undefined || params[key] === null) { throw `Please provide a value for ${key}`; } } console.log('done:', foo, bar, baz); } run({ foo: 1, bar: 2, baz: 3 }); // 正常执行 // run({ foo: 1 }); // 抛出错误:Please provide a value for bar
方法2:用Symbol标记缺失参数结合键提取
给解构参数设置唯一默认值(Symbol),再结合字符串解析的键列表检查未传入项:
const MISSING = Symbol('missing'); function run({foo = MISSING, bar = MISSING, baz = MISSING}) { // 提取解构键列表 const funcStr = run.toString(); const match = funcStr.match(/\{([^}]+)\}/); const requiredKeys = match[1].split(',').map(item => item.split('=')[0].trim()); // 检查是否有参数使用了默认的MISSING标记 for (const key of requiredKeys) { if (this[key] === MISSING) { throw `Please provide a value for ${key}`; } } console.log('done:', foo, bar, baz); }
方法3:Schema定义式校验(高可维护性)
提前定义参数结构Schema,既用于校验也能动态获取必填键列表,适合参数复杂的场景:
const runSchema = { foo: { required: true }, bar: { required: true }, baz: { required: true } }; function run(params) { // 从Schema中提取必填键列表 const requiredKeys = Object.keys(runSchema).filter(key => runSchema[key].required); // 校验必填项 for (const key of requiredKeys) { if (params[key] === undefined || params[key] === null) { throw `Please provide a value for ${key}`; } } // 解构参数使用 const {foo, bar, baz} = params; console.log('done:', foo, bar, baz); }
注意事项
- 函数字符串解析方法依赖
toString()输出格式,生产环境使用时需注意代码压缩工具是否会破坏函数字符串结构; - Symbol标记法更安全,但需结合键提取避免重复编码;
- Schema方式可读性和扩展性最好,适合参数多、校验规则复杂的场景。
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

