摘要:在中常見(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,constructor和Object.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)看, undefined和null是檢測(cè)不成Object類(lèi)型的,要使用 instanceof 進(jìn)行變量檢測(cè)時(shí),需要首先判斷是否是 undefined 和 null
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屬性的。但是undefinded 和 null是沒(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é)果可以看出,除了undefined 和 null,其他類(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.toStringObject.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
摘要:原文鏈接翻譯于今天我們興奮的發(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...
摘要:前言最近在做項(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)定義等功能,幫助其正確并且...
摘要:介紹是個(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)制...
摘要:一是一種弱類(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() {}...
摘要:一返回值調(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ù)...
摘要:語(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ū)出版了該系列兩部分的中文版——...
閱讀 3701·2021-11-22 15:24
閱讀 1610·2021-09-26 09:46
閱讀 1923·2021-09-14 18:01
閱讀 2620·2019-08-30 15:45
閱讀 3535·2019-08-30 14:23
閱讀 1886·2019-08-30 12:43
閱讀 2923·2019-08-30 10:56
閱讀 808·2019-08-29 12:20