JS从0开始(十五):数组基础与方法

250 阅读4分钟

一.声明数组的方法

1.数组字面量

var arr1 = [];

2.通过系统内置的Array构造函数声明数组

var arr2 = new Array();

3.

去掉new:

var arr3 = Array();

这种不常使用

总结

1.声明数组推荐使用字面量的形式
2.arr1. __ prototype__ --> 三个都指向Array --> 所有数组都继承于Array.prototype --> 故Array所有的方法、属性,数组都能继承
3.对象和数组一样,也有上述三种方法,并且 三个都指向Object --> 所有对象都继承于Object.prototype

二.索引值 index

  1. JS中 实际上数组的底层机制就是继承了对象,数组的键名忽略了,但是依旧能靠index访问其中的元素,所以说在JS中数组是对象的另一种形式,他们的底层机制是一样的
  2. index: 标记一个数组内部的元素,即数组元素的下标

2.1稀松数组

数组后面打了逗号,跟没打一样
中间打了很多逗号就需要注意长度


var a = [,,];
console.log(a.length);     /输出2  数组后面打了逗号,跟没打一样

var b = [,1,2,]  
console.log(b.length);     /输出3, 虽然没有值但仍然占据一个位置

像上述这种称之为有很多逗号但是逗号前面没有值的称之为稀疏数组

2.2 构造函数声明数组的 注意事项

1.通过系统内置的Array构造函数声明数组不能使用稀疏数组

var arr = new Array(,2,2,,,2)  /出错

2.在构造函数括号中只填数字想当于创建数组的长度

var arr = new Array(5);
  console.log(arr.length); /输出5
  console.log(arr);        /输出[,,,,,],即为5个空值

而有两个及以上的数字时,就是正常现象
  var arr = new Array(1,5);
  console.log(arr.length); /2
  console.log(arr);         /[1,5]

3.填字符串必须打引号

var arr = new Array(a);         /没打引号,报错; 声明a后,输出1、[undefined]
  console.log(arr.length);
  console.log(arr);

三 .数组的方法

数组的方法有:push、unshift等
和对象一样,数组的方法是继承了数组Array这个构造函数prototype属性上面的方法(面试重点)

3.1数组的添加

push(a):在数组最后一位添加a元素
unshift(a): 在数组的第一位添加a元素

在控制台上:push、unshift等的 返回值是 执行了方法以后 数组的长度。(面试重点)

var arr = [2,3,4]

在控制台上:arr.push[5] --> 打印出4

3.2 数组的删除

pop: 将数组最后一位剪切掉,然后返回
shift: 将现在数组的第一位剪切掉,然后返回
pop()、shift()括号中没有参数,加不加效果都一样

3.3 数组的倒叙

reverse()的括号内同样也不需要参数

3.4 数组的剪切

格式: arr.splice(开始项的下标index , 剪切的长度 , 剪切以后最后一位开始添加的数据)

示例1

var arr  var arr = ['a', 'b', 'c'];
    arr.splice(1,1,1,2,3,4,5);
    console.log(arr);            /输出["a", 1, 2, 3, 4, 5, "c"]

从index下标值为 1 开始,剪切 1 位,添加的数据为:1, 2, 3, 4, 5

示例2

 var arr = ['a', 'b', 'c','e'];
    arr.splice(3, 0, 'd');
    console.log(arr);      /输出["a", "b", "c", "d", "e"] 

示例3

    var arr = ['a', 'b', 'c','e'];
    arr.splice(-1, 0, 'd');
    console.log(arr);   /输出 ["a", "b", "c", "d", "e"]

index为-1:指的是最后一位。
往后数就是-1开始,往前数是0开始

思路总结

splice(新加入元素的index位置,删除的长度,需要加的数据)
比如示例2中:arr.splice(3, 0, 'd'):新加入数组元素的index位置加上'd',删除的长度为0

注意:需要以原始数组为基础,
比如示例3中: arr.splice(-1, 0, 'd'):在数组中原始位置为-1的位置,加上'd'

自创一个splice函数:

  function splice(arr,index){
       if(index >= 0 ){
         index += 0;
       }else{
         index +=arr.length;
       }
       return index;
  }

系统内部就是这样创造splice()的

3.5 数组的排序

无参数时, sort(): 按升序排列;按ASICII码比较大小
所以说 [27,49,5,7] sort() 后输出:[27,49,5,7]

有参数时: sort(a, b): 是按照 a - b 的返回值的正负来决定顺序的。
如果返回值是正数,将a放在前面,
如果返回值是负数,b放在前面。
如果返回值是0,保持不动

升序与降序

因为sort()按ASICII码排序,满足不了我们想要的普通排序要求,所以我们创建一个函数 结合sort()特性 并利用冒泡排序解决普通排序问题:

   var arr = [27, 49, 5, 7];
    arr.sort(function (a, b) { /2749比 排前面; 2755排前面; 2777排前面…… 
      if (a > b) {
        return 1; /返回正值,b排前面
      } else {
        return -1; /返回负值,a排前面
      }
    }
    )
    console.log(arr);

降序就将上述 if (a > b) 改为 if (a < b)

随机排序

Math.random(): 随机生成一个小数: 0< Math.random() <1

  var arr = [27, 49, 5, 7];
      arr.sort(function (a, b) {
        if (Math.random() - 0.5 > 0) {
          return 1; /返回正值,b排前面
        } else {
          return -1; /返回负值,a排前面
        }
      }
      )
      console.log(arr);

总结

以上所有方法都是修改原数组。

2.小知识

var a = [1,2,3]
 console.log(a[3]);

数组中没有的项都输出为undefined
同时空项也返回undefined,虽然空项没有值,但是它占用了内存空间