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

FREAKFILTH發表於2017-02-24

Read the original


前言

typeof運算子在JavaScript中用來判斷一個資料的型別,它返回一個字串。比如,我們想知道123的資料型別,我們可能這樣寫:

typeof 123複製程式碼

它會返回123的資料型別,那麼應該是"number"。除了"number",typeof運算子還會返回其他6種結果:

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運算子究竟是怎樣運作的。

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的值不相等,因為它們不能用兩個相同的數字來表示。

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

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

對陣列使用typeof會得到"object"。在JavaScript中, 陣列其實是一個物件,只是擁有一些特殊的行為和能力。比如,陣列擁有Array.prototype.length屬性,它將會返回陣列有多少個元素。陣列也有一些特殊的方法,比如:Array.prototype.push()Array.prototype.unshift()(可以參考JavaScript陣列方法)。

區別陣列和物件,我們可以使用Array.isArray()方法:

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"。

喜歡本文的朋友可以關注我的微信公眾號,不定期推送一些好文。

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

本文由Rockjins Blog翻譯,轉載請與譯者聯絡。否則將追究法律責任。

相關文章