如何使用字符串调用eval函数?含特定格式字符串调用咨询
关于使用
eval()调用字符串表达式的问题解答 嘿,我来帮你搞定这两个关于eval()的问题,还有你贴的那段混淆代码的事儿~
问题1:如何使用字符串调用eval函数?
其实eval()函数本身就是专门用来执行字符串形式的JavaScript代码的,用法特别直接:
- 直接把字符串表达式传给
eval()就行,比如:// 直接传入字符串表达式 const result1 = eval("2 + 3 * 4"); console.log(result1); // 输出14 // 也可以先把字符串存在变量里再传 const mathExpr = "Math.sqrt(16) + 5"; const result2 = eval(mathExpr); console.log(result2); // 输出9
⚠️ 注意哈:eval()存在安全风险,如果执行的是不可信来源的字符串,可能会被注入恶意代码,所以非必要尽量别用它,能用其他方法(比如Function构造函数、或者直接解析表达式)替代的话更好。
问题2:如何将TwoOneFourSeven ^ EightFiveNine这类字符串作为参数调用eval函数?
这个字符串里的数字是用英文单词连写的,eval()可识别不了这些单词,得先把它们转换成阿拉伯数字才行,步骤如下:
- 先创建一个数字单词与阿拉伯数字的映射表,把每个数字单词对应到对应的数字;
- 拆分字符串里的连写数字单词,把每个单词转换成数字后拼接成完整的阿拉伯数字;
- 保留原字符串里的运算符,最后把处理好的字符串传给
eval()。
直接上代码示例:
const targetStr = "TwoOneFourSeven ^ EightFiveNine"; // 定义数字单词到阿拉伯数字的映射 const numWordMap = { Zero: 0, One: 1, Two: 2, Three: 3, Four: 4, Five: 5, Six: 6, Seven: 7, Eight: 8, Nine: 9 }; // 处理字符串:拆分数字单词→转数字→拼接,保留运算符 const processedExpr = targetStr.replace(/([A-Za-z]+)/g, match => { // 拆分连写的首字母大写的数字单词 const singleNumWords = match.match(/[A-Z][a-z]+/g); // 把每个单词转成数字再拼接 return singleNumWords.map(word => numWordMap[word]).join(''); }); // 现在processedExpr就是"2147 ^ 859",调用eval执行 const finalResult = eval(processedExpr); console.log(finalResult); // 输出按位异或的结果:1300
这里的^是JavaScript里的按位异或运算符,如果你的意思是数学里的次方运算,得把^替换成**或者Math.pow()哦~
关于你贴的那段混淆代码
你贴的这段是典型的JavaScript混淆压缩代码(大概率是用Packer工具生成的),它的逻辑是通过一个自执行函数解密出真实的可执行代码,然后交给eval()执行。不过你贴的代码是不完整的(末尾的...截断了),如果要运行它,需要拿到完整的代码。
如果想解密这段代码,你可以把完整代码复制到浏览器控制台或者Node.js环境里运行,eval()会自动执行这个混淆函数,输出解密后的真实代码;也可以手动分析:里面的y函数是一个进制转换工具,把数字转成36进制字符,后面的逻辑是构建替换表,把占位符替换成真实的代码字符,最终得到可执行的JavaScript代码。
内容的提问来源于stack exchange,提问作者Александр Зосимчук
相关产品推荐
相关产品推荐

