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