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

如何使JavaScript变量testowy作为字符串正常用于eval函数?

解决拼接生成的Unicode转义字符串无法正常执行eval的问题

首先得搞清楚问题出在哪:你通过变量拼接得到的testowy,本质是包含Unicode转义序列的字符串字面量,而不是这些转义序列被解析后的实际字符。举个例子,代码里直接写"\u0061"会被JS引擎自动解析成字符'a',但动态拼接出来的testowy,它的实际内容是"\\u0061"(反斜杠被转义了)——也就是你看到的console.log输出的"\u0061\u006c..."其实是字符串的展示形式,背后存储的是带转义反斜杠的内容。

当你直接eval(testowy)时,相当于让JS执行一段包含\u0061这类转义序列的代码,但此时这些转义序列是作为字符串的一部分存在,不会被自动解析成对应字符,自然会报错。而你直接写eval("\u0061\u006c...")时,JS引擎在解析代码阶段就把转义序列转换成了alert(),所以能正常执行。

下面是两个可行的解决方法:

方法一:用JSON.parse解析转义序列

JSON的解析规则会自动处理Unicode转义序列,我们只需要给testowy加上双引号(符合JSON字符串的格式要求),再用JSON.parse转换:

// 给testowy包裹双引号,让它符合JSON字符串格式
const parsedCode = JSON.parse(`"${testowy}"`);
eval(parsedCode); // 此时会正常弹出alert框

方法二:手动解析Unicode转义序列

如果你不想依赖JSON,可以自己写一个函数来替换字符串中的\uXXXX转义序列:

function decodeUnicode(str) {
  // 匹配所有\u开头的四位十六进制转义序列
  return str.replace(/\\u([0-9a-fA-F]{4})/g, (match, hex) => {
    // 将十六进制字符串转换成十进制,再转成对应字符
    return String.fromCharCode(parseInt(hex, 16));
  });
}

const decodedCode = decodeUnicode(testowy);
eval(decodedCode); // 同样可以正常执行alert()

之前你尝试的eval(''+testowy+'')没用,是因为这种写法只是把testowy的内容原样传给eval,并没有处理里面的转义序列——转义后的反斜杠依然存在,JS还是无法把\u0061解析成a。

内容的提问来源于stack exchange,提问作者sieja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:17:27