国产精品99久久久久久久女警_国产福利盒子在线看片_高清国产欧美大片在线_国产一级黄色片免费在线_午夜影院在线播放_久久国产精品日本波多野结衣 _麻豆国产亚洲线视频下载_久久精品国产影库免费看_亚洲a v中文字幕久久一页_国产精品亚洲a∨天堂

咨詢電話:024-31891684

網(wǎng)站建設(shè)|注冊(cè)|登錄 | 易勢(shì)大連分公司

沈陽(yáng)網(wǎng)站制作易勢(shì)最專業(yè)!

 

網(wǎng)站制作技術(shù)之javascript篇當(dāng)前位置:首頁(yè)>主要服務(wù)>網(wǎng)站制作>JS/Jquery

網(wǎng)站制作技術(shù)之javascript篇

   -----JavaScript 類型檢測(cè)方法

 

  在JavaScript中要檢測(cè)一個(gè)變量是不是基本類型?typeof操作符是最佳的工具。更具體的說(shuō),typeof是確定一個(gè)變量是字符串、數(shù)值、布爾值、還是undefined的最佳工具。如果變量的值是一個(gè)對(duì)象或null,則typeof操作會(huì)像下面例子中所示的那樣返回“object”。

 

var s = "w3ctech";

var b = true;

var i = 22;

var u;

var n = null;

var o = new Object();

alert(typeof s); //string

alert(typeof i); //number

alert(typeof b); //boolean

alert(typeof u); //undefined

alert(typeof n); //object

alert(typeof o); 

 

    雖然在檢測(cè)基本數(shù)據(jù)類型時(shí)typeof是非常得力的助手,但是在檢測(cè)引用類型的值時(shí), 這個(gè)操作符的用處不大。通常,我們并不是想知道某個(gè)值是對(duì)象,而是想知道它是什么類型的對(duì)象。為此,ECMAScript提供了instanceof操作符,其語(yǔ)法如下:

 

result = variable instanceof constructor

 

    如果變量是給定引用類型(由構(gòu)造函數(shù)表示)的實(shí)例,那么instanceof操作符就會(huì)返回true。請(qǐng)看下面的例子:

 

alert(person instanceof Object); //變量person 是 Object嗎?

alert(colors instanceof Array); //變量colors 是 Array嗎?

alert(pattern instanceof RegExp); //變量pattern 是 RegExp嗎?

 

    根據(jù)規(guī)定,所有引用類型的值都是Object的實(shí)例。因此,在檢測(cè)一個(gè)引用類型值和Object構(gòu)造函數(shù)時(shí),instanceof操作符始終會(huì)返回true。當(dāng)然如果使用instanceof操作符檢測(cè)基本類型的值,則始終會(huì)返回false。因此基本類型不是對(duì)象。
    注意:使用typeof操作符檢測(cè)函數(shù)時(shí),該操作符會(huì)返回“function”。在Safari和Chrome中使用typeof檢測(cè)正則表達(dá)式時(shí),這個(gè)操作符會(huì)錯(cuò)誤地也返回“function”。
safari 和 chrome中,這個(gè)bug產(chǎn)生的原因是, 正則對(duì)象實(shí)現(xiàn)了調(diào)用接口,即內(nèi)部的[[Call]]方法. 譬如/\d/('123');早期的firefox也存在這個(gè)bug.后來(lái)被修復(fù)了.safari,chrome的 typeof運(yùn)算符調(diào)用的內(nèi)部方法的邏輯,就是簡(jiǎn)單的看這個(gè)對(duì)象是不是實(shí)現(xiàn)了[[Call]]接口.實(shí)現(xiàn)了,就認(rèn)為是一個(gè)函數(shù)對(duì)象. 其實(shí)對(duì)于safari,還有一些host object.也存在此類問題.譬如某些和DOM相關(guān)的東西.就不一一列舉了.
    補(bǔ)充:instanceof 運(yùn)算符的本意不是類型檢查,而是檢測(cè).instanceof 左邊的運(yùn)算元,是否是右邊運(yùn)算元的一個(gè)實(shí)例.所以變相的提供了一種類型檢查的能力.但這個(gè)是不可靠的. 比如 arr instanceof Array. 如果 arr是其他窗體內(nèi)創(chuàng)建的數(shù)組.這個(gè)檢測(cè)就會(huì)失敗. 因?yàn)樗橇硗獯绑w的Global.Array的實(shí)例.而不是當(dāng)前窗體的.
還有一種極端情況:

var arr = [];

arr.__proto__ = {};

arr instanceof Array;//false

 

    所以才有借助ECMAScript object內(nèi)部屬性[[Class]]的需求.即{}.toString.call(arr)的出現(xiàn).那么還有沒有其他辦法呢? 答案是yes. 參考下面的代碼:

 

var arr =[];

arr.constructor && arr.constructor == Array.toString();// true.

 

    原理是通過比較對(duì)象構(gòu)造器的字符串表示.當(dāng)然,嚴(yán)格來(lái)說(shuō).這些信息都是可以后期偽造或更改的. 所以還是{}.toString.call是最靠譜的做法.但,你應(yīng)該了解,從性能角度來(lái)說(shuō). typeof的性能是最佳的. 而 constructor 和{}.toString.call 在IE系則是constructor的性能要比后者高那么一丁點(diǎn).而在非IE.后者的效率要比constructor方式性能高10倍左右. 所以最佳實(shí)踐不用說(shuō)了,只要不是 object.建議使用typeof.否則用{}.toString.call.

 

上一條資訊|返回欄目頁(yè)|下一條資訊

沈陽(yáng)網(wǎng)站制作--網(wǎng)站前臺(tái)效果

易勢(shì)網(wǎng)站制作,以DIV+CSS為主,js/jQuery為輔,制作利于優(yōu)化,頁(yè)面美觀的優(yōu)質(zhì)網(wǎng)站!

top

網(wǎng)絡(luò)策劃公司|新浪官方微博|大連網(wǎng)站建設(shè)