You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:27:02