成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

曹金海 / 588人閱讀

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

在 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識別出來,除了NullUndefined。

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;    //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"
用法解析

從以上用法示例可以看出,這個基于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ù)類型。

NullUndefined外,所有的數(shù)據(jù)類型都是/可以轉(zhuǎn)化為對象,而如果是對象,就肯定有構(gòu)造函數(shù)。

特性

因為NullUndefined沒有構(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

相關(guān)文章

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

    摘要:基本數(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ǔ)的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個面試中遇到的問題: 比如...

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

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

    李增田 評論0 收藏0
  • JavaScript入門

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

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

    https://segmentfault.com/a/11... 原型 / 構(gòu)造函數(shù) / 實例 對原型的理解 我們知道在es6之前,js沒有類和繼承的概念,js是通過原型來實現(xiàn)繼承的。在js中一個構(gòu)造函數(shù)默認(rèn)自帶有一個prototype屬性, 這個的屬性值是一個對象,同時這個prototype對象自帶有一個constructor屬性,這個屬性指向這個構(gòu)造函數(shù),同時每一個實例 都有一個__proto...

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

    摘要:表示尚未存在的對象是一個有特殊意義的值??梢詾樽兞抠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)用...

    hiyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<