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