JavaScript基礎(chǔ)(三)typeof操作符

typeof操作符

typeof操作符返回一個字符串辱姨,表示未經(jīng)計算的操作數(shù)的類型

typeof operand
typeof (operand)
類型 結(jié)果
undefined "undefined"
null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol "symbol"
宿主對象(Js環(huán)境提供) Implementation-dependent
函數(shù)對象 "function"
其他對象 "object"
// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 盡管NaN是"Not-A-Number"的縮寫
typeof Number(1) === 'number'; // 但不要使用這種形式!

// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof總是返回一個字符串
typeof String("abc") === 'string'; // 但不要使用這種形式!

// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 但不要使用這種形式!

// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';

// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined'; 

// Objects
typeof {a:1} === 'object';

// 使用Array.isArray 或者 Object.prototype.toString.call
// 區(qū)分數(shù)組,普通對象
typeof [1, 2, 4] === 'object';

typeof new Date() === 'object';

// 下面的容易令人迷惑,不要使用戚嗅!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';

// 函數(shù)
typeof function(){} === 'function';
typeof class C{} === 'function'
typeof Math.sin === 'function';
typeof new Function() === 'function';

null

在 JavaScript 最初的實現(xiàn)中雨涛,JavaScript 中的值是由一個表示類型的標簽和實際數(shù)據(jù)值表示的。對象的類型標簽是 0懦胞。由于 null 代表的是空指針(大多數(shù)平臺下值為 0x00)替久,因此,null的類型標簽也成為了 0躏尉,typeof null就錯誤的返回了"object"蚯根。(reference)

使用new操作符

// All constructor functions while instantiated with 'new' keyword will always be typeof 'object'
var str = new String('String');
var num = new Number(100);

typeof str; // It will return 'object'
typeof num; // It will return 'object'

// But there is a exception in case of Function constructor of Javascript

var func = new Function();

typeof func; // It will return 'function'

語法中的括號

// Parentheses will be very much useful to determine the data type for expressions.
var iData = 99;

typeof iData + ' Wisen'; // It will return 'number Wisen'
typeof (iData + ' Wisen'); // It will return 'string'

正則表達式

對正則表達式字面量的類型判斷在某些瀏覽器中不符合標準:

typeof /s/ === 'function'; // Chrome 1-12 , 不符合 ECMAScript 5.1
typeof /s/ === 'object'; // Firefox 5+ , 符合 ECMAScript 5.1

暫存死區(qū)

塊級作用域 let const,在聲明之前進行typeof操作會拋出一個ReferenceError胀糜。塊級作用域在塊的頭部處于"暫時性死區(qū)“颅拦,知道被初始化,在這期間訪問變量會引發(fā)錯誤教藻。

例外

typeof document.all === 'undefined'

IE

在IE 6,7和8上距帅,很多宿主對象是對象而不是函數(shù)。例如:

typeof alert === 'object'

常見問題

1. typeof 的返回值總共有多少個括堤?

答:"number","string","boolean","undefined","object","function","symbol"這7個返回值

2. typeof 為什么要區(qū)分object和function碌秸?

答:函數(shù)在ECMAScript中是對象,不是一種數(shù)據(jù)類型悄窃,函數(shù)還包含一些特殊屬性哮肚,因此有必要使用typeof來區(qū)分。實際使用過程中有這個需求广匙。

3.typeof的不足之處有哪些

答:typeof操作符不能準確的區(qū)分對象允趟,數(shù)組,正則鸦致。返回值為"object"潮剪。部分早期瀏覽器版本對正則對象返回"function"涣楷。IE67中typeof alert //object,其他瀏覽器type alert //function

4.判斷下列表達式的值

typeof 1/0   //NaN
typeof (1/0)  //number
typeof typeof 1/0 // NaN
typeof typeof (1/0) // string
typeof (typeof 1/0) // number

5.用typeof來判斷對象的潛在陷阱是什么

答:JavaScript對于typeof []==='object',typeof null === 'object',typeof function(){}==='function',所以在使用typeof來做判斷時需要考慮這些情況抗碰。當然也可以選擇替代方法狮斗,Object.prototype.toString.call([])來進行判斷,返回值類似于[object Array],可以加上正則處理為 Object.prototype.toString.call([]]).replace(/\[object\s|\]/g,'')

參考資料:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弧蝇,一起剝皮案震驚了整個濱河市碳褒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌看疗,老刑警劉巖沙峻,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異两芳,居然都是意外死亡摔寨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門怖辆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是复,“玉大人,你說我怎么就攤上這事竖螃∈缋龋” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵特咆,是天一觀的道長蒋纬。 經(jīng)常有香客問我,道長坚弱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任关摇,我火速辦了婚禮荒叶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘输虱。我一直安慰自己些楣,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布宪睹。 她就那樣靜靜地躺著愁茁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亭病。 梳的紋絲不亂的頭發(fā)上鹅很,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音罪帖,去河邊找鬼促煮。 笑死邮屁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的菠齿。 我是一名探鬼主播佑吝,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绳匀!你這毒婦竟也來了芋忿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤疾棵,失蹤者是張志新(化名)和其女友劉穎戈钢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陋桂,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡逆趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗜历。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣渗。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梨州,靈堂內(nèi)的尸體忽然破棺而出痕囱,到底是詐尸還是另有隱情,我是刑警寧澤暴匠,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布鞍恢,位于F島的核電站,受9級特大地震影響每窖,放射性物質(zhì)發(fā)生泄漏帮掉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一窒典、第九天 我趴在偏房一處隱蔽的房頂上張望蟆炊。 院中可真熱鬧,春花似錦瀑志、人聲如沸涩搓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧甘。三九已至,卻和暖如春战得,著一層夾襖步出監(jiān)牢的瞬間充边,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工常侦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痛黎,地道東北人予弧。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像湖饱,于是被迫代替她去往敵國和親掖蛤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容