评论
2042330
2011-03-08 18:17
还有 控制运算符优先级.
回复 引用 查看
2011-03-09 10:25
第5条说法不对.
首先不存在强制运算符这个说法.
这里应该仅是 分组运算符. 作用是优先级. 本质就是舍弃其他可能的多余的语法树.
第5条,之所以要这样做的原因是 {} 花括号二义性造成的.
eval('{a:1}')//不会抛出异常.
eval('{a:1,b:2}')//抛出异常
这并不是eval的错. 错误来自语法分析时, {}被当做 statement block,而不是一个 jsonobject.
所以.抛出异常是因为a:1被解析成lablestatement 了.那么它后面的 "," 逗号,就使得parser不得不停下来了.因为 逗号运算符不能出现在lablestatement后面.
所以
{
a:1,
b:2
}
在任何被解析为statement block的情况下.都将导致异常.
解决办法.把他们并入表达式.让parser使用 jsonobject的语法树.比如
({a:1,b:2})
1,{a:1,b:2}
+{a:1,b:2}
var a ={a:1,b:2}
等等等等...
说说为什么()不是强制运算符,因为它不具备这个功能.
分组运算符 同 delete typeof 等运算符类似. 不会对运算元.造成 getvalue() .
举个例子:
delete 玩笑; //不会抛出异常.
原因是运行时,执行到 delete 玩笑; 时, 并不会对标识符-玩笑,进行getvalue().
delete (玩笑);//同样不会抛出异常.
可见分组运算符() 并没有对 标识符 -玩笑 做额外的工作. 它仅仅是影响语法树的产生过程.
从ecma262的角度来看此问题亦如此. 这里涉及到 reference type 的base property 为null时的情况下,对其 getvalue()才抛出异常.
回复 引用 查看
#3楼[楼主]
2011-03-09 12:59
@franky
讲的太给力了,谢谢!
回复 引用 查看
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/