JavaScript不同類型的區(qū)分

Value function typeOf
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object
new RegExp("meow") RegExp object
{} Object object
new Object() Object object
null Object object
undefined undefined

所有可以通過構(gòu)造函數(shù)創(chuàng)建的對(duì)象都可以用 instanceof 檢查類型

Object.prototype.toString.call(x) 來檢查x的類型灸拍,可以區(qū)分Boolean, Number, String, Function, Array, Date, RegExp, Object, Error等等。

Javascript中有5種基本類型(除了symbol,es6中增加了symbol類型)征懈,以及對(duì)象類型留攒,相信很多朋友像我一樣,用了很久的js還是有點(diǎn)分不清怎么判斷一個(gè)數(shù)據(jù)的類型。

typeof 運(yùn)算符:

// Numbers
console.log(typeof 37 === 'number');
console.log(typeof 3.14 === 'number');
console.log(typeof Math.LN2 === 'number');
console.log(typeof Infinity === 'number');
console.log(typeof NaN === 'number'); // 盡管NaN是"Not-A-Number"的縮寫,意思是"不是一個(gè)數(shù)字"
console.log(typeof Number(1) === 'number'); // 不要這樣使用!
  
// Strings
console.log(typeof "" === 'string');
console.log(typeof "bla" === 'string');
console.log(typeof (typeof 1) === 'string'); // console.log(typeof返回的肯定是一個(gè)字符串
console.log(typeof String("abc") === 'string');  //不要這樣使用!
  
// Booleans
console.log(typeof true === 'boolean');
console.log(typeof false === 'boolean');
console.log(typeof Boolean(true) === 'boolean'); // 不要這樣使用!
  
// Symbols
console.log(typeof Symbol() === 'symbol');
console.log(typeof Symbol('foo') === 'symbol');
console.log(typeof Symbol.iterator === 'symbol');
  
// Undefined
console.log(typeof undefined === 'undefined');
console.log(typeof blabla === 'undefined'); // 一個(gè)未定義的變量,或者一個(gè)定義了卻未賦初值的變量
  
// Objects 使用Array.isArray或者Object.prototype.toString.call方法可以從基本的對(duì)象中區(qū)分出數(shù)組類型
console.log(typeof {a:1} === 'object');
console.log(typeof [1, 2, 4] === 'object');
console.log(typeof /^[a-zA-Z]{5,20}$/ === 'object');
console.log(typeof {name:'wenzi', age:25} === 'object');
console.log(typeof null === 'object');//true
  
// 下面的容易令人迷惑白魂,不要這樣使用!
console.log(typeof new Boolean(true) === 'object');
console.log(typeof new Number(1) === 'object');
console.log(typeof new Date() === 'object');
console.log(typeof new String("abc") === 'object');
console.log(typeof new Error() === 'object');
  
// 函數(shù)
console.log(typeof function(){} === 'function');
console.log(typeof Math.sin === 'function');

通過上面例子我們可以很明顯的看到上岗,除了基本類型以外的類型福荸,都是對(duì)象,但是有例外:null 的 typeof 值是 'object' 【坑1】, 函數(shù)的 typeof 值是 'function' ! (函數(shù)對(duì)象的構(gòu)造函數(shù)是 Function肴掷,也就繼承了 Function 的原型)【坑2】敬锐,NaN 的類型也是 'number'【坑3】

注意:本文的測(cè)試在現(xiàn)在最新瀏覽器上進(jìn)行,老版本瀏覽器可能有所不同呆瞻。比如Safari 3.X中typeof /^\d*$/;為'function'【坑4:兼容性復(fù)雜】台夺。

不是所有對(duì)象都是返回 object,而且還有 null 搗亂痴脾,那我們?nèi)绾闻袛嘁粋€(gè)值的類型呢

instanceof運(yùn)算符: instanceof又叫關(guān)系運(yùn)算符颤介,可以用來判斷某個(gè)構(gòu)造函數(shù)的prototype屬性是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上

var str = new String("hello world");
console.log(str instanceof String);//true
console.log(String instanceof Function);//true
console.log(str instanceof Function);//false

constructor屬性 在使用instanceof檢測(cè)變量類型時(shí),我們是檢測(cè)不到number, 'string', bool的類型的

function Person(){
  
}
var Tom = new Person();
  
console.log(Tom.constructor === Person);//true

Object.prototype.toString.call

使用toString()方法來檢測(cè)對(duì)象類型

function Type() { };
  
var toString = Object.prototype.toString;
console.log(toString.call(new Date) === '[object Date]');//true
console.log(toString.call(new String) ==='[object String]');//true
console.log(toString.call(new Function) ==='[object Function]');//true
console.log(toString.call(Type) ==='[object Function]');//true
console.log(toString.call('str') ==='[object String]');//true
console.log(toString.call(Math) === '[object Math]');//true
console.log(toString.call(true) ==='[object Boolean]');//true
console.log(toString.call(/^[a-zA-Z]{5,20}$/) ==='[object RegExp]');//true
console.log(toString.call({name:'wenzi', age:25}) ==='[object Object]');//true
console.log(toString.call([1, 2, 3, 4]) ==='[object Array]');//true
//Since JavaScript 1.8.5
console.log(toString.call(undefined) === '[object Undefined]');//true
console.log(toString.call(null) === '[object Null]');//true

Array.isArray() 用于確定傳遞的值是否是一個(gè) Array

// 下面的函數(shù)調(diào)用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鮮為人知的事實(shí):其實(shí) Array.prototype 也是一個(gè)數(shù)組赞赖。
Array.isArray(Array.prototype); 

// 下面的函數(shù)調(diào)用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });
instanceof 和 isArray

當(dāng)檢測(cè)Array實(shí)例時(shí), Array.isArray 優(yōu)于 instanceof,因?yàn)锳rray.isArray能檢測(cè)iframes.
通過如下代碼可以創(chuàng)建該方法

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末买窟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薯定,更是在濱河造成了極大的恐慌,老刑警劉巖瞳购,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件话侄,死亡現(xiàn)場離奇詭異,居然都是意外死亡学赛,警方通過查閱死者的電腦和手機(jī)年堆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盏浇,“玉大人变丧,你說我怎么就攤上這事【铌” “怎么了痒蓬?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攻晒。 經(jīng)常有香客問我,道長班挖,這世上最難降的妖魔是什么鲁捏? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任萧芙,我火速辦了婚禮给梅,結(jié)果婚禮上包帚,老公的妹妹穿的比我還像新娘婴噩。我一直安慰自己羽德,他們只是感情好几莽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布章蚣。 她就那樣靜靜地躺著,像睡著了一般姨夹。 火紅的嫁衣襯著肌膚如雪纤垂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天磷账,我揣著相機(jī)與錄音峭沦,去河邊找鬼。 笑死逃糟,一個(gè)胖子當(dāng)著我的面吹牛吼鱼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绰咽,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼菇肃,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了取募?” 一聲冷哼從身側(cè)響起琐谤,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玩敏,沒想到半個(gè)月后斗忌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旺聚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年飞蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻屈。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陈哑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惊窖,我是刑警寧澤刽宪,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站界酒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毁欣。R本人自食惡果不足惜庇谆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凭疮。 院中可真熱鬧饭耳,春花似錦、人聲如沸执解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衰腌。三九已至新蟆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間右蕊,已是汗流浹背琼稻。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饶囚,地道東北人帕翻。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像坯约,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莫鸭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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