|
|
|
|
|
|
JavaScript判斷變量是否存在的方法中,typeof運算符是其中之一。但使用typeof來判斷變量是否存在時,需要特別謹慎,如本文將要介紹的情況,那么typeof就會產生誤判。
typeof運算符確定變量的類型,可以是以下值之一:'boolean', 'number', 'string', 'symbol', 'object','function'和'undefined'。
當變量未定義,typeof不會拋出ReferenceError,它返回的是undefined。

利用這個特性,我們可以用 typeof === undefined 來判斷某一變量是否存在。但是這不是絕對。

我們看到a已經有定義,但是typeof a還是undefined。因此,typeof === undefined 判斷變量是否存在就會存在誤判。
但是,當a已經賦值,typeof a就不是undefined了。

我們看到,當a有賦值時,typeof a返回的是變量的類型,而“類型”是前文說的'number','string'等。
通過對typeof各種情況的分析,結論是,當變量未定義,或變量已定義但未初始化時,typeof === undefined 判斷有效。我們用if語句來表示:
if (typeof myVar === 'undefined') {
// myVar (未定義) 或 (已定義但未初始化)
} else {
// myVar (已定義和已初始化)
}判斷變量是否存在,我們可以用try/catch,還可以用window.hasOwnProperty()等方法,這些我在前面文章3種方法JS判斷變量是否存在或已定義已經詳細舉例介紹過,可前往了解。
typeof是一個一元運算,放在一個運算數之前,運算數可以是任意類型。它返回值是一個字符串,該字符串說明運算數的類型。
你知道下面typeof運算的結果嗎?
typeof(1);
typeof(NaN);
typeof(Number.MIN_VALUE);
typeof(Infinity);
typeof("123");
typeof(true);
typeof(window);
typeof(document);
typeof(null);
typeof(eval);
typeof(Date);
typeof(sss);
typeof(undefined);
我們來試試看看結果:
alert(typeof(1)); // number
alert(typeof(NaN)); // number
alert(typeof(Number.MIN_VALUE)); // number
alert(typeof(Infinity)); // number
alert(typeof("123")); // string
alert(typeof(true)); // boolean
alert(typeof(window)); // object
alert(typeof(document)); // object
alert(typeof(null)); // object
alert(typeof(eval)); // function
alert(typeof(Date)); // function
alert(typeof(sss)); // undefined
alert(typeof(undefined)); // undefined
typeof是一個一元運算符,它返回的結果始終是一個字符串,對不同的操作數,它返回不同的結果。
具體的規則如下:
1、對于數字類型的操作數而言, typeof 返回的值是 number。比如說:typeof(1),返回的值就是number。
上面舉的是常規數字,對于非常規的數字類型而言,其結果返回的也是number。比如typeof(NaN),NaN在JavaScript中代表的是特殊非數字值,雖然它本身是一個數字類型。
在JavaScript中,特殊的數字類型還有幾種:
以上特殊類型,在用typeof進行運算進,其結果都將是number。
2、對于字符串類型, typeof 返回的值是 string。比如typeof("123")返回的值是string。
3、對于布爾類型, typeof 返回的值是 boolean 。比如typeof(true)返回的值是boolean。
4、對于對象、數組、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。
5、 對于函數類型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。
6、如果運算數是沒有定義的(比如說不存在的變量、函數或者undefined),將返回undefined。比如:typeof(sss)、typeof(undefined)都返回undefined。
看完了六條規則,再回頭看一下,是不是很簡單了。
JavaScript數據類型是非常簡潔的,它只定義了6種基本數據類型。
null,表示刪除該屬性。undefined。alert(typeof 1); // 返回字符串"number"
alert(typeof "1"); // 返回字符串"string"
alert(typeof true); // 返回字符串"boolean"
alert(typeof {}); // 返回字符串"object"
alert(typeof []); // 返回字符串"object "
alert(typeof function(){}); // 返回字符串"function"
alert(typeof null); // 返回字符串"object"
alert(typeof undefined); // 返回字符串"undefined"
你會發現:JavaScript解釋器認為null是屬于object數據類型的一種特殊形式,而function(){}是function類型,也就是說函數也是一種基本數據類型,而不是對象的一種特殊形式。
實際上,在JavaScript中,函數是一個極容易引起誤解或引發歧義的數據類型,它可以是獨立的函數類型,又可以作為對象的方法,也可以被稱為類或構造器,還可以作為函數對象而存在等。
