首頁  >  問答  >  主體

javascript - 為什麼陣列Array可以直接呼叫方法,而普通的Object物件卻不行?

例如我們可以這樣數組排序:

[1,2,3].sort()

卻不能這樣呼叫物件的方法:

{}.toString()

還有,為什麼字串可以直接呼叫方法,Number型別、Boolean型別卻不行。

字串我了解一些,呼叫字串方法的時候會產生一個暫時的String對象,Number、Boolean型別為啥不行?

phpcn_u1582phpcn_u15822663 天前1308

全部回覆(3)我來回復

  • 欧阳克

    欧阳克2017-07-05 11:07:29

    這不和eval()解析'{}'道理一樣,js解析程式碼會優先把{看成和function{}的大括號一樣,會分開解析{(開始),在解析}(結束)。這樣的話當然會報錯了。
    eval()解析'{}'時是怎麼辦的,加個括號'({})';這樣就會把{}看成一個整體來解析,這時候它就是對象了。
    至於「為什麼字串可以直接呼叫方法,Number型別、Boolean型別卻不行」
    Boolean型別可以呀,
    至於數位不能直接呼叫方法,那也是js解析的原因,例如

    8.toString()//报错
    (8).toString()// 正确
    8.0.toString()// 正确
    

    那為什麼呢,因為js中不存在真正的整數,整數都是用浮點數表示的,所以當js解析8是發現後面還有.於是會把8.看成一個數,這樣的話沒加.toString當然錯了。
    所以如果寫成下面這樣也可以

    8..toString()// 正确

    回覆
    0
  • 学习ing

    学习ing2017-07-05 11:07:29

    首先你的想法是錯誤的.普通的 Object 物件是可以呼叫方法的.如

    var o = {};
    o.toString(); // OK

    但是{}.toString()卻是出現語法錯誤,因為{}.toString()中的{}將會被看成一個語句塊,而不是物件直接量.
    因為JavaScript 將從左到右解析{}.toString(),當遇到{時,它將會看做一個語句塊的開始,之後遇到},語句塊結束,在遇到.將會發生語法錯誤.

    而如果使用({}).toString()將可以正常工作.(注意包圍在{}兩邊的括號).
    因為當解析({}).toString()時,首先遇到(,則將括號裡面的部分看做表達式,得到一個空對象,因此對這個空對象執行方法調用是合法的.

    回覆
    0
  • 高洛峰

    高洛峰2017-07-05 11:07:29

    關於 {}.toString() 這個問題,有人已經講得非常清楚了。是因為 js 引擎在解析時,會把{}當成塊標記。不過我表示也很奇怪,樓主說的問題,我在mac上試了幾個瀏覽器都沒問題。

    我想補充的是樓主的第二個問題,為什麼字串可以直接呼叫方法,Number型別、Boolean型別卻不行。 我想,你應該是哪裡搞錯了。

    var num = 1.2333;
    var flag = true;
                
    console.log({}.toString())   //[object, object]
    console.log(num.toFixed(2));  //1.23
    console.log(flag.toString()); //'true'   这里是字符串

    這裡,num是個數值字面量,flag是個布林值,它們兩個都可以呼叫方法。樓主對字串了解一些,那應該明白,基本類型的資料本來就沒有屬性和方法的,只有物件才擁有。

    但是為什麼我們又可以像呼叫物件的方法一樣來呼叫基本資料型別的方法呢? (如: 'a bc'.trim())

    是因為,基本資料型別的值在呼叫方法時,js 會將其轉為一個臨時包裝物件。字串直接量就可以像字串物件(new String('abc'))一樣呼叫屬性和方法,數值字面量就可以像數值物件一樣呼叫屬性和方法。

    當然,這個臨時包裝物件只在程式碼執行的這一瞬間存在。方法執行完畢,這個臨時物件就立即銷毀。

    所以樓主說的,Number, Boolean類型的值不可以呼叫方法是不可能的。

    回覆
    0
  • 取消回覆