var jsonStr = $('#jsonData').val(); var json = eval('('+jsonStr+')');
上面两行代码出自《用js模拟PHP的print_r功能 》,用来把接收到的json串转换为js中的对象。既然json串已经是一个完美的对象直接量了,为什么非要在两端加上括号,为什么不能做如下简写呢?
var json = eval(jsonStr);
看了周爱民老师的《JAVASCRIPT语言精髓与编程实践 》P264的 5.2.2“动态执行过程中的语句、表达式与值”,才明白。
-----------
原因
-----------
eval把传入参数中的大括号视为一个复合语句的标识!比如
{name: "MyName", value:1}
eval会按照如下步骤解析:
- 第一个冒号成了“标签声明”标识符;
- (“标签声明”的左操作数)name成了标签;
- “MyName”成了字符串直接量;
- value成了一个变量标识符;
- 第二个冒号不能合理地作语法分析,出现语法分析期异常;
- ……
试着执行如下代码:
alert(eval('{value:1}')); //1
如果加上小括号,就可以返回对象了:
alert(eval('({value:1})')); //对象