前言
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
的值從技術上來說和object
和number
一樣,都是最基本的值,按理來說,null
的型別也應該是"null"。然而並非如此,因為JavaScript最初設計時出了一點意外。
在JavaScript最初設計時,一個值有兩個部分組成:它的型別標籤和實際的值。有5個型別標籤可以使用,而且物件型別的引用指向0
。null
的值始終指向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翻譯,轉載請與譯者聯絡。否則將追究法律責任。