成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript判斷數(shù)據(jù)類型

Lyux / 737人閱讀

摘要:操作符剛說完,肯定又有人想用,但是,真的有用嗎操作符用來比較兩個(gè)操作數(shù)的構(gòu)造函數(shù),運(yùn)算符與運(yùn)算符相似,用于識別正在處理的對象的類型。

題目

實(shí)現(xiàn)一個(gè)函數(shù)typeof(),輸入一個(gè)數(shù)據(jù),返回?cái)?shù)據(jù)的基本類型。
如:

typeof([]) => array
typeof({}) => object
typeof("") => string
等等
解析

由于javascript這門語言輝(keng)煌(die)的歷史,所以連這種簡單的需求都需要自己來實(shí)現(xiàn),唉,說多了,都是淚啊。

這兒題目相對來說應(yīng)該是比較簡單的,但是也是有不少坑,想要真正實(shí)現(xiàn)的很好,還是需要用到不少知識的。

一開始,肯定有人想到使用typeof,顧名思義嘛,就是判斷數(shù)據(jù)的類型,但是,可是,實(shí)際真的是這樣嗎?

typeof操作符

typeof 操作符(和 instanceof 一起)或許是 JavaScript 中最大的設(shè)計(jì)缺陷, 因?yàn)閹缀醪豢赡軓乃鼈兡抢锏玫较胍慕Y(jié)果。 --javascript秘密花園

盡管instanceof 還有一些極少數(shù)的應(yīng)用場景,typeof 只有一個(gè)實(shí)際的應(yīng)用,就是用來檢測一個(gè)對象是否已經(jīng)定義或者是否已經(jīng)賦值,而這個(gè)應(yīng)用卻不是用來檢查對象的類型。(好吧,這個(gè)其實(shí)貌似也并沒有什么卵用。。。)
在下面表格中,Type 一列表示 typeof 操作符的運(yùn)算結(jié)果。其中,JavaScript 標(biāo)準(zhǔn)文檔中定義: [[Class]] 的值只可能是下面12個(gè)字符串中的一個(gè): Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String。可以看到,這個(gè)值在大多數(shù)情況下都返回 "object"。

Value Class Type
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object

##### 測試為定義變量

typeof foo !== "undefined"

上面代碼會檢測 foo 是否已經(jīng)定義;如果沒有定義而直接使用會導(dǎo)致 ReferenceError 的異常。 這是 typeof 唯一有用的地方。

instanceof 操作符

剛說完,typeof,肯定又有人想用instanceof,但是,instanceof真的有用嗎?
instanceof 操作符用來比較兩個(gè)操作數(shù)的構(gòu)造函數(shù),instanceof 運(yùn)算符與 typeof 運(yùn)算符相似,用于識別正在處理的對象的類型。具體的可以看看這個(gè)JavaScript instanceof 運(yùn)算符深入剖析。
因此,instanceof在判斷一個(gè)對象是不是一個(gè)類的實(shí)例只有在比較自定義的對象時(shí)才有意義。 如果用來比較內(nèi)置類型,將會和 typeof 操作符 一樣用處不大。

比較自定義對象
function Foo() {}
function Bar() {}
Bar.prototype = new Foo();

new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true

// 如果僅僅設(shè)置 Bar.prototype 為函數(shù) Foo 本身,而不是 Foo 構(gòu)造函數(shù)的一個(gè)實(shí)例。
Bar.prototype = Foo;
new Bar() instanceof Foo; // false
instanceof 比較內(nèi)置類型

但是,不是通過構(gòu)造函數(shù)創(chuàng)建的對象使用instanceof比較,那得到的,可能就不是你想要的結(jié)果。

new String("foo") instanceof String; // true
new String("foo") instanceof Object; // true

"foo" instanceof String; // false
"foo" instanceof Object; // false
注意

還有有一點(diǎn)需要注意,instanceof 用來比較屬于不同 JavaScript 上下文的對象(比如,瀏覽器中不同的文檔結(jié)構(gòu))時(shí)將會出錯(cuò), 因?yàn)樗鼈兊臉?gòu)造函數(shù)不會是同一個(gè)對象。

看到這里,是不是很震驚?你所知道的知道的方法,都是錯(cuò)的。。。唉,當(dāng)初我知道了這個(gè)也是淚流滿面啊。。。

解決方法 Object.prototype.toString

javascript對象的內(nèi)部屬性 [[Class]] 的值就包含有j其對象的類型,為了獲取對象的 [[Class]],我們需要使用定義在 Object.prototype 上的方法 toString。

function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is("String", "test"); // true
is("String", new String("test")); // true

Object.prototype.toString 返回一種標(biāo)準(zhǔn)格式字符串,所以上例可以通過 slice 截取指定位置的字符串,如下所示:

Object.prototype.toString.call([])    // "[object Array]"
Object.prototype.toString.call({})    // "[object Object]"
Object.prototype.toString.call(2)    // "[object Number]"
看看大神的解決方案

如果我沒記錯(cuò),在jQueryunderscore等庫中都有判斷數(shù)據(jù)類型的函數(shù),可能平時(shí)大家也就用用,沒有仔細(xì)了解過它們的底層是怎么實(shí)現(xiàn)的,

我們要會使用框架,但不要依賴框架

以后大家再碰到類似的問題的時(shí)候,不妨查看一下這些成熟框架或庫的實(shí)現(xiàn)源碼,這里,我拋出jQuery的實(shí)現(xiàn)源碼,拋磚引玉。

var class2type = {} ;
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(e,i){
    class2type[ "[object " + e + "]" ] = e.toLowerCase();
}) ;
//當(dāng)然為了兼容IE低版本,forEach需要一個(gè)polyfill,不作細(xì)談了。
function _typeof(obj){
    if ( obj == null ){
        return String( obj );
    }
    return typeof obj === "object" || typeof obj === "function" ?
    class2type[ Object.prototype.toString.call(obj) ] || "object" :
        typeof obj;
}
結(jié)論:

看源碼是程序員快速成長的重要方式。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/79512.html

相關(guān)文章

  • 如何判斷JavaScript數(shù)據(jù)類型?

    摘要:本文將講解我目前所知道的判斷數(shù)據(jù)類型的方法。數(shù)據(jù)類型一共有種除了之外的種屬于原始數(shù)據(jù)類型。等價(jià)于問題四的返回值是什么答案。 本文將講解我目前所知道的判斷JavaScript數(shù)據(jù)類型的方法。JavaScript數(shù)據(jù)類型一共有7種: Undefined Null Boolean String Symbol Number Object 除了Object之外的6種屬于原始數(shù)據(jù)類型。有時(shí),我...

    jackzou 評論0 收藏0
  • javascript如何判斷變量的數(shù)據(jù)類型

    摘要:除和外,所有的數(shù)據(jù)類型都是可以轉(zhuǎn)化為對象,而如果是對象,就肯定有構(gòu)造函數(shù)。特性因?yàn)楹蜎]有構(gòu)造函數(shù),因此不能用此方法來判斷。由于同一條原型繼承鏈上的各個(gè)對象的構(gòu)造函數(shù)都不一樣,因此,此方法可以區(qū)分開繼承鏈上的各個(gè)自定義數(shù)據(jù)類型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...

    曹金海 評論0 收藏0
  • javascript 數(shù)據(jù)類型判斷 (常見庫的數(shù)據(jù)類型判斷源碼的分析)

    摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴(yán)格區(qū)分使用。的實(shí)現(xiàn)使用了原型繼承的表示左表達(dá)式,表示右表達(dá)式,它是用是否等于來判斷對象的類型的。常見框架和庫的實(shí)數(shù)據(jù)類型判斷測試這里將的實(shí)現(xiàn)原理抽取出來,用原生實(shí)現(xiàn)。 JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...

    libin19890520 評論0 收藏0
  • JavaScript instanceof運(yùn)算符深入分析

    摘要:注意基本變量類型不是對象類型,只有基本包裝類型才是對象類型。至于顯示的原型,在里用屬性表示,這個(gè)是原型繼承的基礎(chǔ)知識,在這里就不在敘述了。 前言 如果你要開發(fā)一個(gè)復(fù)雜的產(chǎn)品,那么肯定少不了使用面向?qū)ο髾C(jī)制,當(dāng)然也避不開 Javascript 里面的繼承,instanceof 運(yùn)算符是原生 Javascript 語言中用來判斷實(shí)例繼承的操作符。所以我們有必要深入理解該運(yùn)算符! inst...

    zhangyucha0 評論0 收藏0
  • JavaScript數(shù)據(jù)類型判斷

    摘要:日常工作中經(jīng)常會有判斷數(shù)據(jù)類型的需求,這里簡單介紹下我平時(shí)判斷數(shù)據(jù)類型的幾種方式。當(dāng)使用檢測基本類型時(shí),會始終返回操作符確實(shí)解決了類型判斷的問題,但還是有一些不足之處。此外,只能返回,并不能直接返回?cái)?shù)據(jù)的類型。 JavaScript中有5種基本數(shù)據(jù)類型:undefined,String,Boolean,Number,Null,以及一種復(fù)雜數(shù)據(jù)類型Object。日常工作中經(jīng)常會有判斷數(shù)據(jù)...

    luckyyulin 評論0 收藏0
  • JavaScript中,如何判斷數(shù)組是數(shù)組?

    摘要:比如我們今天要討論的,在當(dāng)中如何判斷一個(gè)數(shù)組是數(shù)組。在數(shù)組的原型鏈上也能找到構(gòu)造函數(shù)由上面的幾行代碼可以看出,使用運(yùn)算符可以分辨數(shù)組和對象,可以判斷數(shù)組是數(shù)組。用判斷實(shí)例化的數(shù)組擁有一個(gè)屬性,這個(gè)屬性指向生成這個(gè)數(shù)組的方法。 如果你沒有注意過這個(gè)問題,那么這個(gè)標(biāo)題應(yīng)該會讓你感到困惑,判斷數(shù)據(jù)類型這么基礎(chǔ)的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...

    kohoh_ 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<