能否在JavaScript中实现类似C语言宏的变量打印功能?
方案1:最推荐的最小改动实现(仅调用时加一层对象简写)
JavaScript本身不支持C语言那种编译期宏替换的能力,函数执行时无法直接拿到外部传入参数的原始变量名,最常用的低成本替代方案是利用ES6的对象简写语法:
// 函数定义 function logVar(wrapObj) { const [varName, varValue] = Object.entries(wrapObj)[0] console.log(`${varName} =`, varValue) } // 调用方式,仅比你期望的写法多一对大括号,不需要手写变量名字符串 const userSelectedAddressProvinceName = '浙江省' logVar({userSelectedAddressProvinceName})
执行后会直接输出:userSelectedAddressProvinceName = 浙江省,完全符合你要的效果,哪怕变量名再长也不需要额外重复输入。
甚至你连自定义函数都不用写,直接用console.log({变量名}),控制台会自动格式化输出键值对,日常调试足够用。
方案2:完全贴合logVar(xxx)调用写法的兼容方案(仅适合本地开发)
如果一定要严格实现logVar(abc)的调用形式,只能通过解析调用栈的方式实现,不适合生产环境使用,性能低且对压缩后的代码、同函数多调用的场景会失效:
function logVar(varValue) { // 解析错误栈获取调用行 const stackLines = new Error().stack.split('\n') // 根据运行环境调整索引,Node.js环境一般取stackLines[1],浏览器环境一般取stackLines[2] const callLine = stackLines[2] ?? stackLines[1] const varMatch = callLine.match(/logVar\((.+?)\)/) if (varMatch) { console.log(`${varMatch[1].trim()} =`, varValue) } else { console.log(varValue) } } // 调用完全符合预期写法 const abc = 123 logVar(abc) // 输出 abc = 123
该方案仅适合本地未压缩代码的调试场景,生产环境不要使用。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

