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语句-A
    b
    ,用于
    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}});