1. 程式人生 > >JavaScript權威指南(第六版)-第7章 陣列

JavaScript權威指南(第六版)-第7章 陣列

陣列

一.建立陣列

1.定義:陣列是值得有序集合。每個值叫做一個元素,而每個元素在陣列中有一個位置,以數字表示——索引
陣列的元素可以是任意型別,並且同一個陣列中的不同元素也可能有不同的型別。第一個元素的索引是0,陣列是js物件的特殊形式。
陣列繼承自Array.prototype中的屬性,他定義了一套豐富的數字操作方法

<script>
        var empty = [];
        var primes  = [2,3,4,5,6];//有5個數組的陣列
        var misc = [1.2,true,"a", ];//3不同型別的元素和結尾的逗號
    </script>

2.陣列直接量中的值不一定要是常量,他們可以是任意的表示式,他可以包含物件直接量或其他陣列直接量。(數組裡面可以巢狀陣列)
3.省略的元素會被賦予undefined
var count = [1,3];//中間元素值為undefined
4.三種方式呼叫建構函式

<script>
        var a = new Array();//沒有引數.該方法建立一個沒有任何元素的空陣列,等同於陣列直接量[]
        var a = new Array(10);//呼叫時有一個數值引數,他指定長度
        var a = new Array(5,4,3,2,1,"testing, testing");//顯式指定2個或多個數組元素的非數值元素
    </script>

二.陣列元素的讀和寫

1.寫法

  <script>
        var a =["world"];
        var value = a[0];
        a[1]=3.14;
        i=2;
        a[i] = 3;
        a[i+1]="hello";
        a[a[i]]=a[0];
        console.log(a);
    </script>

在這裡插入圖片描述
2.所有的索引都是屬性名,所有的陣列都是物件,可以為其建立任意名字的屬性。但若果使用的屬性是陣列的索引,陣列的特殊行為就是根據需要更新他們的length屬性值
3.可以使用負數或非整數來索引陣列。這種情況,數值轉換為字串,字串作為屬性名來用。

<script>
       a[-1.23]=true;//這將建立一個名為“-1.23” 的屬性
       a["1000"]=0;//這是陣列的第1001個元素
       a[1.00]//a[1]相等
    </script>

三.稀疏陣列

1.定義:包含從0開始的不連續索引的陣列
當陣列是稀疏的,陣列長度length屬性值大於元素的個數、
建立稀疏陣列

 a = new Array(5);//陣列沒有元素,但是a.length是5
 a = [];//建立一個空陣列,length=0
a[1000]=0;//賦值新增一個元素,但是設定length為1001

2.兩者不等效

var a1=[,,,];a[undefined,undefined,undefined]
var a2=new Array(3);

四.陣列長度

 <script>
        a=[1,2,3,4,5];
        console.log(a.length);
        a.length=3;
        console.log(a);
        a.length=0;
        console.log(a);
        a.length=5;
        console.log(a);
    </script>

在這裡插入圖片描述
2.ES5中用Object.defineProperty()讓陣列的length屬性變成只讀

 <script>
        a=[1,2,3];
        Object.defineProperty(a,"length",{writable:false});
        a.length=0
        console.log(a.length);//3 a長度不變
    </script>

五.陣列元素的新增和刪除

1.新增①為新索引賦值

 <script>
       a = [];
       a[0]="zero";
       a[1]="one";
       console.log(a);
    </script>

在這裡插入圖片描述
新增②使用push()方法在陣列末尾增加一個或多個元素

 <script>
       a = [1,2,3];
       a.push("zero");
       a.push("one","two");
       console.log(a);
    </script>

在這裡插入圖片描述
還有unshift()方法是在陣列首部插入一個元素,並將其他元素依次移到更高的索引處
2.刪除元素(可以像刪除物件屬性一樣使用delete來刪除陣列元素)

<script>
       a = [1,2,3];
       delete a[1];
       console.log(a.length);
       console.log(a);
    </script>

在這裡插入圖片描述
splice()是一個通用的方法來插入,刪除或替換陣列元素。他會根據需要修改length屬性並移動元素到更高或更低的索引處

六.遍歷陣列

1.for最常見

<script>
       var a = ["two","four",4,5];
       for (var i=0;i<a.length;i++){
           console.log(a[i]);
       }
    </script>

在這裡插入圖片描述
2.要排除null和undefined和不存在元素在for迴圈中增加一句

if(!a[i]) continue;
//迴圈體

3.只想跳過不存在元素而仍然要處理存在的undefined

<script>
       var a = ["two","four",4,5];
       for (var i=0;i<a.length;i++){
           if (!(i in a))
               continue;
           //迴圈體
       }
    </script>

3.forEach()ES5中定義遍歷迴圈的新方法

<script>
       var a = [1,2,3];
       var sum=0;
       a.forEach(function (x) {
           sum+= x*x;
       })
        console.log(sum);
    </script>

在這裡插入圖片描述

七.多維陣列

1.JavaScript不支援真正的多維陣列,但可以用陣列的數字來近似。兩次【】就可以
如下:二維陣列實現九九乘法表

 <script>
       var table = new Array(10);//表格有10行
        for (var i=0;i<table.length;i++){
            table[i]=new Array(10);//每行有10列
        } 
        //初始化陣列row是行,col是列
        for (var row =0;row<table.length;row++){
            for (var col = 0;col<table[row].length;col++){
                table[row][col] = row*col;
            }
        }
    </script>

八.陣列方法

1.join()
Array.join()方法將陣列中所有元素都轉化為字串並連線在一起,返回最後生成的字串。可以指定一個可選的字串在生成的字串中來分隔陣列的各個元素。預設為逗號

 <script>
       var a = [1,2,3];
       a.join();
       console.log(a);
    </script>

在這裡插入圖片描述
2.reverse()
將陣列中元素顛倒順序

<script>
       var a = [1,2,3];
       a.reverse();
       console.log(a);
    </script>

在這裡插入圖片描述
3.sort()
將陣列中的元素排序並返回排序後的陣列

 <script>
      var a = new Array("banana","pear","apple");
      console.log(a);
      a.sort();
      console.log(a);
    </script>

在這裡插入圖片描述
根據數值大小排序

<script>
      var a = new Array(33,4,1111,222);
      a.sort();
      a.sort(function (a,b) {
          return a-b;
      });
      // a.sort(function (a,b) {
      //     return b-a;//數值大小相反的順序
      // })
      console.log(a);
    </script>

在這裡插入圖片描述
對一個字串陣列執行不區分大小寫的字母表排序,比較函式首先將引數都轉換問小寫字母(toLowerCase()方法)

<script>
     var a = ['ant','Bug','cat','Dog'];
     a.sort();//區分大小寫
      console.log(a);
      a.sort(function (s,t) {
          var a = s.toLowerCase();
          var b = t.toLowerCase();
          if (a<b) return-1;
          if (a>b) return 1;
          return 0;
      })
     console.log(a);
    </script>

在這裡插入圖片描述
4.concat()
建立並返回一個新陣列,他的元素包括用concat()的原始陣列的元素和concat()的每個元素。concat不會修改呼叫的陣列

 <script>
     var a = [1,2,3];

     console.log(a.concat(4,5));
     console.log(a.concat([4,5]));
     console.log(a.concat([4,5],[6,7]));
     console.log(a.concat(4,[5,[6,7]]));
     console.log(a);

    </script>

在這裡插入圖片描述
concat連線陣列

<script>
        var arr = new Array(3)
        arr[0] = "George"
        arr[1] = "John"
        arr[2] = "Thomas"

        var arr2 = new Array(3)
        arr2[0] = "James"
        arr2[1] = "Adrew"
        arr2[2] = "Martin"
        console.log(arr.concat(arr2));
        console.log(arr);
        console.log(arr2);
    </script>

在這裡插入圖片描述
5.slice()
返回指定陣列的一個片段或子陣列(兩個引數分別表示片段的開始和結束 。如果引數中有負數,則相對於陣列中最後一個元素的位置(-1)指定最後一個元素,(-3)指定倒數第三個元素)
slice()不會修改呼叫的陣列

<script>
        var a = [1,2,3,4,5];
        console.log(a.slice(0,3));
        console.log(a.slice(3));
        console.log(a.slice(1,-1));
        console.log(a.slice(-3,-2));
        console.log(a);
    </script>

在這裡插入圖片描述
6.splice()
在陣列中插入或刪除元素的通用方法(可以插入可以刪除可以同時插入和刪除)。不同於slice()和concat()。splice()會修改呼叫的陣列
裡面有兩個引數,第一個:指定插入或刪除的起始位置。第二個引數:指定刪除的元素的個數。預設第二個引數是從起始點開始到陣列結尾的所有元素都將被刪除。
splice()返回一個有刪除元素組成的陣列,或者如果沒有刪除元素就返回一個空陣列
刪除

<script>
       var a = [1,2,3,4,5,6,7,8];
       console.log(a.splice(4));
       console.log(a);
       console.log(a.splice(1,2));
       console.log(a);
       console.log(a.splice(1,1));
       console.log(a);
    </script>

在這裡插入圖片描述
插入

 <script>
       var a = [1,2,3,4,5];
       console.log(a.splice(2,0));
       console.log(a);
       
       console.log(a.splice(2,0,'a','b'));
       console.log(a);
       
       // console.log(a.splice(2,2));
       console.log(a.splice(2,2,[1,2],3));
       console.log(a);
    </script>

在這裡插入圖片描述
7.push()和pop()方法允許陣列當做棧使用
push()方法:在陣列的尾部新增一個或多個元素,並返回陣列新的長度。
pop():刪除陣列的最後一個元素,減小陣列長度並返回他刪除的值。
組合使用push和pop能夠用JavaScript陣列實現先進後出的棧

<script>
       var stack = [];
       stack.push(1,2);
       console.log(stack);
       stack.pop();
       console.log(stack);
       stack.push(3);
       console.log(stack);
       stack.pop();
       console.log(stack);
       stack.push([4,5]);
       console.log(stack);
       stack.pop();
       console.log(stack);
       stack.pop();
       console.log(stack);
    </script>

在這裡插入圖片描述
8.unshift()和shift()
unshift()在陣列的頭部新增一個或多個元素,並將已存在的元素移動到更高索引的位置來獲取足夠空間,最後返回陣列新的長度。
shift()刪除陣列的第一個元素並將其返回,然後把所有隨後的元素下移一個位置來填補陣列頭部的空缺

<script>
        var a=[];
        a.unshift(1);
        console.log(a);
        a.unshift(22);
        console.log(a);
        a.shift();
        console.log(a);
        a.unshift(3,[4,5,6]);
        console.log(a);
        a.shift();
        console.log(a);
        a.shift();
        console.log(a);
        a.shift();
        console.log(a);
    </script>

在這裡插入圖片描述
在這裡插入圖片描述
9.toString()和toLocaleString()
toString()將每個元素轉化為字串並輸出用逗號分隔的字串列表。
輸出不包括方括號或其他形式的包裹陣列值得分隔符。這裡與不使用任何引數呼叫join()方法返回的字串一樣的

//陣列
var array = ["CodePlayer", true, 12, -5];
document.writeln( array.toString() ); // CodePlayer,true,12,-5

// 日期
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
document.writeln( date.toString() ); // Sun Aug 18 2013 23:11:59 GMT+0800 (中國標準時間)

// 日期2
var date2 = new Date(1099, 7, 18, 23, 11, 59, 230);
document.writeln( date2.toString() ); // Fri Aug 18 1099 23:11:59 GMT+0800 (中國標準時間)

// 數字
var num =  15.26540;
document.writeln( num.toString() ); // 15.2654

// 布林
var bool = true;
document.writeln( bool.toString() ); // true

// Object
var obj = {name: "張三", age: 18};
document.writeln( obj.toString() ); // [object Object]

// HTML DOM 節點
var eles = document.getElementsByTagName("body");
document.writeln( eles.toString() ); // [object NodeList]
document.writeln( eles[0].toString() ); // [object HTMLBodyElement]

九.ES5中的陣列方法

1.ES5中定義9個新的陣列方法來遍歷,對映,過濾,檢測,簡化和搜尋陣列
ES5中的陣列方法都不會修改他們呼叫的原始陣列
2.forEach()
從頭到尾遍歷陣列,為每個元素呼叫指定的函式
傳遞的函式作為forEach()的第一個引數,然後使用三個引數嗲用該函式:陣列元素,元素的索引和陣列本身(若只想要陣列的值,可以編寫只有一個引數的函式——額外的引數將忽略)

 <script>
        var data = [1,2,3,4,5];
        var sum =0 ;
        data.forEach(function (value) {
            sum+=value;
        });
        console.log(sum);
        //每個陣列元素的值自加1
        data.forEach(function (v,i,a) {
            a[i] = v + 1;
        })
        console.log(data);
    </script>

在這裡插入圖片描述
forEach不能break提前終止結束,要提前終止,必須把他放在try塊中,並丟擲異常
3.map()
將呼叫的陣列的每個元素傳給特定的函式,並返回一個數組,他包含該函式的返回值
map()返回的是新陣列:不會修改呼叫的陣列

<script>
        a = [1,2,3];
        b = a.map(function (x) {
            return x*x;
        });
        console.log(b);
        console.log(a);
    </script>

在這裡插入圖片描述
4.filter()
返回的陣列元素是呼叫的陣列的一個子集。
傳遞的函式是返回的true或false。若返回值是true或能轉換為true的值,則傳遞給判斷函式的元素是這個子集的成員,會被新增到一個作為返回值的陣列中。

 <script>
       a = [5,4,3,2,1];
       smallvalues = a.filter(function (x) {
           return x < 3;
       })
       console.log(smallvalues);
       everytother = a.filter(function (x,i) {
           return i%2==0;
       });
       console.log(everytother);
        console.log(a);
    </script>

在這裡插入圖片描述
5.every()和some()
他們對陣列元素應用指定的函式進行判定返回true還是false
every()== “ 所有” ,當且僅當陣列中的所有元素呼叫判定函式都返回true,他才返回true
some()===存在“”,當陣列至少有一個元素呼叫判定函式返回true,所有元素都返回false他才返回false

 <script>
       var a = [1,2,3,4,5]
       console.log(a);
       console.log(a.every(function (x) {
            return x < 10;
        })
       );

       console.log(a.every(function (x) {
           return x%2===0;
       }))

        console.log(a.some(function (x) {
            return x%2===0;//至少有一個元素,函式返回true
        }))
        console.log(a.some(isNaN));
    </script>

在這裡插入圖片描述
6.reduce()和reduceRight()
使用指定函式將陣列元素進行組合,生成單個值

 <script>
       var a = [1,2,3,4,5];
        var sum = a.reduce(function (x,y) {
            return x+y
        },0);//陣列求和
       console.log(sum);
        var pro = a.reduce(function (x,y) {
            return x*y;
        },1);//陣列求積
        console.log(pro);
        var max = a.reduce(function (x,y) {
            return (x>y)?x:y;
        })
        console.log(max);
    </script>

在這裡插入圖片描述
在空陣列上,不帶初始值引數呼叫reduce()將導致型別錯誤異常
7.indexOf()和lastIndexOf()
搜尋整個陣列中具有給定值的元素,返回找到的第一個元素的索引或者沒有找到就返回-1.indexOf從頭至尾搜尋,二lastIndexOf則反向搜尋

 <script>
       var a = [1,2,3,4,5];
       console.log(a.indexOf(1));//a[0]
       console.log(a.lastIndexOf(3));
       console.log(a.indexOf(4));
    </script>

在這裡插入圖片描述

十.陣列型別

<script>
        var isArray = Function.isArray || function (o) {
            return typeof  o == "object" &&
                    Object.prototype.toString.call(o) === "[object Array]"
        };
    </script>

十一.類陣列物件

例:一個常規物件增加一些屬性使其變成類陣列物件,然後遍歷生成的偽陣列的“元素”

十二.作為陣列的字串