直接呼叫Number原型上的方法,如下:
10.toString();
會報錯:Uncaught SyntaxError: Invalid or unexpected token
但是,浮點數(shù)直接呼叫就不會出錯
10.1.toString();//"10.1"
看到有這樣的解釋:
數(shù)字字面量直接呼叫方法,只要能夠讓JavaScript引擎不混淆小數(shù)點和物件的點運算符,各種寫法都能用,JavaScript會把第一個點理解成小數(shù)點(即10.0),把第二個點理解成呼叫物件屬性,從而得到正確結(jié)果。
例如以下的呼叫方式都是正確的
(10).toString(2)
10..toString(2) // "1010"
10 .toString(2) // "1010"
10.0.toString(2) // "1010"
10['toString'](2) // "1010"
但是並不懂這裡面的作用原理。
自己一開始猜測是括號或點號運算子優(yōu)先權(quán)的原因,把10先轉(zhuǎn)成了number嗎?
可是覺得這個不能解釋的通。
請問大家為什麼直接對整數(shù)呼叫原型方法會出錯,浮點數(shù)就不會?
為什麼透過以上列出的方式就可以對整數(shù)的原型方法進行呼叫?
看到有這樣的解釋:數(shù)字字面量直接呼叫方法,只要能讓JavaScript引擎不混淆小數(shù)點和物件的點運算符,各種寫法都能用,JavaScript會把第一個點理解成小數(shù)點(即10.0),把第二個點理解成呼叫物件屬性,從而得到正確結(jié)果。
我的看法:只要點的意思不歧義,編譯器就能正確理解。
很明顯加了括號,欽點了後面的 .
是 點運算符
不存在兩個小數(shù)點的數(shù)字,因此這裡也是指 點運算符
所以這個 10..toString(2) 其實可以歸結(jié)為下面一個
浮點數(shù)後面的點一定不再是指小數(shù)點了,而是指 點運算符
obj[key] 這樣可以在 obj 找名字為key的屬性。
原因在於編譯器看到這個會有兩種解讀:
1. (10.0).toString();
2. 10 .toString();
編譯原理,當(dāng)引擎開始解析數(shù)字的時候,.
是合法的,所以會優(yōu)先考慮為小數(shù)點。上面的幾個解決方案都是告訴解析器“數(shù)字讀完了”,開始讀下個 token 。