摘要:除和外,所有的數(shù)據(jù)類型都是可以轉(zhuǎn)化為對象,而如果是對象,就肯定有構(gòu)造函數(shù)。特性因為和沒有構(gòu)造函數(shù),因此不能用此方法來判斷。由于同一條原型繼承鏈上的各個對象的構(gòu)造函數(shù)都不一樣,因此,此方法可以區(qū)分開繼承鏈上的各個自定義數(shù)據(jù)類型。
typeof 用法示例
var arr = []; typeof arr; //"object" typeof(arr); //"object"
typeof實際上是一個一元運算符,因此可以用上述代碼所示的兩種用法。
typeof所支持的數(shù)據(jù)類型從上表可以看出,typeof支持的數(shù)據(jù)類型還是比較齊全的,除了倆比較特殊以外:
對Null使用typeof返回object,這跟我們的認(rèn)知還是有一定差距的,這是javascript的一個設(shè)計上的bug,ECMAScript 6中有提議修改此bug,但已經(jīng)被否決了;不過只要加個邏輯非!運算符,就能把Null這種情況給排除了。
除了function以外,其它具體的對象類型都無法判斷出來。
typeof瀏覽器兼容性注意點 對正則表達式字面量的類型判斷在某些瀏覽器中不符合標(biāo)準(zhǔn):typeof /s/ === "function"; // Chrome 1-12 , 不符合 ECMAScript 5.1IE 宿主對象是對象而不是函數(shù)
typeof /s/ === "object"; // Firefox 5+ , 符合 ECMAScript 5.1
在 IE 6, 7 和 8 中,大多數(shù)的宿主對象是對象,而不是函數(shù),例如:
typeof alert === "object"instanceof 用法示例
// 定義構(gòu)造函數(shù) function C(){} function D(){} var o = new C(); // true,因為 Object.getPrototypeOf(o) === C.prototype o instanceof C; // false,因為 D.prototype不在o的原型鏈上 o instanceof D; o instanceof Object; // true,因為Object.prototype.isPrototypeOf(o)返回true
instanceof是一個二元運算符。
instanceof總結(jié)javascript中的原生對象以及用戶的自定義對象基本上都能利用instanceof識別出來,除了Null和Undefined。
instanceof無法區(qū)分開同一原型繼承鏈:
function A(){ //... } function B(){ //... } function C(){ //... } var a = new A(); B.prototype = a; var b = new B(); C.prototype = b; var c = new C(); c instanceof A; //true c instanceof B; //true c instanceof C; //trueObject.prototype.toString.call 用法示例
function type(obj) { return Object.prototype.toString.call(obj).slice(8, -1); } type(1); //"Number" type("1"); //"String" type(true); //"Boolean" type(undefined); //"Undefined" type(null); //"Null" type({}); //"Object" type([]); //"Array" type(new Date); //"Date" type(/d/); //"RegExp" type(function() {}); //"Function" function Point(x, y) { // } type(new Point(1, 2)); //"Object"用法解析
從以上用法示例可以看出,這個基于Object.prototype.toString.call封裝好的函數(shù)用法跟typeof非常相似,但是在支持的數(shù)據(jù)類型上比typeof強多了,所有的javascript原生數(shù)據(jù)類型都能判斷出來。遺憾的是,Object.prototype.toString.call也不是萬能的方案:無法識別自定義的對象類型。
Object.prototype.toString.call實際上是返回這樣形式的值:
Object.prototype.toString.call(1); //"[object Number]" Object.prototype.toString.call("1"); //"[object String]"
因此只要用slice方法把數(shù)據(jù)類型“切”出來就成了。
constructor(構(gòu)造函數(shù)) 用法示例/* * 獲取對象構(gòu)造函數(shù)名稱 */ function getConstructorName(obj){ return obj && obj.constructor && obj.constructor.toString().match(/functions*([^(]*)/)[1]; //利用obj && obj.constructor來判斷null和undefined }用法解析
這是一種非常巧妙的判斷數(shù)據(jù)類型的方法——利用構(gòu)造函數(shù)判斷數(shù)據(jù)類型,這是基于javascript的特性/規(guī)范:
對象的構(gòu)造函數(shù)名就是該數(shù)據(jù)類型。
除Null和Undefined外,所有的數(shù)據(jù)類型都是/可以轉(zhuǎn)化為對象,而如果是對象,就肯定有構(gòu)造函數(shù)。
特性因為Null和Undefined沒有構(gòu)造函數(shù),因此不能用此方法來判斷。
由于同一條原型繼承鏈上的各個對象的構(gòu)造函數(shù)都不一樣,因此,此方法可以區(qū)分開繼承鏈上的各個自定義數(shù)據(jù)類型。
function A(){ //... } function B(){ //... } function C(){ //... } var a = new A(); B.prototype = a; var b = new B(); C.prototype = b; var c = new C(); getConstructorName(a); //A getConstructorName(b); //B getConstructorName(c); //C總結(jié)
以上這四種方法都有不同程度的缺陷,如果從實用性的角度來考慮,可以綜合一下:
function type(obj) {console.dir(obj); if(!obj) { return Object.prototype.toString.call(obj).slice(8, -1); } return obj.constructor.toString().match(/functions*([^(]*)/)[1]; } var t = type(1) // t==="number" var t = type(new Number(1)) // t==="number" var t = type("abc") // t==="string" var t = type(new String("abc")) // t==="string" var t = type(true) // t==="boolean" var t = type(undefined) // t==="undefined" var t = type(null) // t==="null" var t = type({}) // t==="object" var t = type([]) // t==="array" var t = type(new Date) // t==="date" var t = type(/d/) // t==="regexp" var t = type(function(){}) // t==="function"參考資料
typeof - JavaScript | MDN
instanceof - JavaScript | MDN
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91594.html
摘要:基本數(shù)據(jù)類型在中,基本數(shù)據(jù)類型有種,即數(shù)值字符串布爾值。兩個布爾值轉(zhuǎn)為數(shù)值進行比較。對于對象和布爾值,調(diào)用它們的方法得到對應(yīng)的字符串值,然后進行字符串相加。減法對于字符串布爾值或者,自動調(diào)用,轉(zhuǎn)換結(jié)果若為,那么最終結(jié)果為。 這篇文章,來聊聊 JS 中的數(shù)據(jù)類型與變量。這是在學(xué)習(xí) JS 時最基礎(chǔ)的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個面試中遇到的問題: 比如...
摘要:對于復(fù)雜類型它的每個實例都有屬性。當(dāng)檢測實例時優(yōu)于因為能檢測這段代碼是從的。補充以下結(jié)果,發(fā)現(xiàn)第三種方法也能正確判斷出。我們知道結(jié)果是那如何判斷兩個變量呢比較兩個變量,使用的即可。 Javascript中數(shù)據(jù)類型分為兩種: 簡單數(shù)據(jù)類型:Undefined, NULL, Boolean, Number, String 復(fù)雜數(shù)據(jù)類型:Object 接下來我們就來看看怎么做數(shù)據(jù)類型判別...
摘要:介紹編程數(shù)據(jù)結(jié)構(gòu),算法,內(nèi)存分配表單驗證需要一門語言可以直接運行在瀏覽器中,來完成表單驗證的功能。 Javascript介紹編程(數(shù)據(jù)結(jié)構(gòu),算法,內(nèi)存分配)表單驗證 需要一門語言可以直接運行在瀏覽器中,來完成表單驗證的功能。 瀏覽器廠商 網(wǎng)景 firefox js 標(biāo)準(zhǔn) js解釋器 IE js js解釋器 google js j...
摘要:表示尚未存在的對象是一個有特殊意義的值??梢詾樽兞抠x值為,此時變量的值為已知狀態(tài)不是,即。用來初始化變量,清除變量內(nèi)容,釋放內(nèi)存結(jié)果為但含義不同。且它倆與所有其他值比較的結(jié)果都是。,需要兩個操作數(shù)同時轉(zhuǎn)為。 轉(zhuǎn)載請聲明出處 博客原文 隨手翻閱以前的學(xué)習(xí)筆記,順便整理一下放在這里,方便自己復(fù)習(xí),也希望你有也有幫助吧 第一課時 入門基礎(chǔ) 知識點: 操作系統(tǒng)就是個應(yīng)用程序 只要是應(yīng)用...
閱讀 3116·2021-10-12 10:20
閱讀 2835·2021-09-27 13:56
閱讀 806·2021-09-27 13:36
閱讀 1444·2021-09-26 09:46
閱讀 2433·2019-08-30 14:02
閱讀 2700·2019-08-28 18:14
閱讀 1280·2019-08-26 10:32
閱讀 1717·2019-08-23 18:25