『翻譯』"typeof null 是什麼?" 以及其它讓咱們感到困惑的 JavaScript 類型

Read the originaljavascript


前言

typeof運算符在JavaScript中用來判斷一個數據的類型,它返回一個字符串。好比,咱們想知道123的數據類型,咱們可能這樣寫:java

typeof 123複製代碼

它會返回123的數據類型,那麼應該是"number"。除了"number",typeof運算符還會返回其餘6種結果:git

typeof 123 // "number"

typeof "abc" // "string" 

typeof true // "boolean" 

typeof {a: 1} // "object" 

typeof function foo() {} // "function" 

typeof undefined // "undefined" 

typeof Symbol('foo') // "symbol"複製代碼

從上面的例子中能夠看出,typeof運算符使用十分簡單。可是,這只是不多的一部分案例,它們很容易讓人誤解和混淆typeof運算符到底是怎樣運做的。github

typeof typeof 123是什麼類型?

typeof typeof 123 //"string"複製代碼

typeof運算符返回的值是什麼類型?好的,typeof操做符老是以字符串的形式返回傳遞給它的值的數據類型。若是去獲取typeof計算後返回的值,好比一個數字,它將會是"number"。這意味着,不管結果是什麼類型,咱們去判斷一個typeof [any operand],永遠都是返回字符串。數組

typeof NaN是什麼類型?

typeof NaN  //"number"複製代碼

NaN表明某個值不是一個數字,但出乎意料的是,它是"number"類型。緣由是這樣的,在計算機內部,NaN是以數字類型儲存的。然而,它是一個不能用實際數字來表示的數值類型的值。因此它叫「Not a Number」,這並不意味着它不是數值類型。相反,它意味着這個值不能用數值表示。微信

這也解釋了爲何NaN的值都不相等。好比:函數

const NaN1 = 2 * "abc";  
const NaN2 = 2 * "abc";

NaN1 === NaN2 // false複製代碼

上面兩個NaN的值不相等,由於它們不能用兩個相同的數字來表示。oop

typeof [1, 2, 3]是什麼類型?

typeof [1,2,3] // "object"複製代碼

對數組使用typeof會獲得"object"。在JavaScript中, 數組實際上是一個對象,只是擁有一些特殊的行爲和能力。好比,數組擁有Array.prototype.length屬性,它將會返回數組有多少個元素。數組也有一些特殊的方法,好比:Array.prototype.push()Array.prototype.unshift()(能夠參考JavaScript數組方法)。ui

區別數組和對象,咱們可使用Array.isArray()方法:spa

Array.isArray( [1,2,3] ) // true 
Array.isArray( { a: 1 } ) // false複製代碼

typeof null是什麼類型?

typeof null // "object"複製代碼

null的值從技術上來講和objectnumber同樣,都是最基本的值,按理來講,null的類型也應該是"null"。然而並不是如此,由於JavaScript最初設計時出了一點意外。

在JavaScript最初設計時,一個值有兩個部分組成:它的類型標籤和實際的值。有5個類型標籤可使用,並且對象類型的引用指向0null的值始終指向NULL指針,它在大部分平臺都是用0x00來表示。因爲這種類似性,null就用過0類型標籤來表示,因此符合對象的引用。

typeof class Foo {}是什麼類型?

typeof class Foo {} // "function"複製代碼

最後,咱們講一下類(Classes)。類在ES6中的介紹是:一個更好的語法爲原型繼承服務。在將類以前,咱們先建立一個可繼承的對象,咱們要用到函數。

function Dog() { };
Dog.prototype.bark = function() {
  alert('woof!');
}

const snoopy = new Dog();
snoopy.bark(); //alert('woof!');複製代碼

使用類,咱們能夠用一樣的方式建立一個相似的對象:

class Dog {  
    bark() {
        alert("woof!");
    }
}

const snoopy = new Dog();  
snoopy.bark() // alert("woof!")複製代碼

然而,JavaScript的類只是一個被語法糖包裹的函數方法。實際上建立了一個一樣的函數,可是做者的寫法不一樣,只是看起來個簡潔。這就是爲何typeof一個類,獲得的仍然是"Function"。

喜歡本文的朋友能夠關注個人微信公衆號,不按期推送一些好文。

本文由Rockjins Blog翻譯,轉載請與譯者聯繫。不然將追究法律責任。

相關文章
相關標籤/搜索