如何不使用eval()将JavaScript对象字符串转换为可操作的JS对象
不使用eval()将类JS对象字面量字符串转为JS对象的方案
前置说明
你拿到的目标字符串属于非标准JSON格式的类对象字面量,包含未加引号的键、内置构造函数引用(如String),无法直接用JSON.parse()处理,以下是安全的转换方案:
具体实现步骤
- 第一步:预处理原始字符串,清除外层多余的包裹符号(示例中最外层的双引号、冗余的大括号),替换转义字符:
// 代入你的原始字符串 const rawStr = beforeMagic.replace(/^"{{/, '{').replace(/}}"$/, '}').replace(/\\"/g, '"');
- 第二步:为未加双引号的对象键补全双引号,同时标记内置构造函数关键字避免被转成普通字符串:
const processedStr = rawStr // 匹配未被引号包裹的键名,补全双引号 .replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g, '$1"$2":') // 标记常用内置构造函数,可按需求扩展更多标记规则 .replace(/"String"/g, '___STRING_FLAG___') .replace(/"Number"/g, '___NUMBER_FLAG___') .replace(/"Boolean"/g, '___BOOLEAN_FLAG___');
- 第三步:用
JSON.parse()安全转换为临时对象后,递归还原构造函数引用:
const tempObj = JSON.parse(processedStr); // 递归还原构造函数 function restoreConstructor(obj) { for (const key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null) { restoreConstructor(obj[key]); } else if (obj[key] === '___STRING_FLAG___') { obj[key] = String; } else if (obj[key] === '___NUMBER_FLAG___') { obj[key] = Number; } else if (obj[key] === '___BOOLEAN_FLAG___') { obj[key] = Boolean; } } return obj; } const afterMagic = restoreConstructor(tempObj);
效果验证
转换完成后得到的afterMagic完全符合目标对象格式,全程没有使用eval(),规避了任意代码执行的安全风险。
内容的提问来源于stack exchange,提问作者Sostene MUNEZERO BAGIRA
相关产品推荐
相关产品推荐

