-- W e l c o m e t o N o k e y _ b l o g --

Javascript的语法歧义之点“.”

1月 21 2015

###为什么会有语法歧义呢?
语法歧义可以说伴随着语言特性而具有的不可避免的东西,直译字面意思就能理解,无非是说一句话,会被理解为不同的意思。有一个比较典型的例子就是:if-if-else。那么面对语法歧义,人可以有多种理解,但是对于机器就只能有一种解释,这样才能编译。通常,编译器面对刚提到的if-else歧义采取的都是就近原则

###JS中也具有语法歧义,而且会导致意想不到的结果:
那是在一个月黑风高的夜晚,闲来无聊,就到群里潜水,只见群里关于对象属性的获取方法讨论的不亦乐乎,突然有人提到了2..String(),身为小伙伴的我瞬间被惊呆了,这是哪门子语法?然后在console里面试了一下,输出了“2”,当时很惊奇,按照惯性思维,肯定就以为会报错,2.toString()才会输出“2”,因为2会转换为Number对象,那么就具有了toString()方法,调用方法就输出这样的结果了,但仔细想想,并不是这么回事。

在 Javascript 中,2的数据类型属于直接量,它不具备任何方法,所以用.操作符调用方法是没意义的,那么为什么2..toString()会输出结果呢?这就要归功于JS的解释器了,这也就进入了咱们今天的主题了,具有语法歧义的操作符.:

.在JS中出现的地方有两个:一个是浮点数,一个是对象的属性读取操作符。所以,歧义就出现了。一个数字后面出现第一个.的以后,它看起来意义是不明确的,它是小数还是对象成员的操作符呢?

(10.)toString(); // invalid syntax

但是如果紧接着你再键入一个.的时候,就代表着属性读取的操作,像这样:

(10.).toString();

这样就是合法的语句了,因为JS解释器会对这个小数进行一个临时的数据封装,可以通过2..constructor可以看出这个临时对象是Number,但是它并不具备真正Number的所有方法,我测试了一下,可以调用的属性有:

2..constructor;
2..toString();
2..toLocaleString();
2..valueOf();

以上只是自己的一些愚见,欢迎大家留言讨论啦!