成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 類數(shù)組對象(ArrayLike Object)的判斷

NotFound / 3302人閱讀

摘要:定義在權(quán)威指南中是這樣解釋類數(shù)組對象的一種常常完全合理的看法把擁有一個數(shù)值屬性和對應(yīng)非整數(shù)屬性的對象看做一種類型的數(shù)組。常見的類數(shù)組對象有函數(shù)中的對象等。主要原因是因?yàn)轭悢?shù)組對象不是規(guī)范的,所以不同項(xiàng)目的定義會有所不同。

定義

在《JavaScript權(quán)威指南》中是這樣解釋類數(shù)組對象的:

一種常常完全合理的看法把擁有一個數(shù)值length屬性和對應(yīng)非整數(shù)屬性的對象看做一種類型的數(shù)組。

常見的類數(shù)組對象有函數(shù)中的arguments對象、HTMLCollection、NodeList等。

判斷方法 《JavaScript權(quán)威指南》中給出的判斷方法
function isArrayLike(o) {
    if(o &&                                    // o不是null、undefined等
       typeof o === "object" &&                // o是對象
       isFinite(o.length) &&                   // o.length是有限數(shù)值
       o.length >= 0 &&                        // o.length為非負(fù)值
       o.length === Math.floor(o.length) &&    // o.length是整數(shù)
       o.length < 4294967296)                  // o.length < 2^32
       return true
    else
       return false
}

在這里我有一個疑問,根據(jù)定義,函數(shù)也有l(wèi)ength數(shù)值屬性,應(yīng)該也是類數(shù)組對象。但如果o是一個函數(shù),那么typeof o返回的是"function",并不是"object",以致于調(diào)用isArrayLike函數(shù)會得到false。(感覺還是因?yàn)槎x不嚴(yán)謹(jǐn)導(dǎo)致的)

underscore中的實(shí)現(xiàn)
var isArrayLike = function(collection) {
    // 返回參數(shù) collection 的 length 屬性值
    var length = getLength(collection);
    
    // length是數(shù)值,非負(fù),且小于等于MAX_ARRAY_INDEX
    // MAX_ARRAY_INDEX = Math.pow(2, 53) - 1
    return typeof length == "number" && length >= 0 && length <= MAX_ARRAY_INDEX;
  }

相對來說,underscore中的實(shí)現(xiàn)跟定義一樣寬松,函數(shù)也是類數(shù)組對象。甚至傳入數(shù)組,isArrayLike函數(shù)也會返回true。

jQuery中的實(shí)現(xiàn)
function isArrayLike(obj) {
    // 如果obj非null、undefined等,有l(wèi)ength屬性,則length等于obj.length
    // 否則,length為false
    var length = !!obj && "length" in obj && obj.length,
        // 檢測obj的類型
        type = jQuery.type(obj)
        
        // 如果obj是function類型 或者是window對象 則返回false
        if (type === "function" || jQuery.isWindow(obj)) {
            return false
        }
        // obj本身是數(shù)組,則返回true
        // obj不是數(shù)組,但有l(wèi)ength屬性且為0,例如{length : 0},則返回true
        // obj不是數(shù)組,但有l(wèi)ength屬性且為整數(shù)數(shù)值,obj[length - 1]存在,則返回true
        return type === "array" || length === 0 ||
            typeof length === "number" && length > 0 && (length - 1) in obj;
}
結(jié)語

類數(shù)組對象的判斷,不同版本的返回結(jié)果有細(xì)微的差別。主要原因是因?yàn)轭悢?shù)組對象不是規(guī)范的,所以不同項(xiàng)目的定義會有所不同。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91127.html

相關(guān)文章

  • js 面試官想了解你有多理解call,apply,bind?

    摘要:返回值這段在下方應(yīng)用中有詳細(xì)的示例解析?;卣{(diào)函數(shù)丟失的解決方案綁定回調(diào)函數(shù)的指向這是典型的應(yīng)用場景綁定指向,用做回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數(shù)原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當(dāng)重要的概念,與 this...

    wuaiqiu 評論0 收藏0
  • 深入理解JavaScript數(shù)組

    摘要:但是,我們可以借用類數(shù)組方法不難看出,此時的在調(diào)用數(shù)組原型方法時,返回值已經(jīng)轉(zhuǎn)化成數(shù)組了。很多時候,深入看看源代碼也會讓你對這個理解的更透徹。的前端樂園原文鏈接深入理解類數(shù)組 起因 寫這篇博客的起因,是我在知乎上回答一個問題時,說自己在學(xué)前端時把《JavaScript高級程序設(shè)計(jì)》看了好幾遍。于是在評論區(qū)中,出現(xiàn)了如下的對話:showImg(https://segmentfault.c...

    Towers 評論0 收藏0
  • 數(shù)組使用總結(jié)— (js基礎(chǔ)復(fù)習(xí)第2期)

    摘要:前一個值,當(dāng)前值,索引,數(shù)組對象產(chǎn)生新數(shù)組的迭代器方法類似,對數(shù)組的每個元素使用某個函數(shù),并返回新數(shù)組和相似,傳入一個返回值為布爾類型的函數(shù)。 1. 前言 數(shù)組真的是每天用了,但是有很多方法都是記不住,總是要百度查,很煩,所以才寫了個數(shù)組使用總結(jié),有什么不對的希望大家指出來。 2. 思路 先看看這些問題都記得很清楚么? 創(chuàng)建數(shù)組,怎么創(chuàng)建數(shù)組的 數(shù)組的構(gòu)造方法Array有哪些方法?E...

    zhigoo 評論0 收藏0
  • 前端小知識10點(diǎn)(2019.6.25)

    摘要:前言這里記錄我工作學(xué)習(xí)中值得注意的小知識點(diǎn),希望對你有所幫助。循環(huán)的語法在單次循環(huán)開始前執(zhí)行是單次循環(huán)的條件這里即存在是單次循環(huán)結(jié)束后執(zhí)行說明在單次循環(huán)開始前執(zhí)行是單次循環(huán)的條件這里即存在是單次循環(huán)結(jié)束后執(zhí)行。 showImg(https://segmentfault.com/img/remote/1460000019583410); 前言:這里記錄我工作、學(xué)習(xí)中值得注意的小知識點(diǎn),希...

    wangzy2019 評論0 收藏0

發(fā)表評論

0條評論

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