eval会把参数中的大括号视作复合语句的标识

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会按照如下步骤解析:

  1. 第一个冒号成了“标签声明”标识符;
  2. (“标签声明”的左操作数)name成了标签;
  3. “MyName”成了字符串直接量;
  4. value成了一个变量标识符;
  5. 第二个冒号不能合理地作语法分析,出现语法分析期异常;
  6. ……

 

试着执行如下代码:

alert(eval('{value:1}')); //1

 如果加上小括号,就可以返回对象了:

alert(eval('({value:1})')); //对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值