Javascript小括号“()”的多义性

评论

2042330

#1楼

2011-03-08 18:17

仰光

还有 控制运算符优先级.

回复 引用 查看

#2楼

2011-03-09 10:25

franky

第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

snandy

@franky

讲的太给力了,谢谢!

回复 引用 查看


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值