javascript - 為什么數(shù)組Array可以直接調(diào)用方法,而普通的Object對象卻不行?
問題描述
比如我們可以這樣數(shù)組排序:
[1,2,3].sort()
卻不能這樣調(diào)用對象的方法:
{}.toString()
還有,為什么字符串可以直接調(diào)用方法,Number類型、Boolean類型卻不行。
字符串我了解一些,調(diào)用字符串方法的時候會生成一個臨時的String對象,Number、Boolean類型為啥不行?
問題解答
回答1:這不和eval()解析’{}’道理一樣,js解析代碼會優(yōu)先把{看成和function{}的大括號一樣,會分開解析先解析{(開始),在解析}(結(jié)束)。這樣的話當(dāng)然會報錯了。而eval()解析’{}’時是怎么辦的,加個括號’({})’;這樣就會把{}看成一個整體來解析,這時候它就是對象了。至于“為什么字符串可以直接調(diào)用方法,Number類型、Boolean類型卻不行”Boolean類型可以呀,至于數(shù)字不能直接調(diào)用方法,那也是js解析的原因,比如
8.toString()//報錯(8).toString()// 正確8.0.toString()// 正確
那為什么呢,因為js中不存在真正的整數(shù),整數(shù)都是用浮點數(shù)表示的,所以當(dāng)js解析8是發(fā)現(xiàn)后面還有.于是會把8.看成一個數(shù),這樣的話沒加.的toString當(dāng)然錯了。所以如果寫成下面這樣也可以
8..toString()// 正確回答2:
首先你的想法是錯誤的.普通的 Object 對象是可以調(diào)用方法的.如
var o = {};o.toString(); // OK
但是{}.toString()卻是出現(xiàn)語法錯誤,因為{}.toString()中的{}將會被看成一個語句塊,而不是對象直接量.因為 JavaScript 將從左到右解析{}.toString(),當(dāng)遇到{時,它將會看做一個語句塊的開始,之后遇到},語句塊結(jié)束,在遇到.將會發(fā)生語法錯誤.
而如果使用({}).toString()將可以正常工作.(注意包圍在{}兩邊的括號).因為當(dāng)解析({}).toString()時,首先遇到(,則將括號里面的部分看做表達(dá)式,得到一個空對象,因此對這個空對象執(zhí)行方法調(diào)用是合法的.
回答3:關(guān)于 {}.toString() 這個問題,有人已經(jīng)講得非常清楚了。是因為 js 引擎在解析時,會把{}當(dāng)成塊標(biāo)記。不過我表示也很奇怪,樓主說的問題,我在mac上試了幾個瀏覽器都沒有問題。
我想補(bǔ)充的是樓主的第二個問題,為什么字符串可以直接調(diào)用方法,Number類型、Boolean類型卻不行。 我想,你應(yīng)該是哪里搞錯了。
var num = 1.2333;var flag = true; console.log({}.toString()) //[object, object]console.log(num.toFixed(2)); //1.23console.log(flag.toString()); //’true’ 這里是字符串
這里,num是個數(shù)值字面量,flag是個布爾值,它們倆都可以調(diào)用方法。樓主對字符串了解一些,那應(yīng)該明白,基本類型的數(shù)據(jù)本來就沒有屬性和方法的,只有對象才擁有。
但是為什么我們又可以像調(diào)用對象的方法一樣來調(diào)用基本數(shù)據(jù)類型的方法呢?(如: ’a bc’.trim())
是因為,基本數(shù)據(jù)類型的值在調(diào)用方法時,js 會將其轉(zhuǎn)為一個臨時包裝對象。字符串直接量就可以像字符串對象(new String(’abc’))一樣調(diào)用屬性和方法,數(shù)值字面量就可以像數(shù)值對象一樣調(diào)用屬性和方法。
當(dāng)然,這個臨時包裝對象只在代碼執(zhí)行的這一瞬間存在。方法執(zhí)行完畢,這個臨時對象就立即銷毀。
所以樓主說的,Number, Boolean類型的值不可以調(diào)用方法是不可能的。
