昨天給同事一起玩耍,同事給我出了一道代碼題目,是關於typeof的,感覺挺好玩的,在此分享給大家,順便鞏固下自己對typeof知識點的總結。如有不對,請給予指出,共同進步。
代碼是這樣的:
<!DOCTYPE html> <head> <title>typeof</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> </head> <body> <script> var a= a||null; var b= c||null; var c= typeof f; console.log(a); console.log(b); console.log(c); </script> </body> </html>
那麼,你說運行該代碼,chrome調試器會打印什麼呢?
請看,效果圖
為什麼會出現這個結果呢?
首先分析上圖中的兩個null
因為Javascript在執行代碼之前,會先預解析(hoisting)。
什麼是預解析(hoisting)呢?
就是在JavaScript中,你可以在函數的任何位置聲明多個var語句,它們就像在函數的頂部聲明一樣發揮作用,且會給var聲明的變量賦予一個undefined的初始值。這種行為我們稱之為預解析(hoisting)。
所以呢,在執行以上代碼前,Javascript會首先將所有的var變量(a,b,c)預解析(hoisting),當執行a||null時,a是undefined的,又因為是||運算,所以結果就是null咯。
c||null是一個道理。
再來看看,為什麼typeof f會是undefined呢?f都沒定義,不應該會報錯嗎?
是的,倘若我們去使用一個未定義的變量,浏覽器是會報錯的。
但是,當用typeof去判斷一個未定義的變量,將返回undefined。
那typeof判斷值類型時,是個怎麼機制呢?總結如下:
1、 對於數字類型的值,typeof會返回number,注意:NaN也是一個數字類型,因為它在JavaScript中代表的是特殊非數字值。
2、 對於字符串類型的值,typeof會返回string。
3、 對於布爾類型的值,typeof會返回boolean。
4、 對於對象,數組,null而言,typeof會返回object
5、 對於函數類型而言,typeof返回function
6、 如果運算數沒有定義(不存在或未賦值),將會返回undefined。