从解释器角度看就很明白了。
从左往右:
1..a
先遇到1,表示是一个数字,
1后面一个“.”,解释成浮点数"1.",再遇到点,表示对象属性访问。所以,"1..a"表示((1.0).a),即将1.0看成对象,获取它的a属性。

对于1.1.b,同理,表示数字对象1.1的属性b。

所以两者都输出undefined。

另外,你可能还明疑惑,为什么 "1.a"就报错。这其实自己想想就能想通。"1.a"是表示"1"对象的a属性还是 "1."和"a"并列写错了呢?因为这是有歧义的。
同样"1.toString()"也会报错,但你写在"1 .toString()"就不报错了,因为中间加了空格,不会再产生歧义,toString()前面加一个点,则表示是调用对象方法,而普通的调用名为toString的函数,在前面加点就错了。

在ECMAScript规范里,有相关的语法单元的格式

takumi answered 12 years ago

Your Answer