jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
在javascript中對變量類型的判斷中,我們講解了了jquery中$.type()實現(xiàn)的原理。當然,jquery除了提供$.type的工具方法外,還提供了幾個其他的工具方法:$.isFunction(), $.isArray(), $.isWindow(), $.isNumeric()等。這幾個方法從方法名上就能看出其用途來,下面我們來一一講解這幾個方法在jQuery(2.1.2)中實現(xiàn)的內(nèi)部細節(jié)。
1. $.isFunction()
$.isFunction()是用來判斷變量是否為function類型,我們通過幾個例子來看看:
$.isFunction(123); // false
$.isFunction(true);// false
$.isFunction([1, 2]);// false
$.isFunction(function(){});// true
function func(){
}
var sfunc = function(){
}
$.isFunction(func); // true
$.isFunction(sfunc);// true
從上面的例子中能夠看到,在$.isFunction(param)中,若傳入的param是function類型,則返回true;其他的類型則返回false。
查看jquery的源碼我們可以看到,$.isFunction()也是通過$.type()實現(xiàn)的:
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
}
2. $.isArray()
$.isArray()是用來判斷變量是否為array類型。同樣,我們也通過幾個例子來看看$.isArray的用法:
$.isArray(123); // false $.isArray(true); // false $.isArray([1, 2]);// true $.isArray(new Array(3, 4)); // true
無論是array的字面量還是使用new關(guān)鍵詞創(chuàng)建的變量,都能使用$.isArray()判斷其是array類型。在jquery源碼中,$.isArray調(diào)用的就是原生Array提供的isArray方法。因為在高版本的瀏覽器中,已經(jīng)給原生JavaScript提供了一個isArray方法用來判斷變量是否為array類型。
isArray: Array.isArray
3. $.isWindow()
$.isWindow()是用來判斷當前變量是否為window,如:
$.isWindow(window); // true $.isWindow([]); // false $.isWindow(null); // false
在jQuery源碼中:
isWindow: function( obj ) {
return obj != null && obj === obj.window;
}
他是通過判斷obj是否有window屬性,來判斷obj是否為window對象。因為window對象里有一個屬性window,就是他自己,因此:window.window===window,同樣的:
window.window.window.window === window;
可以一直循環(huán)下去。
而代碼里為什么要先判斷一下obj是否為null呢?因為在判斷null或undefined是否有window屬性時,代碼會拋出異常:Uncaught TypeError: Cannot read property ‘window' of null。因此,為了防止代碼錯誤,首先判斷變量是否為null,若為null,則它肯定不是window對象,直接返回false;否則再判斷這個變量有沒有window屬性。
4. $.isNumeric()
$.isNumeric()是用來判斷當前變量是否為數(shù)字類型,可是為什么我不使用$.type()=="number"來判斷呢。我們先來看幾個官方的例子:
$.isNumeric("-10"); // true
$.isNumeric(16); // true
$.isNumeric(0xFF); // true
$.isNumeric("0xFF"); // true
$.isNumeric("8e5"); // true (exponential notation string)
$.isNumeric(3.1415); // true
$.isNumeric(+10); // true
$.isNumeric(0144); // true (octal integer literal)
$.isNumeric(""); // false
$.isNumeric({}); // false (empty object)
$.isNumeric(NaN); // false
$.isNumeric(null); // false
$.isNumeric(true); // false
$.isNumeric(Infinity); // false
$.isNumeric(undefined); // false
使用$.isNumeric()能夠判斷出“-10”, “0xFF”這樣字符串類型的數(shù)字,而$.type()則會將其解析為string類型。
在jquery源碼中,是這樣判斷變量類型的:
isNumeric: function( obj ) {
// parseFloat NaNs numeric-cast false positives (null|true|false|"")
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
// subtraction forces infinities to NaN
// adding 1 corrects loss of precision from parseFloat (#15100)
return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
}
首先判斷其變量是否為array類型,若是則直接返回false??墒菫槭裁匆扰袛嘧兞渴欠駷閍rray類型呢?因為[123]這樣類型的數(shù)組是可以直接進行減法運算的,同時也能通過parseFloat([“123”])轉(zhuǎn)換為數(shù)字:
[100] - 60 // 40 [100] - [60] // 40 parseFloat([123]) // 123 parseFloat(["345"]) // 345
因此不能直接通過parseFloat()轉(zhuǎn)換,然后判斷。首先得判斷這個變量是否為數(shù)組;若不是才進行下一步的判斷:
(obj - parseFloat( obj ) + 1) >= 0
純數(shù)字,字符串類型的數(shù)字,0開頭的數(shù)字(8進制),0x開頭的數(shù)組(16進制)等,都能通過parseFloat()正常進行轉(zhuǎn)換為10進制的數(shù)字。經(jīng)過上面表達式的運算,肯定是大于0的。可是為什么要加上1呢?代碼里也解釋了,通過parseFloat()轉(zhuǎn)換到,會造成精度丟失的問題,因此+1后,運算結(jié)果更加的準確。
而其他類型的通過parseFloat()轉(zhuǎn)換后得到的是NaN,NaN無論通過怎樣的運算,都是不能跟0比較的,返回false。
在jquery之前的版本(如2.0.2)中:
isNumeric: function( obj ) {
return !isNaN( parseFloat(obj) ) && isFinite( obj );
}
我們可以發(fā)現(xiàn),使用這樣的代碼$.isNumeric([123])運行后,得到的true,而實際上,它是個數(shù)組類型。不過還好,在后續(xù)的版本已經(jīng)修復(fù)了。
5. $.isEmptyObject()
$.isEmptyObject()不是用來判斷變量的類型了,而是判斷一個object類型是否為空,不包含任何屬性。
從 jQuery 1.4 開始,這個方法既檢測對象本身的屬性,也檢測從原型繼承的屬性(因此沒有使用hasOwnProperty)。參數(shù)應(yīng)當是一個普通的JavaScript對象, 對于其他類型的對象(DOM元素,原始strings/numbers,host對象)在跨瀏覽器中可能無法提供一致的結(jié)果。
$.isEmptyObject({name:"wenzi"}) // false
$.isEmptyObject({}) // true
function Person(){
this.name = "wenzi"
}
$.isEmptyObject(new Person()); // false
function Student(){
}
Student.prototype.name = "wenzi";
$.isEmptyObject(new Student()); // false
我們能夠看到,不論是對象本身的屬性,還是prototype上的屬性,只要存在,都會返回false。
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
在jquery中,是通過for~in進行檢測的。因為for~in也是能循環(huán)到prototype上的屬性的,若進入到循環(huán)中,則說明obj存在屬性,發(fā)揮false;否則返回true。
6. 總結(jié)
jquery中還提供了很多各種各樣的工具方法,讓我們在編寫js代碼時更加的方便。以后有機會時再總結(jié)其他的工具方法。
相關(guān)文章
jQuery實現(xiàn)參數(shù)自定義的文字跑馬燈效果
這篇文章主要為大家詳細介紹了jQuery實現(xiàn)參數(shù)自定義的文字跑馬燈效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08
jQuery進階實踐之利用最優(yōu)雅的方式如何寫ajax請求
ajax請求相信對大家來說都不陌生,下面這篇文章主要介紹了jQuery進階實踐之利用最優(yōu)雅的方式如何寫ajax請求的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
使用jQuery監(jiān)聽掃碼槍輸入并禁止手動輸入的實現(xiàn)方法(推薦)
基于jQuery的掃碼槍監(jiān)聽。如果只是想實現(xiàn)監(jiān)聽獲取條碼掃碼信息,可以直接拿來使用,如果有更多的條碼判斷處理邏輯需要自己擴展哦2017-03-03
jQuery簡單實現(xiàn)點擊文本框復(fù)制內(nèi)容到剪貼板上的方法
這篇文章主要介紹了jQuery簡單實現(xiàn)點擊文本框復(fù)制內(nèi)容到剪貼板上的方法,涉及jQuery針對瀏覽器的判定與剪貼板的讀寫操作技巧,需要的朋友可以參考下2016-08-08
jQuery實現(xiàn)倒計時(倒計時年月日可自己輸入)
本篇文章主要對jQuery實現(xiàn)倒計時進行了實例分析。并附上實例源碼,有興趣的朋友可以下載源碼調(diào)試運行試試看,希望對大家有所幫助2016-12-12
jQuery獲取單選按鈕radio選中值與去除所有radio選中狀態(tài)的方法
下面小編就為大家?guī)硪黄猨Query獲取單選按鈕radio選中值與去除所有radio選中狀態(tài)的方法。2017-05-05

