请帮忙分析一下下面的代码:var s="{a:'111'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111而不是{a:'111'}?
alert(typeof c);//为什么是string而不是object?

解决方案 »

  1.   

    你用错了...eval<script>
        var s="{a:'111'}";
        alert(typeof s);
        eval("var c="+s); //这样用
        alert(c);
        alert(typeof c);
    </script>
      

  2.   

    不明白为什么不用eval('var c='+s);
      

  3.   

    你对eval的函数使用有误。你想用JSON串吧?如果要是,你这么就是错误的。下面给你写了一个例子。你可以看看。<script>
    function evalJSON(str){
    if(typeof str == 'string'){alert('===');
    return eval('(' + str + ')');
    }
    }var s="{'a':'111','b':'222',kk:3343}";
    alert(typeof s);
    var c = evalJSON(s);
    alert(c);
    alert(c.kk);//为什么是111而不是{a:'111'}?
    alert(typeof c);//为什么是string而不是object?
    </script>
      

  4.   

    谢谢楼上了!!!
    不过我还有个疑问:var s="{a:'111'}";
    alert(s);
    alert(typeof s);
    eval(s);
    alert(s);//为什么是{a:'111'}而不是[object,Object]?
    alert(typeof s);//为什么是string而不是object?
      

  5.   

    那这样举例吧
    var a=10;
    var c=a+100;
    alert(c)//110
    alert(a)//10你没进行赋值操作变量怎么会改变?
      

  6.   

    3楼,是我改写了你的例子。就是eval()函数你使用方法错误导致的。
    --- 结贴,给分 --- 
      

  7.   


    var s="{a:'111'}";
    alert(typeof s);
    var c=eval('['+s+']');//为什么这里的[]、()都可以生成对象{}却不可以呢?这里的括号是起什么作用?
    alert(c);
    alert(typeof c);
      

  8.   

    var s={a:'111'}; //{}括号代表 var s=new Object();
    []括号代表  = new Array()
      

  9.   


    var s="{a:'111'}";
    alert(s);
    alert(typeof s);
    var o=eval('['+s+']');
    alert(s);//为什么是{a:'111'}而不是[object,Object]?
    alert(typeof s);//为什么是string而不是object?
    alert(o);//为什么这里就是[object,Object]?
    alert(typeof o);//为什么这里就是object?
      

  10.   

    对,在json中,{}代表对象,[]代表数组
      

  11.   

    回复10楼, var s = "{a:'111'}"; 这本来就是个string 你没进行任何操作啊。
    var o=eval('['+s+']'); 你本来就用eval函数把'[' + s + ']'转换成对象了啊。这个不难理解吧?
      

  12.   

    alert(s);//为什么是{a:'111'}而不是[object,Object]?
    呵呵,你问的我都想笑。你对函数变量的作用域都没搞清楚,晕死!
    你看看,在你
    var o=eval('['+s+']');
    alert(s);//为什么是{a:'111'}而不是[object,Object]?
    的时候,你的变量s被赋予新的值了么?答案:没有。你的var o=eval('['+s+']');的作用是把字符串s通过函数eval()把新的值付给了新的变量 o 。而你原来的变量s的值没有变化啊。当然还是原来的值了。你的
    alert(o);//为什么这里就是[object,Object]?
    里面的o,是被eval函数传化了的。你的var s="{a:'111'}"; 去掉双引号就是一个hash,而eval函数的作用就是帮你去掉这个双引号,并且帮你把这个字符串传华为js的对象Object。要是还有疑问,请你去买本书,看看我的头像上面的图片,那本书,你看完了,基本的js就都可以应用了。
    哎,老兄,我服了你了
    -- 给分 --
      

  13.   

    十分感谢各位的好心!!!
    各位辛苦了!!!
    我也知道在JS的代码中
    {}括号代表 var s=new Object(); 就是一个空对象
    但是var c=eval('{'+s+'}');转化失败
    []括号代表  = new Array() ;也可以看作对象来对待
    var c=eval('['+s+']');转化成功
    ()在JS代码中不代表什么创建对象的方式吧?
    但是这里var c=eval('('+s+')');
    却能转化成功
    这究竟是为什么?
    还有就是
    var s="{a:'111'}";
    alert(typeof s);
    var c=eval(s);
    alert(c);//为什么是111,他把a扔到哪里了?
    alert(typeof c);
      

  14.   

    “但是这里var c=eval('('+s+')');“这个是你的原话。你明白里面为什么写'(' + s + ')'么? 里面的()这一个对括号是保证你的s的完整性,好像 (1 + 1)/2 == 1 ; 和 1 + 1/2 == 1.5 的道理一样。
    至于 
    var s="{a:'111'}";
    alert(typeof s);
    var c=eval(s);
    alert(c);//为什么是111,他把a扔到哪里了?
    alert(typeof c);
    这里的 a 就是一个key,明白否?而你这么写,js默认的就是这个表达式的值,而且是里面的元素只有一个的情况才会有这种情况,如果是2个元素呢?如果你这么写,你看,他就会报错了var s="{a:'111',b:'2222'}";
    alert(typeof s);
    var c=eval(s);
    alert(c);//为什么是111,他把a扔到哪里了?
    alert(typeof c);
      

  15.   


    var s="{a:'111',b:'2222'}";
    alert(typeof s);
    var c=eval(s);
    alert(c);//为什么是111,他把a扔到哪里了?
    alert(typeof c);这种情况会报错,而你写的var s="{a:'111'}";不报错。因为var s="{a:'111',b:'2222'}";再被eval转换之后,会有2个key,后面的alert()不知道该显示那个key对应的数值。而你写的,只有一个key,默认就把key:a 对应的数值显示了出来。你可以试一试。
      

  16.   

    小括号是保持字符串的完整性的话,倒还可以理解。
    那中括号也是保持字符串的完整性?
    如果中括号也是保持字符串的完整性可以的话,大括号保持字符串的完整性为什么就不可以?
     a既然是一个key的话,那就应该有对象存在吧?不是有key的也是对象吗?
    可是并没有看到什么对象存在啊?
      

  17.   

    建议你去看js的基础书籍吧。和你说,能把人气死。连点js的基础都不知道,就在这里提问。关键你提问的东西有价值么?你对js的基础都不理解,想凭借着提问来学习js?我也看了你在这个js论坛里面的好几个回复的跟帖,一眼就看出一点js基础都没有,就是在那里瞎猜。一切来源于动手实践,实践的理论在书上。先去看书,再来提问。才不至于问出和js没关的问题。
      

  18.   

    书籍看了不少,都是说eval的参数是一个可执行的字符串
    就像下面这样:
    eval('var c=100');//等价于var c=100
    或者eval('alert("hello")'););//等价于alert("hello")
    上面的赋值操作和函数调用是可执行的字符串,这很好理解。
    就是动态执行脚本的意思。
    书上和查到的资料都没有说可不可以使用小括号啊?
    见到的例子顶多也就是使用小括号包一下JSON字符串,
    还没有见到使用中括号包一下JSON字符串的。
    但是它确实是转化成功了啊!
      

  19.   

    俺觉得是 eval 对 大括号 滴解释有些问题,至少 lz 的问题就说明了这种情况!
      

  20.   

    eval 方法
    检查 JScript 代码并执行. eval(codeString)必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript 分析器进行分析和执行。说明
    eval 函数允许 JScript 源代码的动态执行。例如,下面的代码创建了一个包含 Date 对象的新变量 mydate :eval("var mydate = new Date();");
    传递给 eval 方法的代码执行时的上下文和调用 eval 方法的一样. 传递给 eval 方法的代码执行时的上下文和调用 eval 方法的一样.
    ——这句是关键,可见 eval 执行一个代码行或若干代码行,
    而如果是某行的部分代码,其执行结果就很难预测了,
    因为没有对 eval 滴返回值做明确说明,这也就是 lz 困惑所在!归根结底,还是用法滴问题!!!
      

  21.   

    俺建议,不要使用 eval 的返回值!举个例子就明白了L@_@K
    // -----------------------------------
    // 正确用法
    function test() {alert('123');}
    var s = "function test() {alert('123');}";
    alert(eval(s)); // undefinedalert(test); // function test() {alert('123');}
    test(); // 123// -----------------------------------
    // 错误用法
    /*
    function() {alert('123');}
    var s = "function() {alert('123');}";
    alert(eval(s)); // undefinedvar test = eval(s);
    alert(test); // undefined
    test(); // Error
    */
      

  22.   

    支持25楼!!!
    恩,就是啊!
    许多的文档只是说eval 执行一个代码行或若干代码行,
    由于JSON是这几年新的应用,就连eval把JSON解析为一个对象
    都没有怎么说清楚,至于括号的问题,连提都没有提,
    都是上来就是一大段代码,有有括号的,也有没有括号的。
    就是没有说明为什么使用小括号?
    至今还没有见到过使用中括号的,但是中括号确实也可以。
    还有就是从来没有见过清晰地解释eval的返回值是怎样的一种情况的
    所以才给我造成了这么大的困惑。
      

  23.   


    function test() {alert('123');}
    var s = "test";//test 代表一段可执行的代码
    alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? alert(test); // function test() {alert('123');}
    test(); // 123
      

  24.   

    如果说 eval(string) 里的string 是一段可执行的代码,那么函数名称是不是可执行的代码?为什么会出现下面的结果?
    function test() {alert('123');} 
    var s = "test";//test 代表一段可执行的代码 
    alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? function test() {alert('123');} 
    var s = test;//test 代表一段可执行的代码 比较上面,用不用引号都一样!!alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? alert(test); // function test() {alert('123');} 
    test(); // 123
      

  25.   

    m=12;
    n=m;
    alert(n);
    alert(eval("n=m"));
    alert(eval(n));//弹出 12 这儿为什么也能执行?
      

  26.   

    To #32 问题在于你对 js 中函数名的作用不了解,
    js 中函数名就是函数指针,执行时必须加()!L@_@K
    function test() {alert('123');} 
    var s = "test";//test 代表一段可执行的代码 
    alert(eval(s)); 
    // 弹出 function test() {alert('123');} 为 什么不执行? 
    // eval(s) 的结果 test,即函数指针,要执行必须加上小括号!
    eval(s)(); //123function test() {alert('123');} 
    var s = test;//test 代表一段可执行的代码 比较上面,用不用引号都一样!!
    alert(eval(s)); 
    // 弹出 function test() {alert('123');} 为 什么不执行? 
    // s 不是字符串,而是 函数指针 test,因此 eval(s) 就是 s,要执行必须加上小括号!
    eval(s)(); // 123alert(test); // function test() {alert('123');} 
    test(); // 123
      

  27.   

    疯了!!!疯了!!!彻底的让eval给整疯了!!!
    我感觉我今天踩上了JavaScript中最大的一颗地雷啊!!!
    砰的一声,就把我炸得粉身碎骨了!!!
    下面是我的一些测试结果,相信大家在看完以后
    也会......
    代码段1:eval参数不使用任何括号var s = "function test() {alert('123');}";
    var f1=eval(s);
    alert(f1);// IE:undefined&&&FF:一样
    alert(test);//IE:function test() {alert('123');}&&&FF:一样
    test(); // IE:123&&&FF:一样
    代码段2:eval参数使用小括号var s = "function test() {alert('123');}";
    var f2=eval('('+s+')');
    alert(f2);// //IE:undefined&&&FF:有定义function test() {alert('123');}
    alert(test);//IE:(function test() {alert('123');})两边加上了小括号&&&FF:无任何弹出窗口 
    test(); //IE:123&&&FF: 无任何弹出窗口代码段3:eval参数使用中括号var s = "function test() {alert('123');}";
    var f3=eval('['+s+']');
    alert(f3);// IE:&&&FF:都有定义function test() {alert('123');}
    alert(test);//IE:function test() {alert('123');}&&&FF:无任何弹出窗口 
    test(); // IE:123&&&FF: 无任何弹出窗口代码段4:eval参数使用大括号var s = "function test() {alert('123');}";
    var f4=eval('{'+s+'}');
    alert(f4);// IE:undefined&&&FF:一样
    alert(test);// IE:function test() {alert('123');}&&&FF:一样
    test(); // IE:123&&&FF:一样我的测试环境为IE6和Firefox3.5.3
    看来以后还是少用eval为好啊!!!
    请大家务必谨慎使用eval!!!
      

  28.   

    呵呵,按需使用,不必为eval而eval
      

  29.   

    eval执行的结果一次有效,生成的对象和方法不能通过外部方法再次调用,比如eval('function a(){alert('ok');}a();'); //ok

    eval('function a(){alert('ok');}');
    a();//看看是什么效果,这就是你"无任何弹出窗口"的原因
      

  30.   


    请先看清楚我的测试结果!!!
    像楼上这样eval("function a(){alert('ok');}");
    然后执行
    a(); //ok 
    两个浏览器都会弹出ok的。
    还有楼上的引号匹配有点问题。
      

  31.   

    我搞错了,呵呵,不好意思,我上次遇到这问题时,是用AJAX执行的,
    幸好今天又试了一下,不然一直错下去
      

  32.   

    我前些天发的贴子,也是eval的问题,
    http://topic.csdn.net/u/20091009/18/90f070dd-640b-4068-a62f-08a0c3fe6415.html
      

  33.   

    这是 {} 的二义性引起的.
    <script>
    var a;
    a = 1;alert(a);
    </script>上面是最简单的代码了, 没有什么凝问修改一下,加对 {}<script>
    {
    var a;
    a = 1;
    }
    alert(a);
    </script>觉得这时候  { ... } 这里引擎要怎么解释呢
    这时候 { ... }  跟 平时的 var xxx = { .... };  不一样
    这里的 { ... }  是语句块 block  跟出现在 while(*){...};  for(*){...}; if(*){...}else{...} 中的 {...} 是一样的
    所以执行上面这段代码,结果跟第一段一模一样,不会有什么问题.再修改一下, 变成下面的样子<script>
    {
    prop1: var a;
    prop2: a = 1;
    }
    alert(a);
    </script>
    是不是觉得,这代码会运行不了.
    不是的,这代码,执行结果跟上面的又是一模一样.
    javascript 支持标签语句的. 想起了么
    loop1: for ( ... ) {
        loop2: for( ... ) {
            ...
            break loop1;
        }
    }
    prop1 和 prop2 只充当 标签的作用而已
    再改一下:<script>
    {
    prop1: 1,
    prop2: 2
    }
    </script>符合 json 格式了, 引擎应该会把 { ... } 当成对象直接量了吧.
    还不是, 引擎仍把 { ... } 当语句块了, 结果:语法错误,在 prop1: 1 后面缺少 ; 分号
    那怎么样 才把 { ... } 当对象啊.
    当语句运算需要取值的时候, 出现 { ... } , 引擎就把它当对象了.比如 :   var xxx = { ... };   return { ... };   ({ ... }) 括号中的   数组元素定义中的{...}   实参列表中出现的{...}     等等
    这时候, 你应该能明白为什么 eval(" {  ...  } ");  会取不到对象了吧,  是因为被当成语句块了.   
    而 eval("{ a: 111 }")  得到 '111' 就是  a: '111' 这个标签语句的值. 
    而 {...} 在 () 运算符中时,会当成对象, 所以 eval("({a:'111'})") 得到 object
    而  [ ... ] , 这个很名显, 是数组定义.var s="{a:'111'}";
    alert(s);
    alert(typeof s);
    // 上面三个不会有什么疑问吧var o=eval('['+s+']');
    // 相当于 var o=eval("     [ { a:'111' } ]    ");  没有意见吧
    alert(s);//为什么是{a:'111'}而不是[object,Object]?
    alert(typeof s);//为什么是string而不是object?
    // s  都没改变过,  当然还是 字符串  "{a:'111'}"  了.alert(o);//为什么这里就是[object,Object]?
    //  o  就是 eval 出来的那个东东,  就是个数组来的呀,  数组当然就是  object  了.alert(typeof o);//为什么这里就是object?//不信的话, 还可以
    alert(o[0]);
    alert(typeof o[0]);
    alert(o[0].a);
    alert(typeof o[0].a);