Array类型 ECMAScript最常用的类型。而且ECMAScript中的Array类型和其他语言中的数组有着很大的区别。虽然数组都是有序排列,但ECMAScript中的数组每个元素可以保存任何类型。ECMAScript中数组的大小也是可以调整的。创建Array类型有两种方式:第一种是new运算符,第二种是字面量

1.使用new关键字创建数组 

    let box = new Array();    
    console.log(typeof(box)); //object 数组属于Object类型
    box.push('张三');
    box.push(55);
    box.push([7,9]);
    console.log(box); //['张三', 55, [7,9]

2.以上三种方法,可以省略new关键字

    var box = Array();    
    alert(typeof box);//object

3.使用字面量方式创建数组

    let box = [];   //字面量的方式创建数组    
    console.log(typeof box); //object
    
    box = ['西西', 18, '北京'];//字面量的方式创建数组,并且分配了元素
    console.log(box); //['西西', 18, '北京']

4.获取数组元素个数length

    let box = ['西西', 18, '北京'];//字面量的方式创建数组,并且分配了元素
    console.log(box.length); //3

5.转换方法

对象或数组都具有toLocaleString()、toString()和valueOf()方法。其中toString()和valueOf()无论重写了谁,都会返回相同的值。数组会讲每个值进行字符串形式的拼接,以逗号隔开。

    let box = ['西西',18,'北京',new Date()];    
    console.log(box); //['西西', 18, '北京', Sun Jun 25 2023 15:06:10 GMT+0800 (中国标准时间)]
    console.log(box.valueOf());//['西西', 18, '北京', Sun Jun 25 2023 15:06:10 GMT+0800 (中国标准时间)]
    console.log(box.toString());//西西,18,北京,Sun Jun 25 2023 15:06:10 GMT+0800 (中国标准时间)
    console.log(box.toLocaleString());//西西,18,北京,2023/6/25 15:06:10
    console.log(box.join("|"));//西西|18|北京|Sun Jun 25 2023 15:13:04 GMT+0800 (中国标准时间)

6.栈方法(后进先出)

ECMAScript数组提供了一种让数组的行为类似于其他数据结构的方法。也就是说,可以让数组像栈一样,可以限制插入和删除项的数据结构。栈是一种数据结构(后进先出),也就是说最新添加的元素最早被移除。而栈中元素的插入(或叫推入)和移除(或叫弹出),只发生在一个位置——栈的顶部。ECMAScript为数组专门提供了push()和pop()方法。

push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一个元素,减少数组的length值,然后返回移除的元素。

    let box = ['西西',18,'北京',new Date()];    
    let count = box.push('PHP', '望京');
    console.log(count);//6
    console.log(box);//['西西', 18, '北京', Sun Jun 25 2023 15:20:10 GMT+0800 (中国标准时间), 'PHP', '望京']
    
    let item = box.pop();
    console.log(item); //望京
    console.log(box); //['西西', 18, '北京', Sun Jun 25 2023 15:21:37 GMT+0800 (中国标准时间), 'PHP']

7.队列方法(先进先出)

列队在数组的末端添加元素,从数组的前端移除元素。通过push()向数组末端添加一个元素,然后通过shift()方法从数组前端移除一个元素

    let box = ['东东', 20, '北京'];    
    let count = box.push('PHP', '望京'); //5
    let item = box.shift(); //移除数组开头的一个元素,并且返回这个元素:东东
    console.log(item); //东东
    console.log(box); //[20, '北京', 'PHP', '望京']
    
    //数组提供了一个unshift()方法,它和shift()方法的功能完全相反。unshift()方法为数组的前端添加一个元素。
    count = box.unshift('南南'); //5  给数组前端添加一个元素,并且返回最新的长度。最新长度:5
    console.log(box);//['南南', 20, '北京', 'PHP', '望京']

8.排序

数组中存在两个可以直接用来排序的方法:reverse()和sort()。

reverse 从大到小排序,sort 从小到大排序

    let box = [2,5,3,4,1];    
    box.sort(); //从小到大排序
    console.log(box); //[1, 2, 3, 4, 5]
    box.reverse(); //从大到小排序
    console.log(box); //[5, 4, 3, 2, 1]

sort方法的默认排序在数字排序上有些问题,因为数字排序和数字字符串排序的算法是一样的。我们必须修改这一特征,修改的方式,就是给sort(参数)方法传递一个函数参数。

    function compare(value1, value2) {      //数字排序的函数参数        
      if (value1 < value2) {             //小于,返回负数
          return -1;
      } else if (value1 > value2) {      //大于,返回正数
           return 1;
      } else {                           //其他,返回0
           return 0;
      }
    }
    let box = [0, 1, 5, 10, 15];
    box.sort();
    console.log(box); //[0, 1, 10, 15, 5]
    box.sort(compare);
    console.log(box); //[0, 1, 5, 10, 15]
    box.reverse();
    console.log(box); //[15, 10, 5, 1, 0]

9.concat 方法

concat()方法可以基于当前数组创建一个新数组

    let box = ['江苏', '南京', '玄武'];    
    let box2 = box.concat(['玄武湖', '中山陵']); //创建新数组,并添加新元素
    console.log(box); //['江苏', '南京', '玄武']  当前数组没有任何变化
    console.log(box2); //['江苏', '南京', '玄武', '玄武湖', '中山陵']

10.slice 方法  可以用于数组和字符串表示切片

    //slice(begin, end); 会从begin开始 到end结束所有元素,包含begin 不包含end
    //begin 从该索引开始提取原数组元素,如果该参数为负数则表示从原数组中的倒数第几个元素开始提取
     let box = ['红', '黄', '蓝', '绿', '黑', '紫'];
     let box1 = box.slice(1,3);//'黄', '蓝' 从下标1,到下标3(不包含), 下标从0开始
     let box2 = box.slice(-4, -2);//'蓝', '绿' 元素倒数第4个元素 到倒数第二个(不包含)之间的内容
     let box3 = box.slice(-2);//'黑', '紫' 元素倒数第二个开始 到结尾

11.splice 方法 只能用于数组

                //当 splice 方法的参数只有 1 个的时候(i),表示删除数组中索引为 i及 i之后的所有元素。返回删除的元素,数组原地修改
        //i 为非负整数:删除数组中索引为 i及i之后的所有元素
        //i 为负整数: 索引从后往前计算,最后一位索引是 -1,倒数第二位索引是 -2,依次类推。删除i及i之后的所有元素
        let box = [1,2,3,4,5,6];
        
        let box2 = box.splice(2);
        console.log(box);//[1, 2]
        console.log(box2);//[3, 4, 5, 6]
        //当 splice 方法参数有2个的时候(i,j)
        //表示从数组中索引i 开始删除,一共删除j个
        
        let box2 = box.splice(3, 6);
        console.log(box);//[1, 2, 3]
        console.log(box2);//[4, 5, 6]
        //当参数为3或者3个以上的情况
        //语法a.splice(i,j,e1,e2,...)
        //当 splice 方法有 3 个参数时,表示从索引为 i位置开始删除j个元素,然后从i位置添加e1,e2,...,返回删除的元素,原地修改
        //若 j 为0,则表示一个元素也不删除,则元素从i前一个位置开始插入
        //若 j >0,则表示从i位置开始(包括i位置)删除j个元素,然后从i 后面开始插入
        
        let box2 = box.splice(2, 2, 'a'); //从索引2开始删除2个元素,然后在索引2插入 a
        console.log(box);//[1, 2, 'a',5,6]
        console.log(box2);//[3, 4]
        
        let box2 = box.splice(1, 0 , 'a', 'b', 'c'); //从索引1开始删除0个元素,在索引1位置插入a,b,c
        console.log(box); //[1,'a','b','c',2,3,4,5,6]
        console.log(box2);//[]
        
        let box2 = box.splice(-3, 0, 'm', 'n'); //从结尾开始第三个元素,删除0个元素,插入m,n
        console.log(box); //[1,2,3,'m','n',4,5,6]
        console.log(box2);//[]
        
        let box2 = box.splice(-3, 2, 'x', 'y');//从结尾第三个元素开始,删除2个元素,插入x,y
        console.log(box); //[1,2,3,'x','y',6]
        console.log(box2);//[4,5]
        
        let box2 = box.splice(0,0,'p','q'); //数组开头插入p,q两个元素
        console.log(box); //['p','q',1,2,3,4,5,6]
        console.log(box2);//[]
        
        let box2 = box.splice(box.length,0,'e','f'); //数组结尾插入e,f两个元素
        console.log(box); //[1,2,3,4,5,6,'e','f']
        console.log(box2);//[]