|
|
|
|
|
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
是一個一元運算,放在一個運算數(shù)之前,運算數(shù)可以是任意類型。它返回值是一個字符串,該字符串說明運算數(shù)的類型。
你知道下面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
是一個一元運算符,它返回的結果始終是一個字符串,對不同的操作數(shù),它返回不同的結果。
具體的規(guī)則如下:
1、對于數(shù)字類型的操作數(shù)而言, typeof
返回的值是 number
。比如說:typeof(1)
,返回的值就是number
。
上面舉的是常規(guī)數(shù)字,對于非常規(guī)的數(shù)字類型而言,其結果返回的也是number
。比如typeof(NaN)
,NaN
在JavaScript中代表的是特殊非數(shù)字值,雖然它本身是一個數(shù)字類型。
在JavaScript中,特殊的數(shù)字類型還有幾種:
以上特殊類型,在用typeof
進行運算進,其結果都將是number
。
2、對于字符串類型, typeof
返回的值是 string
。比如typeof("123")
返回的值是string
。
3、對于布爾類型, typeof
返回的值是 boolean
。比如typeof(true)
返回的值是boolean
。
4、對于對象、數(shù)組、null
返回的值是 object
。比如typeof(window)
,typeof(document)
,typeof(null)
返回的值都是object
。
5、 對于函數(shù)類型,返回的值是 function
。比如:typeof(eval)
,typeof(Date)
返回的值都是function
。
6、如果運算數(shù)是沒有定義的(比如說不存在的變量、函數(shù)或者undefined
),將返回undefined
。比如:typeof(sss)
、typeof(undefined)
都返回undefined
。
看完了六條規(guī)則,再回頭看一下,是不是很簡單了。
JavaScript數(shù)據(jù)類型是非常簡潔的,它只定義了6種基本數(shù)據(jù)類型。
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"
你會發(fā)現(xiàn):JavaScript解釋器認為null
是屬于object
數(shù)據(jù)類型的一種特殊形式,而function(){}
是function
類型,也就是說函數(shù)也是一種基本數(shù)據(jù)類型,而不是對象的一種特殊形式。
實際上,在JavaScript中,函數(shù)是一個極容易引起誤解或引發(fā)歧義的數(shù)據(jù)類型,它可以是獨立的函數(shù)類型,又可以作為對象的方法,也可以被稱為類或構造器,還可以作為函數(shù)對象而存在等。