摘要:在中常見的類型檢查手段主要有和。與方法不同的是,方法要求開發(fā)者明確地確認(rèn)對象為某特定類型。操作符用于檢測某個對象的原型鏈?zhǔn)欠癜硞€構(gòu)造函數(shù)的屬性。例如在上面的例子中,原型中的屬性被修改指向到了,導(dǎo)致檢測不出實例對象真實的構(gòu)造函數(shù)。
在 Javascript 中常見的類型檢查手段主要有:typeof,instanceof,constructor和Object.prototype.toString。
typeof 運算符typeof操作符返回的是類型字符串.
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只能用來檢測基本數(shù)據(jù)類型。在實際的生產(chǎn)環(huán)境中,typeof常常用來判斷變量是否為undefined。
instanceof 運算符在 JavaScript 中,判斷一個變量的類型嘗嘗會用 typeof 運算符,在使用 typeof 運算符時采用引用類型存儲值會出現(xiàn)一個問題,無論引用的是什么類型的對象,它都返回 “object”。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符相似,用于識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發(fā)者明確地確認(rèn)對象為某特定類型。
instanceof操作符用于檢測某個對象的原型鏈?zhǔn)欠癜硞€構(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é)果來看, undefined和null是檢測不成Object類型的,要使用 instanceof 進(jìn)行變量檢測時,需要首先判斷是否是 undefined 和 null
constructor屬性在使用instanceof檢測變量類型時,我們檢測不到number, ‘string’, bool的類型的。因此,我們需要換一種方式來解決這個問題。
constructor本來是原型對象上的屬性,指向構(gòu)造函數(shù)。但是根據(jù)實例對象尋找屬性的順序,若實例對象上沒有實例屬性或方法時,就去原型鏈上尋找,因此,實例對象也是能使用constructor屬性的。但是undefinded 和 null是沒有 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,其他類型的變量均能使用constructor判斷出來。
但是constructor也不是萬無一失的,它是能被修改的,會導(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)致檢測不出實例對象Jack真實的構(gòu)造函數(shù)。
Object.prototype.toStringObject.prototype.toString.call(變量)輸出的是一個字符串,字符串里有一個數(shù)組,第一個參數(shù)是Object,第二個參數(shù)就是這個變量的類型,而且,所有變量的類型都檢測出來了,我們只需要取出第二個參數(shù)即可。或者可以使用Object.prototype.toString.call(arr)=="object Array"來檢測變量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的行為:首先,取得對象的一個內(nèi)部屬性[[Class]],然后依據(jù)這個屬性,返回一個類似于”[object Array]”的字符串作為結(jié)果(看過ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來表示語言內(nèi)部用到的、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”)。利用這個方法,再配合call,我們可以取得任何對象的內(nèi)部屬性[[Class]],然后把類型檢測轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86368.html
摘要:原文鏈接翻譯于今天我們興奮的發(fā)布了的嘗鮮版,一個新的靜態(tài)類型檢查器。為添加了靜態(tài)類型檢查,以提高開發(fā)效率和代碼質(zhì)量。這最終形成一個高度并行增量式的檢查架構(gòu),類似。知道縮小類型范圍時做動態(tài)檢查的影響。 原文鏈接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...
摘要:前言最近在做項目代碼重構(gòu),其中有一個要求是為代碼添加智能提示和類型檢查。調(diào)研了一段時間后,下文以編輯器作為開發(fā)工具,介紹一下如何為加上智能提示以及類型檢查。 本文首發(fā)于我的博客(點此查看),歡迎關(guān)注。 前言 最近在做項目代碼重構(gòu),其中有一個要求是為代碼添加智能提示和類型檢查。智能提示,英文為 IntelliSense,能為開發(fā)者提供代碼智能補全、懸浮提示、跳轉(zhuǎn)定義等功能,幫助其正確并且...
摘要:介紹是個的靜態(tài)類型檢查工具,由出品的開源碼項目,問世只有一年多,是個相當(dāng)年輕的項目。現(xiàn)在,提供了另一個新的選項,它是一種強靜態(tài)類型的輔助檢查工具。 showImg(https://segmentfault.com/img/bVH6mL?w=1200&h=675); 本章的目標(biāo)是提供一些Flow工具的介紹與使用建議。Flow本質(zhì)上也只是個檢查工具,它并不會自動修正代碼中的錯誤,也不會強制...
摘要:一是一種弱類型動態(tài)類型檢查的語言。動態(tài)類型與靜態(tài)類型的核心區(qū)別動態(tài)類型的類型檢查是是在代碼運行的時候進(jìn)行的,靜態(tài)類型的類型檢查則是在編譯時進(jìn)行。 一、js是一種弱類型、動態(tài)類型檢查的語言。 弱類型:在定義變量時,可以為變量定義復(fù)制任何數(shù)據(jù),變量的數(shù)據(jù)類型不是固定死的,這樣的類型叫做弱類型。 var a = 10; a = abc; a = []; a = function() {}...
摘要:一返回值調(diào)用外部方法獲取的值需要對類型做判斷,因為我們對方法返回的值是有期望值類型,但是卻不能保證這個接口返回的值一直是同一個類型。 19年目標(biāo):消滅英語!我新開了一個公眾號記錄一個程序員學(xué)英語的歷程 有提升英語訴求的小伙伴可以關(guān)注公眾號:csenglish 程序員學(xué)英語,每天花10分鐘交作業(yè),跟我一起學(xué)英語吧 javascript作為一門動態(tài)類型語言,具有很高的動態(tài)靈活性,當(dāng)定義函數(shù)...
摘要:語言中規(guī)定的類型為以及。這兩個值有不同的類型。內(nèi)建類型定義了七種內(nèi)建類型中新增提示以上類型,除的被稱為基本類型。新增列出的六種類型的值都會返回一個對應(yīng)類型名稱的字符串。是中新增的數(shù)據(jù)類型,我們會在第三章詳細(xì)介紹。 譯者的前言 一直都想好好研究這個在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一。可以讓我閱讀的時候,不那么不求甚解。 圖靈社區(qū)出版了該系列兩部分的中文版——...
閱讀 3700·2021-11-22 15:24
閱讀 1609·2021-09-26 09:46
閱讀 1921·2021-09-14 18:01
閱讀 2616·2019-08-30 15:45
閱讀 3535·2019-08-30 14:23
閱讀 1883·2019-08-30 12:43
閱讀 2921·2019-08-30 10:56
閱讀 807·2019-08-29 12:20