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

資訊專欄INFORMATION COLUMN

Javascript 類(lèi)型檢查

LdhAndroid / 676人閱讀

摘要:在中常見(jiàn)的類(lèi)型檢查手段主要有和。與方法不同的是,方法要求開(kāi)發(fā)者明確地確認(rèn)對(duì)象為某特定類(lèi)型。操作符用于檢測(cè)某個(gè)對(duì)象的原型鏈?zhǔn)欠癜硞€(gè)構(gòu)造函數(shù)的屬性。例如在上面的例子中,原型中的屬性被修改指向到了,導(dǎo)致檢測(cè)不出實(shí)例對(duì)象真實(shí)的構(gòu)造函數(shù)。

在 Javascript 中常見(jiàn)的類(lèi)型檢查手段主要有:typeof,instanceof,constructorObject.prototype.toString

typeof 運(yùn)算符

typeof操作符返回的是類(lèi)型字符串.

typeof 12   // "number"
typeof "hello" // "string"
typeof true   // "boolean"
typeof function(){}   // "function"
typeof undefined   // "undefined"
typeof [1,2] // "object"
typeof {}   // "object"
typeof NaN // "number"
typeof null // "object"

從上面的輸出結(jié)果可以得出結(jié)論:typeof只能用來(lái)檢測(cè)基本數(shù)據(jù)類(lèi)型。在實(shí)際的生產(chǎn)環(huán)境中,typeof常常用來(lái)判斷變量是否為undefined。

instanceof 運(yùn)算符

在 JavaScript 中,判斷一個(gè)變量的類(lèi)型嘗嘗會(huì)用 typeof 運(yùn)算符,在使用 typeof 運(yùn)算符時(shí)采用引用類(lèi)型存儲(chǔ)值會(huì)出現(xiàn)一個(gè)問(wèn)題,無(wú)論引用的是什么類(lèi)型的對(duì)象,它都返回 “object”。ECMAScript 引入了另一個(gè) Java 運(yùn)算符 instanceof 來(lái)解決這個(gè)問(wèn)題。instanceof 運(yùn)算符與 typeof 運(yùn)算符相似,用于識(shí)別正在處理的對(duì)象的類(lèi)型。與 typeof 方法不同的是,instanceof 方法要求開(kāi)發(fā)者明確地確認(rèn)對(duì)象為某特定類(lèi)型。

instanceof操作符用于檢測(cè)某個(gè)對(duì)象的原型鏈?zhǔn)欠癜硞€(gè)構(gòu)造函數(shù)的prototype屬性。

123 instanceof Number               //false
"123" instanceof String             //false
true instanceof Boolean,            //false
[] instanceof Array                 //true
{} instanceof Object                //true
(function(){}) instanceof Function  //true
undefined instanceof Object         //true
null instanceof Object              //true
new Date() instanceof Date          //true
new RegExp() instanceof RegExp      //true
new Error() instanceof Error        //true

從輸出結(jié)果來(lái)看, undefinednull是檢測(cè)不成Object類(lèi)型的,要使用 instanceof 進(jìn)行變量檢測(cè)時(shí),需要首先判斷是否是 undefinednull

constructor屬性

在使用instanceof檢測(cè)變量類(lèi)型時(shí),我們檢測(cè)不到number, ‘string’, bool的類(lèi)型的。因此,我們需要換一種方式來(lái)解決這個(gè)問(wèn)題。

constructor本來(lái)是原型對(duì)象上的屬性,指向構(gòu)造函數(shù)。但是根據(jù)實(shí)例對(duì)象尋找屬性的順序,若實(shí)例對(duì)象上沒(méi)有實(shí)例屬性或方法時(shí),就去原型鏈上尋找,因此,實(shí)例對(duì)象也是能使用constructor屬性的。但是undefindednull是沒(méi)有 constructor 屬性的。

function Person(){}
var Tom = new Person();
console.log(Tom.constructor == Person);  //true
(123).constructor == Number;  //true
("hello").constructor == String ;  //true
(true).constructor == Boolean;  //true
[].constructor == Array;  //true
{}.constructor == Object;  //true
(function(){}).constructor == Function  //true

從上面的輸出結(jié)果可以看出,除了undefinednull,其他類(lèi)型的變量均能使用constructor判斷出來(lái)。

但是constructor也不是萬(wàn)無(wú)一失的,它是能被修改的,會(huì)導(dǎo)致輸出的結(jié)果不正確。例如:

function Person(){}
function Student(){}
Student.prototype = new Person();
var Jack = new Student();
console.log( Jack.constructor == Student ); //false
console.log( Jack.constructor == Person ); //true

在上面的例子中, Student原型中的constructor屬性被修改指向到了Person,導(dǎo)致檢測(cè)不出實(shí)例對(duì)象Jack真實(shí)的構(gòu)造函數(shù)。

Object.prototype.toString

Object.prototype.toString.call(變量)輸出的是一個(gè)字符串,字符串里有一個(gè)數(shù)組,第一個(gè)參數(shù)是Object,第二個(gè)參數(shù)就是這個(gè)變量的類(lèi)型,而且,所有變量的類(lèi)型都檢測(cè)出來(lái)了,我們只需要取出第二個(gè)參數(shù)即可。或者可以使用Object.prototype.toString.call(arr)=="object Array"來(lái)檢測(cè)變量arr是不是數(shù)組。

Object.prototype.toString.call(123);
//"[object Number]"
Object.prototype.toString.call("hello");
//"[object String]"
Object.prototype.toString.call(false);
//"[object Boolean]"
Object.prototype.toString.call([]);
//"[object Array]"
Object.prototype.toString.call({});
//"[object Object]"
Object.prototype.toString.call(function(){});
//"[object Function]"
Object.prototype.toString.call(null)
//"[object Null]"
Object.prototype.toString.call(undefined)
//"[object Undefined]"

ECMA里是這樣定義Object.prototype.toString.call的:

Object.prototype.toString( ) When the toString method is called, the following steps are taken:

Get the [[Class]] property of this object.

Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

Return Result (2)

上面的規(guī)范定義了Object.prototype.toString的行為:首先,取得對(duì)象的一個(gè)內(nèi)部屬性[[Class]],然后依據(jù)這個(gè)屬性,返回一個(gè)類(lèi)似于”[object Array]”的字符串作為結(jié)果(看過(guò)ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來(lái)表示語(yǔ)言內(nèi)部用到的、外部不可直接訪問(wèn)的屬性,稱為“內(nèi)部屬性”)。利用這個(gè)方法,再配合call,我們可以取得任何對(duì)象的內(nèi)部屬性[[Class]],然后把類(lèi)型檢測(cè)轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86368.html

相關(guān)文章

  • Flow, 一個(gè)新的Javascript靜態(tài)類(lèi)型檢查

    摘要:原文鏈接翻譯于今天我們興奮的發(fā)布了的嘗鮮版,一個(gè)新的靜態(tài)類(lèi)型檢查器。為添加了靜態(tài)類(lèi)型檢查,以提高開(kāi)發(fā)效率和代碼質(zhì)量。這最終形成一個(gè)高度并行增量式的檢查架構(gòu),類(lèi)似。知道縮小類(lèi)型范圍時(shí)做動(dòng)態(tài)檢查的影響。 原文鏈接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...

    liangzai_cool 評(píng)論0 收藏0
  • 為你的 JavaScript 項(xiàng)目添加智能提示和類(lèi)型檢查

    摘要:前言最近在做項(xiàng)目代碼重構(gòu),其中有一個(gè)要求是為代碼添加智能提示和類(lèi)型檢查。調(diào)研了一段時(shí)間后,下文以編輯器作為開(kāi)發(fā)工具,介紹一下如何為加上智能提示以及類(lèi)型檢查。 本文首發(fā)于我的博客(點(diǎn)此查看),歡迎關(guān)注。 前言 最近在做項(xiàng)目代碼重構(gòu),其中有一個(gè)要求是為代碼添加智能提示和類(lèi)型檢查。智能提示,英文為 IntelliSense,能為開(kāi)發(fā)者提供代碼智能補(bǔ)全、懸浮提示、跳轉(zhuǎn)定義等功能,幫助其正確并且...

    zhaochunqi 評(píng)論0 收藏0
  • Flow - JS靜態(tài)類(lèi)型檢查工具

    摘要:介紹是個(gè)的靜態(tài)類(lèi)型檢查工具,由出品的開(kāi)源碼項(xiàng)目,問(wèn)世只有一年多,是個(gè)相當(dāng)年輕的項(xiàng)目。現(xiàn)在,提供了另一個(gè)新的選項(xiàng),它是一種強(qiáng)靜態(tài)類(lèi)型的輔助檢查工具。 showImg(https://segmentfault.com/img/bVH6mL?w=1200&h=675); 本章的目標(biāo)是提供一些Flow工具的介紹與使用建議。Flow本質(zhì)上也只是個(gè)檢查工具,它并不會(huì)自動(dòng)修正代碼中的錯(cuò)誤,也不會(huì)強(qiáng)制...

    seanHai 評(píng)論0 收藏0
  • JavaScript類(lèi)型檢查之Flow

    摘要:一是一種弱類(lèi)型動(dòng)態(tài)類(lèi)型檢查的語(yǔ)言。動(dòng)態(tài)類(lèi)型與靜態(tài)類(lèi)型的核心區(qū)別動(dòng)態(tài)類(lèi)型的類(lèi)型檢查是是在代碼運(yùn)行的時(shí)候進(jìn)行的,靜態(tài)類(lèi)型的類(lèi)型檢查則是在編譯時(shí)進(jìn)行。 一、js是一種弱類(lèi)型、動(dòng)態(tài)類(lèi)型檢查的語(yǔ)言。 弱類(lèi)型:在定義變量時(shí),可以為變量定義復(fù)制任何數(shù)據(jù),變量的數(shù)據(jù)類(lèi)型不是固定死的,這樣的類(lèi)型叫做弱類(lèi)型。 var a = 10; a = abc; a = []; a = function() {}...

    zhonghanwen 評(píng)論0 收藏0
  • JavaScript 需要檢查變量類(lèi)型

    摘要:一返回值調(diào)用外部方法獲取的值需要對(duì)類(lèi)型做判斷,因?yàn)槲覀儗?duì)方法返回的值是有期望值類(lèi)型,但是卻不能保證這個(gè)接口返回的值一直是同一個(gè)類(lèi)型。 19年目標(biāo):消滅英語(yǔ)!我新開(kāi)了一個(gè)公眾號(hào)記錄一個(gè)程序員學(xué)英語(yǔ)的歷程 有提升英語(yǔ)訴求的小伙伴可以關(guān)注公眾號(hào):csenglish 程序員學(xué)英語(yǔ),每天花10分鐘交作業(yè),跟我一起學(xué)英語(yǔ)吧 javascript作為一門(mén)動(dòng)態(tài)類(lèi)型語(yǔ)言,具有很高的動(dòng)態(tài)靈活性,當(dāng)定義函數(shù)...

    Songlcy 評(píng)論0 收藏0
  • [你不知道的 JavaScript 類(lèi)型和語(yǔ)法] 第一章:類(lèi)型

    摘要:語(yǔ)言中規(guī)定的類(lèi)型為以及。這兩個(gè)值有不同的類(lèi)型。內(nèi)建類(lèi)型定義了七種內(nèi)建類(lèi)型中新增提示以上類(lèi)型,除的被稱為基本類(lèi)型。新增列出的六種類(lèi)型的值都會(huì)返回一個(gè)對(duì)應(yīng)類(lèi)型名稱的字符串。是中新增的數(shù)據(jù)類(lèi)型,我們會(huì)在第三章詳細(xì)介紹。 譯者的前言 一直都想好好研究這個(gè)在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一。可以讓我閱讀的時(shí)候,不那么不求甚解。 圖靈社區(qū)出版了該系列兩部分的中文版——...

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

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

0條評(píng)論

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