js 比較typeOf辛蚊,instanceof粤蝎,constructor,袋马,prototype初澎,isPrototypeOf

如何判斷js中的類型呢,先舉幾個例子:
var a = "json";
var b = 123;
var c = true;
var d = [1,2,3];
var e = new Date();
var f = function(){
alert('jason');
};
一虑凛、最常見的判斷方法:typeof
typeof是一個一元運(yùn)算符碑宴,它返回的結(jié)果始終是一個字符串,對不同的操作數(shù)桑谍,它返回不同的結(jié)果延柠,另外typeof可以判斷function的類型;在判斷除Object類型的對象時比較方便锣披。
console.log(typeof a == "string"); //true
console.log(typeof a == String); //false
具體的規(guī)則如下:

  1. 對于數(shù)字類型的操作數(shù)而言贞间, typeof 返回的值是 number。比如說:typeof 1雹仿,返回的值就是number增热。
    上面是舉的常規(guī)數(shù)字,對于非常規(guī)的數(shù)字類型而言胧辽,其結(jié)果返回的也是number峻仇。比如typeof NaN,NaN在JavaScript中代表的是特殊非數(shù)字值邑商,雖然它本身是一個數(shù)字類型摄咆。
    在JavaScript中凡蚜,特殊的數(shù)字類型還有幾種:
    Infinity //表示無窮大特殊值
    NaN //特殊的非數(shù)字值
    Number.MAX_VALUE //可表示的最大數(shù)字
    Number.MIN_VALUE //可表示的最小數(shù)字(與零最接近)
    Number.NaN //特殊的非數(shù)字值
    Number.POSITIVE_INFINITY //表示正無窮大的特殊值
    Number.NEGATIVE_INFINITY //表示負(fù)無窮大的特殊值
    以上特殊類型,在用typeof進(jìn)行運(yùn)算進(jìn)吭从,其結(jié)果都將是number朝蜘。
  1. 對于字符串類型,typeof返回的值是string影锈。比如typeof "jason"返回的值是string芹务。
  2. 對于布爾類型,typeof返回的值是boolean鸭廷。比如typeof true返回的值是boolean枣抱。
  3. 對于對象、數(shù)組辆床、null返回的值是object佳晶。比如typeof {},typeof []讼载,typeof null返回的值都是object轿秧。
  1. 對于函數(shù)類型,返回的值是function咨堤。比如:typeof eval菇篡,typeof Date返回的值都是function。
  2. 如果運(yùn)算數(shù)是沒有定義的(比如說不存在的變量一喘、函數(shù)或者undefined)驱还,將返回undefined。比如:typeof undefined都返回undefined凸克。

console.log(typeof a); //string
console.log(typeof b); //number
console.log(typeof c); //boolean
console.log(typeof d); //object
console.log(typeof e); //object
console.log(typeof f); //function

console.log(typeof 1); //number
console.log(typeof NaN); //number
console.log(typeof Number.MIN_VALUE); //number
console.log(typeof Infinity); //number
console.log(typeof "123"); //string
console.log(typeof true); //boolean
console.log(typeof {}); //object
console.log(typeof []); //object
console.log(typeof null); //object
console.log(typeof eval); //function
console.log(typeof Date); //function
console.log(typeof undefined); //undefined

二议蟆、判斷一個對象是否為某一數(shù)據(jù)類型,或一個變量是否為一個對象的實例:instanceof

注意:1)instanceof 后面一定要是對象類型萎战,并且大小寫不能錯咐容,該方法適合一些條件選擇或分支。
2)instanceof 運(yùn)算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性蚂维。
語法:object instanceof constructor
參數(shù):object(要檢測的對象.)constructor(某個構(gòu)造函數(shù))
描述:instanceof 運(yùn)算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上戳粒。
console.log(d instanceof Array); //true
console.log(e instanceof Date); //true
console.log(f instanceof Function); //true

如果你想檢測對象的原型鏈上是否存在某個特定的原型對象,有沒有不適用構(gòu)造函數(shù)作為中介的方法呢虫啥?可以用isPrototypeOf() 方法
作用:檢測一個對象是否是另一個對象的原型享郊。或者說一個對象是否被包含在另一個對象的原型鏈中
例如:
var p = {x:1};//定義一個原型對象
var o = Object.create(p);//使用這個原型創(chuàng)建一個對象
p.isPrototypeOf(o);//=>true:o繼承p
Object.prototype.isPrototypeOf(p);//=> true p繼承自O(shè)bject.prototype

function Animal(){
    this.species = "動物";
 };
var eh = new Animal();
Animal.prototype.isPrototypeOf(eh)//=>true

三孝鹊、根據(jù)對象的constructor判斷:constructor
console.log(d.constructor === Array) //true
console.log(e.constructor === Date) //true
console.log(f.constructor === Function) //true
注意constructor在類繼承時會出錯
例如:
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;

而instanceof方法不會出現(xiàn)該問題,對象直接繼承和間接繼承的都會報true:
console.log(cObj instanceof C); //true
console.log(cObj instanceof D); //true

解決construtor的問題通常是讓對象的constructor手動指向自己:
cObj.constructor = C; //將自己的類賦值給對象的constructor屬性
console.log(cObj.constructor === C); //true;
console.log(cObj.constructor === D); //false; 基類不會報true了;

四展蒂、通用但很繁瑣的方法:prototype
console.log(Object.prototype.toString.call(a) === '[object String]'); //true
console.log(Object.prototype.toString.call(b) === '[object Number]'); //true
console.log(Object.prototype.toString.call(c) === '[object Boolean]'); //true
console.log(Object.prototype.toString.call(d) === '[object Array]'); //true
console.log(Object.prototype.toString.call(e) === '[object Date]'); //true
console.log(Object.prototype.toString.call(f) === '[object Function]'); //true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末又活,一起剝皮案震驚了整個濱河市苔咪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柳骄,老刑警劉巖团赏,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耐薯,居然都是意外死亡舔清,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門曲初,熙熙樓的掌柜王于貴愁眉苦臉地迎上來体谒,“玉大人,你說我怎么就攤上這事臼婆∈阊鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵颁褂,是天一觀的道長故响。 經(jīng)常有香客問我,道長颁独,這世上最難降的妖魔是什么彩届? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮誓酒,結(jié)果婚禮上樟蠕,老公的妹妹穿的比我還像新娘。我一直安慰自己丰捷,他們只是感情好坯墨,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著病往,像睡著了一般捣染。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上停巷,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天耍攘,我揣著相機(jī)與錄音,去河邊找鬼畔勤。 笑死蕾各,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庆揪。 我是一名探鬼主播式曲,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吝羞?” 一聲冷哼從身側(cè)響起兰伤,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钧排,沒想到半個月后敦腔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恨溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年符衔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糟袁。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡判族,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出系吭,到底是詐尸還是另有隱情五嫂,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布肯尺,位于F島的核電站沃缘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏则吟。R本人自食惡果不足惜槐臀,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓仲。 院中可真熱鬧水慨,春花似錦、人聲如沸敬扛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啥箭。三九已至谍珊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間急侥,已是汗流浹背砌滞。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留坏怪,地道東北人贝润。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像铝宵,于是被迫代替她去往敵國和親打掘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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