国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript如何判斷變量的數(shù)據(jù)類型

曹金海 / 577人閱讀

摘要:除和外,所有的數(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.1
typeof /s/ === "object"; // Firefox 5+ , 符合 ECMAScript 5.1
IE 宿主對(duì)象是對(duì)象而不是函數(shù)

在 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),除了NullUndefined

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;    //true
Object.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ù)類型。

NullUndefined外,所有的數(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

相關(guān)文章

  • 分析 JavaScript 數(shù)據(jù)類型變量

    摘要:基本數(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)題: 比如...

    Mike617 評(píng)論0 收藏0
  • 關(guān)于javascript類型判斷那些疑惑

    摘要:對(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ù)類型判別...

    李增田 評(píng)論0 收藏0
  • JavaScript入門(mén)

    摘要:介紹編程數(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...

    wangdai 評(píng)論0 收藏0
  • js面試題(上)

    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...

    leap_frog 評(píng)論0 收藏0
  • javascript基礎(chǔ)篇小結(jié)

    摘要:表示尚未存在的對(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)用...

    hiyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<