所以為什么 JS 的 typeof 不需要括號(hào) (如何判斷數(shù)據(jù)類型)

JS 如何判斷數(shù)據(jù)類型

在 JS 中有許多中提供了幾個(gè)原生的判斷數(shù)據(jù)類型方法,本文主要介紹 JS 中的判斷基本數(shù)據(jù)類型的四個(gè)方法: typeof, instanceof, constructor, prototype

typeof

相信用 JS 的都肯定用過 typeof 來判斷一些基本類型尔觉,但可能很多人都會(huì)誤以為 typeof 是一個(gè)函數(shù)昭卓。

實(shí)際上 typeof 并不是一個(gè)函數(shù)骤星,也不是一個(gè)語句流强,而是一個(gè)一元運(yùn)算符(就像 ++, –, !)脑慧。

因?yàn)橐辉\(yùn)算符是可以用括號(hào)將運(yùn)算數(shù)包裹起來的抡驼,所以讓看起來非常想一個(gè)函數(shù),如 !(condition)

接下來回到正題晰奖,用 typeof 可以判斷哪幾種基本的數(shù)據(jù)類型呢

使用 typeof 判斷后返回的是 字符串 類型

  1. string 如果這個(gè)值是字符串
  2. number 如果這個(gè)值是數(shù)值
  3. boolean 如果這個(gè)值是布爾值
  4. function 如果這個(gè)值是函數(shù)
  5. object 如果這個(gè)值是對(duì)象谈撒、數(shù)組或 null
  6. undefined 如果這個(gè)值未定義

可以看到 typeof 并不能單獨(dú)的判斷出數(shù)組,而是將其判斷成對(duì)象匾南。當(dāng)然你可以使用 Array.isArray(ob) 來繼續(xù)對(duì) Object 進(jìn)行數(shù)組的判斷

console.log(typeof 1 === 'number')      // => true
console.log(typeof 'wjh' === 'string')  // => true
console.log(typeof false === 'boolean') // => true
console.log(typeof [] === 'object')     // => true
console.log(typeof {} === 'object')     // => true
console.log(typeof null === 'object')   // => true
console.log(typeof un === 'undefined')  // => true

instanceof

instanceof 運(yùn)算符用來判斷一個(gè)構(gòu)造函數(shù)的 prototype 屬性所指向的對(duì)象是否存在另外一個(gè)要檢測對(duì)象的原型鏈上啃匿,需要區(qū)分大小寫。( instanceof 不是函數(shù)蛆楞,是一個(gè)雙目運(yùn)算符如 +, -… )

需要注意的是溯乒,instanceof 只能用來判斷對(duì)象和函數(shù),不能用來判斷字符串和數(shù)字等豹爹。判斷它是否為字符串和數(shù)字時(shí)裆悄,只會(huì)返回false。

var arr = []
var obj = {}
var func = functino () { console.log('Hello world') }

console.log(arr instanceof Array)     // => true
console.log(obj instanceof Object)    // => true
console.log(func instanceof Function) // => true

console.log(1 instanceof Number)      // => false
console.log('str' instanceof String)  // => false

constructor

在 Javascript 中每一個(gè)具有原型的對(duì)象都擁有一個(gè) constructor 屬性 (Object.constructor)

constructor 屬性返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用臂聋。

constructor 可以判斷所有類型光稼,包括 Array

// String
var str = "字符串"
console.log(str.constructor) // function String() { [native code] }
console.log(str.constructor === String) // true

// Array
var arr = [1, 2, 3]
console.log(arr.constructor) // function Array() { [native code] }
console.log(arr.constructor === Array) // true

// Number
var num = 5;
console.log(num.constructor) // function Number() { [native code] }
console.log(num.constructor === Number) // true

// Object
var obj = {};
console.log(obj.constructor) // function Object() { [native code] }
console.log(obj.constructor === Object) // tru

但是或南, constructor在類繼承時(shí)會(huì)出錯(cuò)

function A(){};
function B(){};

var aObj = new A();

console.log(aObj.constructor === A);    //true;
console.log(aObj.constructor === B);    //false;

function C(){};

function D(){};

C.prototype = new D(); //C繼承自D

var cObj = new C();

console.log(cObj.constructor === C);    //false;
console.log(cObj.constructor === D);    //true;

prototype

以上三種方法多少都會(huì)有一些不能判斷的情況。為了保證兼容性艾君,可以通過 Object.prototype.toString 方法采够,判斷某個(gè)對(duì)象值屬于哪種內(nèi)置類型。

  • 需要注意大小寫
    console.log(Object.prototype.toString.call('字符串') === '[object String]')         // -------> true;
    console.log(Object.prototype.toString.call(123) === '[object Number]')              // -------> true;
    console.log(Object.prototype.toString.call([1,2,3]) === '[object Array]')           // -------> true;
    console.log(Object.prototype.toString.call(new Date()) === '[object Date]')         // -------> true;
    console.log(Object.prototype.toString.call(function a(){}) === '[object Function]') // -------> true;
    console.log(Object.prototype.toString.call({}) === '[object Object]')               // -------> true;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腻贰,一起剝皮案震驚了整個(gè)濱河市吁恍,隨后出現(xiàn)的幾起案子扒秸,更是在濱河造成了極大的恐慌播演,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伴奥,死亡現(xiàn)場離奇詭異写烤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拾徙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門洲炊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尼啡,你說我怎么就攤上這事暂衡。” “怎么了崖瞭?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵狂巢,是天一觀的道長。 經(jīng)常有香客問我书聚,道長唧领,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任雌续,我火速辦了婚禮斩个,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驯杜。我一直安慰自己受啥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布鸽心。 她就那樣靜靜地躺著滚局,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再悼。 梳的紋絲不亂的頭發(fā)上核畴,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音冲九,去河邊找鬼谤草。 笑死跟束,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丑孩。 我是一名探鬼主播冀宴,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼温学!你這毒婦竟也來了略贮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤仗岖,失蹤者是張志新(化名)和其女友劉穎逃延,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧拄,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揽祥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檩电。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄丰。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俐末,靈堂內(nèi)的尸體忽然破棺而出料按,到底是詐尸還是另有隱情,我是刑警寧澤卓箫,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布载矿,位于F島的核電站,受9級(jí)特大地震影響丽柿,放射性物質(zhì)發(fā)生泄漏恢准。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一甫题、第九天 我趴在偏房一處隱蔽的房頂上張望馁筐。 院中可真熱鬧,春花似錦坠非、人聲如沸敏沉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟迟。三九已至,卻和暖如春潦闲,著一層夾襖步出監(jiān)牢的瞬間攒菠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工歉闰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辖众,地道東北人卓起。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像凹炸,于是被迫代替她去往敵國和親戏阅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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