如何使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
相关产品推荐
相关产品推荐

