国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript 類型檢查

LdhAndroid / 673人閱讀

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

在 Javascript 中常見的類型檢查手段主要有:typeof,instanceof,constructorObject.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é)果來看, undefinednull是檢測不成Object類型的,要使用 instanceof 進(jìn)行變量檢測時,需要首先判斷是否是 undefinednull

constructor屬性

在使用instanceof檢測變量類型時,我們檢測不到number, ‘string’, bool的類型的。因此,我們需要換一種方式來解決這個問題。

constructor本來是原型對象上的屬性,指向構(gòu)造函數(shù)。但是根據(jù)實例對象尋找屬性的順序,若實例對象上沒有實例屬性或方法時,就去原型鏈上尋找,因此,實例對象也是能使用constructor屬性的。但是undefindednull是沒有 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,其他類型的變量均能使用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.toString

Object.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

相關(guān)文章

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

    摘要:原文鏈接翻譯于今天我們興奮的發(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...

    liangzai_cool 評論0 收藏0
  • 為你的 JavaScript 項目添加智能提示和類型檢查

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

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

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

    seanHai 評論0 收藏0
  • JavaScript類型檢查之Flow

    摘要:一是一種弱類型動態(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() {}...

    zhonghanwen 評論0 收藏0
  • JavaScript 需要檢查變量類型

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

    Songlcy 評論0 收藏0
  • [你不知道的 JavaScript 類型和語法] 第一章:類型

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

    Astrian 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<