探索JavaScript數組奧秘

来源:https://www.cnblogs.com/wangjiming/archive/2018/11/05/9892604.html
-Advertisement-
Play Games

一 概述 JavaScript數組同後端語言一樣,具有它自己的數據結構,歸根結底,這種數據結構,本質就是一種集合。 在後端語言中(如java,.net等),數組是這樣定義的:數組是用來存儲相同數據類型的集合。這個定義,“相同數據類型”6個字限制了數據只能存儲相同的數據類型,如int[]數組只能存儲數 ...


 一  概述

     JavaScript數組同後端語言一樣,具有它自己的數據結構,歸根結底,這種數據結構,本質就是一種集合。

     在後端語言中(如java,.net等),數組是這樣定義的:數組是用來存儲相同數據類型的集合。這個定義,“相同數據類型”6個字限制了數據只能存儲相同的數據類型,如int[]數組只能存儲數字,而不能存儲字元串,如下定義方式,是錯誤的,因為string

不屬於整型

int[] arr = { 10, 20,"string" };

   然而,在JavaScript中,數組的定義卻是非常寬鬆的,這也決定了其能存儲一切數據的特點。JavaScript數組具有如下特點

   特點1:存儲相同基本數據類型的數據;

   特點2:存儲不同基本數據類型的數據;

   特點3:存儲對象

   這三個特點,我們可歸結為一句話:JavaScript存儲一切對象,而不像後端語言那樣,只能存儲相同數據類型。除此之外,JavaScript數組還提供了很多豐富的操作方法。如下為常用的操作方法。

 本篇文章將主要結合代碼來論述JavaScript數組。

二  對數組的基本操作

(一)創建數組

第一種方式:構造函數方式

   //第一種創建數組的方式:構造函數方式
    var colors = new Array();//未知數組長度
    //var colors = new Array(4);//已知數組長度
    //var colors = new Array('green', 'yellow', 'white', 'red');//創建數組同時,給數組賦值
    //var colors = Array();//在創建時,可以省略new關鍵字

第二種方式:字面量方式

   //第二種創建數組方式:使用數組字面量
    var colors = ['green', 'yellow', 'white', 'red'];
    var name = [];//創建空數組

(二)訪問數組

訪問數組,通過數組的下標來訪問

   //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //輸出索引值
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white,red
    }

提示:for...in...訪問數組屬性(索引),而不是數組屬性值

    //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //輸出數組索引
    for (var propAttr in colors) {
        alert(propAttr);//0,1,2,3
    }

(三)為數組添加元素

第一種方式:棧方式(後進先出,從數組尾部加入數據)

   //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //第一種方式:棧方式
    colors.push("orange");
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white,red,orange
    }

第二種方式:隊列方式(先進先出,從數組頭部加入數據)

var colors = ['green', 'yellow', 'white', 'red'];
colors.unshift('orange');
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//orange,green,yellow,white,red
    }

(四)移除數組元素

第一種方式:棧方式(後進先出,從數組尾部移除數據)

    //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從尾部彈出數據
    colors.pop();
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white
    }

第二種方式:隊列方式(先進先出,從數據頭部移除數據)

   //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從頭部移除數據
    colors.shift();
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//yellow,white,red
    }

第三種方式:length方式(藉助length屬性可訪問性來操作)

    //創建數組
    var colors = ['green', 'yellow', 'white', 'red'];
    //從尾部移除數據,與pop()一樣
    colors.length = 3;
    for (var i = 0; i < colors.length; i++) {
        alert(colors[i]);//green,yellow,white
    }

三  數組方法

(一)檢測方法

數組檢測方式,可通過typeof,instranceof和Array.isArray()來檢測。

(二)轉換方法

所有對象都具有toLocaleString(),toString()和valueOf()三個方法,數組也如此。

1.toString()

toString()將數據的每個屬性值轉化為對應的字元串,然後再輸出轉換後的字元串值。

    var colors = ['red','green','yellow'];
    alert(colors.toString());//red,green,yellow

而下列代碼與如上代碼是一樣的,因為alert()接收的是字元串,所以會在後臺調用toString()方法

    var colors = ['red','green','yellow'];
    alert(colors);//red,green,yellow

2.valueOf()

valueOf()方法同toString()方法一樣,也是返回數組的字元串

    var colors = ['red', 'green', 'yellow'];
    alert(colors.valueOf());//red,green,yellow

3.toLocaleString()

toLocaleString()返回數組的字元串形式。

    var colors = ['red', 'green', 'yellow'];
    alert(colors.toLocaleString());//red,green,yellow

4 三者之間關係

關係1:當不顯示指出調用哪個方法時(toString(),toLocaleString()和valueOf()),預設調用每個屬性的toString();

關係2:當顯示地指出調用哪個方法時,就調用每個屬性的該方法;

關係3:關於valueOf問題,暫留

   var person1 = {
        toString: function () {
            return "Alan";
        },
        toLocaleString: function () {
            return "Alan_beijing";
        },
        valueOf: function () {
            return "valueOf1";
        }
    };

    var person2 = {
        toString: function () {
            return "Alan1";
        },
        toLocaleString: function () {
            return "Alan_beijing1";
        }
    }

    var people = [person1, person2];
    alert(people.toString());//Alan,Alan1
    alert(people.toLocaleString());//Alan_beijing,Alan_beijing1
    alert(people.valueOf());//Alan,Alan1
    alert(people);//Alan,Alan1

(三)棧方法

棧是一種數據結構,其演算法為:LIFO(Last input First out)後進先出,其兩個核心方法為push()和pop();

1.push()

push()表示將數據壓入棧中,且放在棧的最後位置,即從棧的尾部壓入數據。對於數組,則在數組的尾部加入數據,操作的順序為:先把數組length+1,再壓入數據。

    var arr = [10, 20, 30];
    arr.push('新加入的數據');
    alert(arr.toString());//10,20,30,新加入的數據

2.pop()

push()表示將數據從棧中彈出,且從棧的最後位置彈出。對於數組,則在數組的尾部彈出數據,操作的順序為:先彈出數據,再數組length-1

    var arr = [10, 20, 30];
    arr.pop();
    alert(arr.toString());//10,20

(四)隊列

隊列是一種數據結構,其演算法為:FIFO(First input First out)後進先出,其兩個核心方法為unshift()()和shift();

1.unshift()

unshift()表示從隊列頭部加入數據。對於數組,則從數組索引最小位置加入數據,操作順序為:先將數length+1,再將當前數組屬性值往後移動1個位置,最後將新數據添加到索引0處。

    var arr = [10, 20, 30];
    arr.unshift(40);
    alert(arr.toString());//40,10,20,30

2.shift()

shift()表示從隊列頭部移除數據。對於數組,則從數組索引最小位置移除數據。

    var arr = [20, 30];
    arr.shift();
    alert(arr.toString());//30

(五)排序方法

在js數組中,兩個重要的重排序方法:reverse()和sort()

1.reverse()

reverse(),顧名思義,逆序方法。

    var arr = [1,2,3,4,5];
    alert(arr.reverse());//5,4,3,2,1

2.sort()

sort()是比較靈活的排序方法了,支持自定義排序規則,預設排序為升序

預設為升序

    var arr = [3, 1, 2, 5, 4];
    alert(arr.sort());//1,2,3,4,5

自定義排序規則

    var arr = [3, 1, 2, 5, 4];
    alert(arr.sort(Compare));//1,2,3,4,5
    //自定義排序規則:正序
    function Compare(value1, value2) {
        if (value1 > value2) {
            return 1;
        } else if (value1 < value2) {
            return -1;
        } else {
            return 0;
        }
    }

 (六)位置方法

js數組提供了兩個位置方法:indexof()和lastIndexOf()

indexOf()表示首次滿足條件的位置;而lastIndexOf()則表示最後滿足條件的位置

    var arr = [20, 30,20,40,10];
    alert(arr.indexOf(20)); //0
    alert(arr.lastIndexOf(20));//2

(七)迭代方法

ECMAScript5提供了5個迭代方法:every(),filter(),forEach(),map()和some()

這個五個方法,均接收2個參數。

1.every()

對數組中的每項運行給定函數,如果該函數對每一項都返回ture,則返回true,否則返回false.

    //every
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var everyResult = num.every(function (item, index,array) {
        return item>2
    });

    alert(everyResult);//fasle

2.some

對數組中的每項運行給定函數,如果該函數對任意一項返回ture,則返回true,否則返回false

    //some
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var someResult = num.some(function (item, index, array) {
        return item > 2;
    });

    alert(someResult);//true

3.filter

對數組中的每項運行給定函數,返回該函數會返回true的項組成的數組

    //filter
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var filterResult = num.filter(function (item, index, array) {
        return item > 2;
    });

    alert(filterResult);//3,4,5,4,3

4.map

對數組中的每項運行給定函數,返回每次函數調用的結果組成的數組

    //map
    var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
    var mapResult = num.map(function (item, index, array) {
        return item * 2;
    });

    alert(mapResult);//2,4,6,8,10,8,6,4,2

 

5.forEach

對數組中的每項運行給定函數。註意,該方法沒返回值

    //forEach
    num.forEach(function (item, index, array) {
        //執行想要執行的操作
    });

(八)求和方法

ECMAScript提供了2個縮減方法:reduce()和reduceRight()

reduce和reduceRight,相當於.net的斐波拉列數列,計算演算法為:f(n)=f(n-1)+f(n-2);

1.reduce

reduce計算數組時,按照從左到右的順序

    var values = [1, 2, 3, 4, 5];
    var sum = values.reduce(function (prev, cur, index, array) {
        return prev + cur;
    });

    alert(sum);//15

2.reduceRight

reduceTight計算數組時,從右到左順序

    var values = [1, 2, 3, 4, 5];

    var sum1 = values.reduceRight(function (prev, cur, index, array) {
        return prev + cur;
    });

    alert(sum1);//15

 

(九)其他方法

ECMAScript為數組操作提供了很多方法,如concat()和slice()

1.concat()

concat()方法是將兩個對象合併,從而生成新對象,合併同時,不會改變原來對象的值,只是做簡單的拷貝

    var color1 = ['red', 'green', 'yellow'];
    var color2 = ['white', 'blue'];
    //添加數組
    var concatColor = color1.concat(color2);
    alert(concatColor);//red,green,yellow,white,blue

    //添加單個值
    var concatSingelColor = color1.concat('orange');
    alert(concatSingelColor);//red,green,yellow,orange

    //不添加值,只是簡單copy

    var concatColor1 = color1.concat();
    alert(concatColor1);//red,green,yellow

2.slice

slice()方法用於從目標數據中截取新數據,不會改變被截取對象的值。

    var color1 = ['red', 'green', 'yellow'];

    //不傳遞參數:表示截取整個數組
    var color2 = color1.slice();
    alert(color2);//red,green,yellow

    //傳遞一個參數:表示從該位置處開始截取數據,直到數組最後一個數
    var color3 = color1.slice(1);
    alert(color3);//green,yellow

    //傳遞2個參數:第一個參數表示從該位置開始截取,第二個參數減1表示所截數據的最後位置
    var color4 = color1.slice(1, color1.length);
    alert(color4);//green,yellow

 四  參考文獻

【01】JavaScript 高級程式設計(第三版)   (美)Nicholas C.Zakas 著       李松峰   曹力  譯

【02】JavaScript 權威指南 (第6版)    David  Flanagan 著


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

-Advertisement-
Play Games
更多相關文章
  • 相對定位 相對定位:position:relative; 相對定位:相對定位是相對於元素在文檔中的初始位置——首先它出現在它所在的位置上(即不設置position時的位置,然後通過設置垂直或水平位置,讓這個元素“相對於”它的原始起點進行移動; 註意,在使用相對定位時,無論是否進行移動,元素仍然占據原 ...
  • 表格: 表格由 <table> 標簽來定義。每個表格均有若幹行(由 <tr> 標簽定義),每行被分割為若幹單元格(由 <td> 標簽定義)。字母 td 指表格數據(table data),即數據單元格的內容。數據單元格可以包含文本、圖片、列表、段落、表單、水平線、表格等等。border是邊框屬性。 ...
  • 使用div構造簡單的信息圖片 html: <!DOCTYPE html><html><head><meta charset="utf-8"><title>zhwTest</title><link rel="stylesheet" href="../css/zhwCommon.css"></head> ...
  • $.ajax({ url: '../Handler.ashx?action=GetsyxhByIdCardAndxtbz',//指向處理地址 type: 'POST',//get post兩種 data: { xyxh: syxh, xtbz: xtbz },//傳遞方法的參數,以{參數名:參數值; ...
  • 實現一個日期組件,如圖: components.js代碼如下: ...
  • 第一章 的介紹 1.CSS:“層疊樣式表”,它是cascading style sheets的縮寫,作用就是給HTML標簽加表現形式(樣式-顯示),如:字體,圖片,列表,位置等。 在瀏覽器中可以看到部分: HTML:“超文本標記語言”,主要作用把內容(文字、圖片、視頻等)放入網頁中--結構 CSS: ...
  • 列表有三種類型: 有序列表:列表項使用數字來標記 無序列表:列表項使用粗體圓點(典型的小黑圓圈)進行標記。 自定義列表:自定義列表以 <dl> 標簽開始。每個自定義列表項以 <dt> 開始。每個自定義列表項的定義以 <dd> 開始。 一、有序列表格式: 運行結果: 不同類型的有序列表: 1.編號列表 ...
  • 用css畫一個如下圖的提示框: 代碼如下: ...
一周排行
    -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# ...