概述

数组

JS数组是一种特殊的对象。在JS中,没有真正的数组,通过对象键值对方式模拟的

  1. 元素的数据类型可以不同。
  2. 内存不一定是连续的(对象是随机储存)。
  3. 不能通过数字下标获得,而是通过字符串下标获得。这意味着数组可以有任何 key。

    伪数组

    伪数组,就是像数组一样有 length 属性,看起来就像数组一样,但不是数组。

  4. 拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理)。

  5. 不具有数组所具有的方法。

    数组与伪数组

  • 伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法,方便处理数据;
  • 数组是基于索引的实现,length会自动更新,而对象是键值对;
  • 使用对象可以创建伪数组,伪数组可以正常使用数组的大部分方法;
  • 伪数组原型是Object,而数组原型是Array,原型链再上一层才是 Object;

    创建数组

    Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。
    1. //直接画字面量
    2. let array = [1, 2, 3, 4, 5]
    3. //标准写法
    4. let array = new Array[1, 2, 3, 4, 5]
    5. //只规定了数组的 length,取不到键名
    6. let array = new Array[3]

    分割split()

    String.prototype.split()返回源字符串以分隔符出现位置分隔而成的一个 Array
    1. let arr = "123".split(",")
    2. //1,2,3
    3. let arr = "123".split("")
    4. //"1", "2", "3"

    合并concat()

    concat() 方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。
    1. arr1.concat(arr2)
    2. [1, 2, 3].concat[4, 5, 6]

    截取splice()

    slice() 方法返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。 ```javascript //splice的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。 //如果后面还有更多的参数,则表示这些就是要被插入数组的新元素。 arr.splice(start, count, addElement1, addElement2, …);

//从原数组4号位置,删除了两个数组成员。 let a = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]; a.splice(4, 2) // [“e”, “f”]

//除了删除成员,还插入了两个新成员。 let a = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]; a.splice(4, 2, 1, 2) // [“e”, “f”] a // [“a”, “b”, “c”, “d”, 1, 2]

//如果只是单纯地插入元素,splice方法的第二个参数可以设为0。 let a = [1, 1, 1]; a.splice(1, 0, 2) a // [1, 2, 1, 1]

//如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。 let a = [1, 2, 3, 4]; a.splice(2) // [3, 4] a // [1, 2]

  1. <a name="wzX5V"></a>
  2. ### 连接join()
  3. `**join()**` 方法将一个数组(或一个[类数组对象](https://developer.mozilla.org/zh-CN//docs/Web/JavaScript/Guide/Indexed_collections#Working_with_array-like_objects))的所有元素连接成一个字符串并返回这个字符串。<br />如果数组只有一个项目,那么将返回该项目而不使用分隔符。
  4. ```javascript
  5. let text = ["123","456","789"]
  6. text.join()
  7. //"123,456,789"
  8. let text = ['123','456','789']
  9. text.join(" ")
  10. //"123456789"
  11. let text = ['123','456','789']
  12. text.join("-")
  13. //"123-456-789"

数组中的元素增删改查

增头unshift()

  1. arr.unshift(newItem) //修改arr,返回值为arr的新长度
  2. arr.unshift(item1,item2)

增尾push()

  1. arr.push(newItem) //修改arr,返回值为arr的新长度
  2. arr.push(item1,item2)

增中间splice()

  1. arr.splice(index,0,"x") //在index出插入x
  2. arr.splice(index,0,"x","y")

删头shift()

  1. //删除数组第一个元素,并返回被删除元素
  2. arr.shift()

删尾pop()

  1. //删除数组最后一个元素,并返回被删除元素
  2. arr.pop()

删中间splice()

  1. arr.splice(index,1) //删除index的第一个元素
  2. arr.splice(index,1,"x")//在删除位置添加"x"
  3. arr.splice(index,1,"x","y")//在删除位置添加"x" "y"

反转reverse()

  1. arr.reverse()//反转这个元素的排序,并返回被反转的 arr

排序sort()

sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。

  1. //按照自定义方式排序,可以传入一个函数作为参数
  2. [10111, 1101, 111].sort(function (a, b) {
  3. return a - b;
  4. })
  5. //(3) [111, 1101, 10111]

查看所有属性名与值

  1. //查看所有 key
  2. Object.keys(arr)
  3. //查看所有 value
  4. Object.values(arr)
  5. //查看某个 key 在不在 arr 里面
  6. for(let key in arr){console.log(key)}

for 遍历数组

  1. let arr = [1,2,3,4,5]
  2. for(let i = 0; i < arr.length; i++){
  3. console.log(`${i}:${arr[i]}`)
  4. }

forEach遍历

每一次调用函数fn,并将遍历数组的值作为参数返回给fn

  1. function forEach(array,fn){
  2. for(let i=0;i<array.length;i++){
  3. fn(array[i],i,array)
  4. }

索引

  1. arr.indexOf(item) //返回值如果是-1则表示没有当前值

find

  1. arr.find(item => item%2===0) //查找第一个偶数
  2. arr.findIndex(item => item%2===0) //查找第一个偶数的索引

数组变换

map-映射

map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。

  1. let arr = [1,2,3,4,5]
  2. let b = arr.map(item=>item*item) //[1,4,9,16,25]

filter-过滤

filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。

  1. let arr = [1,2,3,4,5]
  2. arr.filter(item =>item%2===0) //[2,4]

reduce-归纳

reduce方法依次处理数组的每个成员,最终累计为一个值。

  1. let arr = [1,2,3,4,5]
  2. arr.reduce((sum,item)=>{return sum+item},0) //15