最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何檢測JavaScript的各種類型

 更新時間:2016年07月30日 11:11:22   投稿:daisy  
在寫js腳本的時候我們必須對一件事保持警惕,就是避免異常的發(fā)生。在本篇文章里面,我想談談一部分類型檢測,有需要的可以參考學習。

一、先介紹下5種原始類型

JavaScript中5種原始類型為string,numberboolean,undefinednull

var name = "Jack";
var age = 32;
var single = false;
var app;  //undefined

console.log(typeof name);  //string
console.log(typeof age);  //number
console.log(typeof single); //boolean
console.log(typeof app);  //undefined
console.log(typeof null);  //object

發(fā)現(xiàn)除null外的其他4種基本類型均可以用typeof來識別:

if(typeof name === "string") { name += "Zhang"; }
if(typeof age === "number") { age++; }
if(typeof single === "boolean" && single) { … }
if(typeof app === "undefined") { app = {}; }

因為typeof null會得到object,所以直接用===來檢測null:

if(el === null) { … }

二、對象

JavaScript的對象包括內(nèi)置對象(Date,RegExp ,Error等)和自定義對象。

(注意,F(xiàn)unction和Array雖然也都是內(nèi)置對象,但下一節(jié)單獨講)

對象不能像基本類型那樣用typeof來檢測了,因為檢測出來的結(jié)果都是object

console.log(typeof new Date());  //object
console.log(typeof new RegExp()); //object
console.log(typeof new Error());  //object
console.log(typeof new Person()); //用typeof檢測出自定義對象也是object

要改用instanceof來檢測:

var date = new Date();
var reg = new RegExp();
var err = new Error();
var me = new Person();

if(date instanceof Date) {  //檢測日期
  year = date.getFullYear(); 
}
if(reg instanceof RegExp) {  //檢測正則表達式
  reg.test(...); 
}
if(err instanceof Error) {  //檢測異常
  throw err; 
}
if(me instanceof Person) {  //檢測自定義對象
  ... 
}

但自定義對象有個問題,假設瀏覽器frameA里和frameB里都定義了Person。 frameA里定義了me對象,用me instanceof Person檢測出來為true。但當自定義對象me傳給frameB后,在frameB里instanceof會是false。

本節(jié)一開頭就說了,F(xiàn)unction和Array雖然也都是內(nèi)置對象,但留到下一節(jié)講。原因就是Function和Array也有和自定義對象相同的上述問題。因此Function和Array一般不用instanceof

三、Function

上面說了用instanceof檢測Function不能跨frame。因此用typeof來檢測,它可跨frame:

var func = function(){};
if(typeof func === 'function') { … }

但IE8以前用typeof來檢測DOM系函數(shù)會得到object,因此IE8以前改用in:

console.log(typeof document.getElementById);    //object,不是function
console.log(typeof document.getElementsByTagName); //object,不是function
console.log(typeof document.createElement);     //object,不是function

//IE8以前的IE瀏覽器,要改用in來檢測是否支持DOM函數(shù)
if("getElementById" in document) { … }    
if("getElementsByTagName" in document) { … }
if("createElement" in document) { … }

四、Array

上面說了用instanceof檢測Array不能跨frame。ES5之前都自定義檢測方法。其中最精確的方法:依賴Array的toString會返回固定字符串”[Object Array]”的事實來檢測

function isArray(arr) {
  return Object.prototype.toString.call(arr) === "[Object Array]";
}

該方法精確且優(yōu)雅,因此被很多庫所采納,最終在ES5被作為isArray方法引入了Array,參照MDN。現(xiàn)在你不需要自定義檢測方法了,直接用isArray()即可。

其他檢測方法,都各有缺陷,不能100%精確。但作為一種思路是可以借鑒的。例如依賴Array是唯一包含sort方法的對象的事實來檢測:

function isArray(arr) {
  return typeof arr.sort === "function";
}

如果是自定義對象也定義了sort方法,該方法就失效了。

五、屬性

檢測屬性是否在實例對象中應該用hasOwnProperty。如果你不關(guān)心屬性是在實例對象中還是在原型對象中,可以簡單點用in

例如檢測字面量對象屬性:

var Person = {
  name: "Jack",
  age: 33
};
if("name" in Person) { … }         //true
if(Person.hasOwnProperty("name")) { … }  //true

例如實例對象屬性:

var Person = function (name, age) {
  this.name = name;
  this.age = age;
};
Person.prototype.location = "Shanghai";

var me = new Person("Jack", 33)
if("name" in me) { … }         //true
if(me.hasOwnProperty("name")) { … }  //true
if("location" in me) { … }       //true
if(me.hasOwnProperty("location")) { … }//false

除此之外其他方法都不好:

if (object[propName])      //Not Good,你怎么知道屬性值不是0或1?
if (object[propName] === null)    //Not Good,你怎么知道屬性值不是null?
if (object[propName] === undefined)  //Not Good,你怎么知道屬性值不是undefined?

總結(jié)

用typeof檢測string,number,boolean,undefined,F(xiàn)unction

用===檢測null

用isArray()檢測Array

用instanceof檢測內(nèi)置對象(除Function和Array)和自定義對象

用hasOwnProperty檢測屬性是否在實例對象中。如果你不關(guān)心屬性是在實例對象中還是在原型對象中,可以簡單點用in

好了,本篇介紹如何檢測JavaScript各種類型的內(nèi)容就到這里了,希望大家能夠認真學習本文的內(nèi)容,或許對大家學習JavaScript有所幫助。

相關(guān)文章

  • JavaScript調(diào)用客戶端Java程序的方法

    JavaScript調(diào)用客戶端Java程序的方法

    這篇文章主要介紹了JavaScript調(diào)用客戶端Java程序的方法,實例分析了javascript調(diào)用java程序的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 基于JavaScript實現(xiàn)電子簽名功能

    基于JavaScript實現(xiàn)電子簽名功能

    這篇文章主要為大家詳細介紹了如何通過JavaScript實現(xiàn)簡單的電子簽名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • 微信小程序之小豆瓣圖書實例

    微信小程序之小豆瓣圖書實例

    本篇文章主要介紹了微信小程序之小豆瓣圖書實例,具有一定的參考價值,有興趣的同學可以了解一下。
    2016-11-11
  • js實現(xiàn)的驗證,學習用js控制td

    js實現(xiàn)的驗證,學習用js控制td

    JS日積月累001 - rows 和 cells的使用
    2008-12-12
  • 原生js實現(xiàn)滑塊區(qū)間組件

    原生js實現(xiàn)滑塊區(qū)間組件

    這篇文章主要為大家詳細介紹了js實現(xiàn)滑塊區(qū)間組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • js 實現(xiàn)復選框只能選擇一項的示例代碼

    js 實現(xiàn)復選框只能選擇一項的示例代碼

    下面小編就為大家分享一篇js 實現(xiàn)復選框只能選擇一項的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Knockoutjs 學習系列(二)花式捆綁

    Knockoutjs 學習系列(二)花式捆綁

    這篇文章主要介紹了Knockoutjs 學習系列(二)花式捆綁 的相關(guān)資料,主要介紹了knockoutjs中各種綁定的使用方法,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 深入解析JavaScript中的變量作用域

    深入解析JavaScript中的變量作用域

    這篇文章主要是對JavaScript中的變量作用域進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 判斷JS對象是否擁有某屬性的方法推薦

    判斷JS對象是否擁有某屬性的方法推薦

    下面小編就為大家了一篇判斷JS對象是否擁有某屬性的方法推薦。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • js取消單選按鈕選中示例代碼

    js取消單選按鈕選中示例代碼

    取消單選按鈕選中的方法有很多,下面為大家詳細介紹下使用js是如何實現(xiàn)的,感興趣的朋友不要錯過
    2013-11-11

最新評論

武邑县| 杭锦后旗| 天祝| 临泽县| 凤山市| 苍梧县| 鲁甸县| 云林县| 怀宁县| 高台县| 宣威市| 汕尾市| 峨眉山市| 禄丰县| 冕宁县| 柘城县| 韩城市| 屏东市| 丹寨县| 曲麻莱县| 庐江县| 饶河县| 厦门市| 精河县| 青海省| 磐石市| 临泉县| 定边县| 昌宁县| 南川市| 蓝山县| 金寨县| 太白县| 霍山县| 布拖县| 光泽县| 亚东县| 万源市| 满洲里市| 天等县| 丰原市|