开发者社区> 问答> 正文

js 内置eval函数问题? 400 报错

js 内置eval函数问题? 400 报错

在利用javascript内置的eval函数,将json格式的字符串转换成JS对象时,需要用一对"()"先将该字符串包住.这是为什么呢?,请大侠们说明原因及原理
例如:
将 var strTest='{"a":"b"}'; 转换成JS对象
正确写法:
var objTEST=eval("("+strTEST+")") ;
出错写法:
var objTEST=eval(strTEST);

展开
收起
爱吃鱼的程序员 2020-06-03 16:37:03 576 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    如果你不加(),那么js编译器会认为{}是一个代码块,而不是一个对象块,然后由于一个代码块里包含了:,就会报错了。

    你加了一个,js会默认识别这个为一个对象块,就变成一个json对象了。

    如果你非得不想加这个()

    你也可以尝试这样:

    var strTest = "var objTEST = {'a' : 'b'}";
    eval(strTest);
    console.log(strTest);

    这样也是可以执行的,但是灵活性就差很多了。所以还是推荐使用eval()中间加括号的方案

    另外也可以看这个:http://www.json.org/js.html

    ######
    eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
    需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:
    var code1='"a" + 2';    //表达式
    var code2='{a:2}';      //语句
    alert(eval(code1));     //->'a2'
    alert(eval(code2));     //->undefined
    alert(eval('(' + code2 + ')'));    //->[object Object]
            可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到,第二个alert语句输出的是undefined,而第三个加了括号后输出的是语句表示的对象。
    ######

    引用来自“JustForFly”的答案

    eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
    需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:
    var code1='"a" + 2';    //表达式
    var code2='{a:2}';      //语句
    alert(eval(code1));     //->'a2'
    alert(eval(code2));     //->undefined
    alert(eval('(' + code2 + ')'));    //->[object Object]
            可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到,第二个alert语句输出的是undefined,而第三个加了括号后输出的是语句表示的对象。

    谢谢“JustForFly”我明白了 

    ######表示感谢
    2020-06-03 20:50:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载