Javascript eval是邪恶的,但它有缺陷吗?
如果我运行这个:Javascript eval是邪恶的,但它有缺陷吗?,javascript,jquery,json,eval,Javascript,Jquery,Json,Eval,如果我运行这个: eval('{ear: {"<=": 6}}'); 返回以下字符串: “{”ear:{”Main{}被解析为 尝试用括号括起来: eval('({ear: {"<=": 6}})'); 它没有缺陷。要理解发生了什么,您需要理解解析器看到了什么类型的语句(从左到右) 一个简单的进入它的方法是玩一个游戏 使用更简单的{“b”:4}将得到相同的异常。它被解析为a中的“b”:4。这不是有效的javascript。没有适合您的AST树。。。 但是,这是由于{}语句内部出
eval('{ear: {"<=": 6}}');
返回以下字符串:
“{”ear:{”Main
{}
被解析为
尝试用括号括起来:
eval('({ear: {"<=": 6}})');
它没有缺陷。要理解发生了什么,您需要理解解析器看到了什么类型的语句(从左到右) 一个简单的进入它的方法是玩一个游戏
{“b”:4}
将得到相同的异常。它被解析为a中的“b”:4
。这不是有效的javascript。没有适合您的AST树。。。
但是,这是由于{}
语句内部出现异常造成的。这是一个BlockStatement
.AST树:{b:4}
将被理解为b:4
,一个有效的js语句-Ab
,用于4
,解析为({b:4}
将被理解为一个对象声明,其b
属性等于4
ECMAScript 2015 关于: 块:{StatementList} 就其本身而言: Eval创建了一个新的
领域
,它被解析为一个语句
序列(一个语句列表
),它又有块语句
作为第一个选项。这个必须以{/code>开头(见上文),所以如果你用括号(({})将它括起来
)它不能是块语句
…但是如果它匹配为块语句
它必须是块语句
以下章节中的旁注:
表达式语句不能以U+007B(左曲括号)开头,因为这可能会使它与块不明确
需要计算对象文字符号。分配变量时会发生这种情况:
var a = {ear: {"<=": 6}};
var a={ear:{”JSON.stringify不会返回与第一行相同的字符串。(您的第一行不是有效的JSON,因为没有引用第一个键名。)您是否尝试将第一行的结果分配给变量?var x=eval(…)
这是因为eval
尝试使用指令块。您没有定义对象。这或nnnn都是正确的。不同的是,请注意JSON中“ear”周围的引号。Stringif我认为您对eval()
的功能感到困惑。它尝试创建Javascript块,而不是JSON。类似于eval('{var ear={“如果你能找出为什么下面的变量没有给出错误,你会得到额外的分数:eval({ear:{nose:6}}')
(如果你想得到提示,请告诉我。)非常有趣。你能告诉我为什么主{}解析为块作用域?为什么它在paranthesis中解析为object?你是说这是一个对运算符的通用攻击吗?出于同样的原因,你也需要将这些自调用匿名函数用括号括起来。@Thilo,我的评论对吗?如果我的评论对,那么你的答案肯定是正确的。如果不是,你能解释一下吗在我看来,为什么我的评论错了?你确定吗?eval({b:4}')
返回4。这是因为“b:”是一个标签。块的计算结果是最后一个表达式的值,即4。关于标签:
$.parseJSON(JSON.stringify(foo))
function evalJSON(text) {
return eval("(" + text + ")");
}
eval('({ear: {"<=": 6}})');
//object
var user = {
name: "John",
age: "32"
};
//block
{
let a = 5;
console.log(a);
}
//object:
var a = {};
console.log({});
return {};
({});
//block:
function(){}
for(k in o){}
{}
var a = {ear: {"<=": 6}};
({ear: {"<=": 6}});