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
的值從技術上來講和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翻譯,轉載請與譯者聯繫。不然將追究法律責任。