淺談JavaScript和DOM中的類數組對象

来源:http://www.cnblogs.com/Tony0812/archive/2017/05/30/6919491.html
-Advertisement-
Play Games

JavaScript是一門弱類型語言,它的數據類型分為兩大類:簡單數據類型(5種:Undefined、Null、Boolean、Number、String)和複雜數據類型(1種:Object)。Object是ECMAScript中使用最多的一個類型,所有的引用類型的值都是Object類型的實例。引用 ...


JavaScript是一門弱類型語言,它的數據類型分為兩大類:簡單數據類型(5種:Undefined、Null、Boolean、Number、String)和複雜數據類型(1種:Object)。Object是ECMAScript中使用最多的一個類型,所有的引用類型的值都是Object類型的實例。引用類型,本質上是一種數據結構,用於將數據和功能組織在一起。對象是某個特定引用類型的實例。

 

在JavaScript中,有一種特殊的對象,被稱為類數組(array-like)對象,其在書中的定義為:

  • 擁有length屬性,其它屬性(索引)為非負整數
  • 不具有數組所具有的方法

 

類數組示例:

1:

var a = {'1':'gg','2':'love','4':'meimei',length:5};

 

2:

var a= {};

for(var i=0; i<10 ; i++){
  a[i] = i*i;
}

a.length = i;

可以看出,通過將對象的每個屬性名設為遞增的非負整數,且動態定義一個length屬性來表示元素個數,就可以使用對象來模擬數組。類數組對象可以像數組一樣,使用[]通過下標訪問。但它們終究只是類似數組,而不是數組,所以並不能使用數組的特有方法,如splice、indexOf、pop等。

 

類數組對象和數組的區別:

  1. 一個是對象,一個是數組
  2. 當新元素被添加時,數組的length屬性的值會自動更新,類數組對象則不會
  3. 設置數組的length屬性可擴展或截斷數組,而對於類數組對象來說僅僅是改變了一個屬性的值而已
  4. 類數組不能調用數組方法

 

類數組判斷:

《javascript權威指南》上給出了代碼用來判斷一個對象是否屬於“類數組”:

// Determine if o is an array-like object.
// Strings and functions have numeric length properties, but are 
// excluded by the typeof test. In client-side JavaScript, DOM text
// nodes have a numeric length property, and may need to be excluded 
// with an additional o.nodeType != 3 test.
function isArrayLike(o) {
    if (o &&                                // o is not null, undefined, etc.
        typeof o === 'object' &&            // o is an object
        isFinite(o.length) &&               // o.length is a finite number
        o.length >= 0 &&                    // o.length is non-negative
        o.length===Math.floor(o.length) &&  // o.length is an integer
        o.length < 4294967296)              // o.length < 2^32
        return true;                        // Then o is array-like
    else
        return false;                       // Otherwise it is not
}

 

類數組轉換:

有些時候,我們需要將一個類數組對象轉換為一個真正的數組,轉換之後可使用數組方法

Array.prototype.slice.call(Object)

對於IE9以前的版本(DOM實現基於COM),可以使用makeArray來實現:

// 偽數組轉化成數組
var makeArray = function(obj) {
    if (!obj || obj.length === 0) {
        return [];
    }
    // 非偽類對象,直接返回最好
    if (!obj.length) {
        return obj;
    }
    // 針對IE8以前 DOM的COM實現
    try {
        return [].slice.call(obj);
    } catch (e) {
        var i = 0,
            j = obj.length,
            res = [];
        for (; i < j; i++) {
            res.push(obj[i]);
        }
        return res;
    }
};

 

常見類數組對象:

1.arguments

//屬性: 
length //長度  
callee //正在執行的函數

arguments是最常見的類數組對象,在函數內部使用,示例:arguments[0] 或 functionName.arguments[0]

 

在JS的DOM中,有三個常用到的類數組對象:NodeList  NamedNodeMap 和 HTMLCollection

 

2.NodeList

//屬性:  
length //長度
  
//方法:  
item(idx) //通過索引訪問節點

以下代碼形式返回類型為NodeList:

childNodes 
getElementsByClassName(className)  
getElementsByTagName(tagName)

 

3.NamedNodeMap

//屬性:
length //長度

//方法:
item(idx) //通過索引訪問節點
getNamedItem(NS) //通過名稱(和命名空間)訪問節點 
setNamedItem(NS) //通過名稱(和命名空間)設置節點 
removeNamedItem(NS) //根據名稱(和命名空間)刪除節點

以下代碼形式返回類型為NamedNodeMap:

element.attributes

 

4.HTMLCollection

//屬性:  
length //長度  

//方法:  
item(idx) //通過索引訪問節點
namedItem(name) //通過name 屬性或 id 屬性訪問節點

以下代碼形式返回類型為HTMLCollection:

document.images //所有img元素  
document.links //所有帶href屬性的a元素和area元素  
document.anchors //所有帶name屬性的a元素  
document.forms //所有form元素  
document.scripts //所有script元素  
tBodies(table元素)
rows(table、tbody、thead、tfoot元素)
cells(tr元素)

 

HTMLCollection  NodeList以及NamedNodeMap都是“動態的”,每當文檔結構發生變化時,他們都會得到更新,始終會保存著最新,最準確的信息


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.angular 調用客戶端方法放在 try catch中 try { js_invoke.showShareDialog(angular.toJson(obj)); // 在這裡放客戶端的方法即可 } catch(e) { console.log('Recommend share',obj); ...
  • jq筆記-dom篇-慕課網學習筆記 1.jQuery節點創建與屬性的處理 創建元素節點: 1.$("<div></div>") 創建為本節點: 1.$("<div>我是文本節點</div>") 創建為屬性節點: 1.$("<div id='test' class='aaron'>我是文本節點</di ...
  • 學完了Javascript類和對象的創建之後,現在總結一下Javascript繼承機制的實現。Javascript並不像Java那樣對繼承機制有嚴格明確的定義,它的實現方式正如它的變數的使用方式那樣也是十分寬鬆的,你可以設計自己的方法“模仿”繼承機制的實現。有以下幾種方法: 1、對象冒充 1 <sc ...
  • 這篇依然是跟 相關的方法,側重點是跟集合元素查找相關的方法。 讀Zepto源碼系列文章已經放到了github上,歡迎star: "reading zepto" 源碼版本 本文閱讀的源碼為 "zepto1.2.0" 內部方法 之前有一章《 "讀Zepto源碼之內部方法" 》是專門解讀 中沒有提供給外部 ...
  • 頁面編碼(告訴瀏覽器是什麼編碼) 刷新和跳轉 關鍵詞 X-UA-Compatible Title網頁頭部信息 常用標簽 表格 實例: ...
  • 學習和工作中經常會通過搜索引擎的引導進入到博客園中,技術大牛們的知識概括往往一針見血解決了困擾我很久的大大小小的問題。可是一直都是看別人寫的博客,自己一直沒動過手,直到看到一個博客說到,從簡到繁地記記讀書筆記或知識總結是促進技術進步的一個很好的方法,覺得非常在理,學習後的整理更能記得牢固,於是最近下 ...
  • 本書從現代前端開發的標準、趨勢和常用工具入手,由此引出了優秀的構建工具webpack 和JavaScript庫React,之後用一系列的實例來闡述兩者的特色、概念和基本使用方法。隨著應用複雜度的增加,進而介紹了Flux 和Redux 兩種架構思想,並且使用Redux 對現有程式進行改造,最後介紹了在 ...
  • 一、在nodejs中path模塊時使用頻率很高的模塊,其中不乏有很多API寫得很模糊,但仔細琢磨下來,也不是很難理解。 1.獲取文件所在路徑 2.獲取路徑中的最後一部分 3.獲取文件的拓展名 二、組合路徑 1. 路徑的拼接 path.join(); 2.path.resove(from,to);將t ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...