检测数组类型的两种方法

< ES5

value instanceof Array
当网页中包含多个框架,并且从一个框架向另一个框架中传入一个数组,那么传入的数组与第二个框架中原生创建的数组分别具有不同的构造函数。

>= ES5

Array.isArray()

创建数组的三种方法

new Array(num? | any)

  • 创建一个长度为num的数组,或者内容为any的数组

    Array()

  • 同上,省略new

    [1,2,3]

  • 注意,如果末尾有逗号,会变成一个长度为4的数组(IE8)

数组-> 的三个方法

toString()

  • 返回由数组中每个值的字符串类型拼接而成的一个以逗号分隔的字符串

    toLocalString()

  • 返回结果基本和toString一样,除非数组中的值自己的toLocalString方法被重写了

    join(sep?: string)

  • 传入分隔符,返回由数组中每个值的字符串类型拼接而成的一个以分隔符分隔的字符串,如果不传或者传入undefined,会以逗号分隔

在数组中查找某一项

  • 都接收两个参数,要查找的项和(可选)表示查找起点位置的索引
  • 如果找到了,返回要查找的项在数组中的位置;如果没找到,都返回 -1
  • 在查找时,不会发生隐式类型转换,使用的是 ===

    indexOf

  • 从数组的开头开始向后查找,如果是负数,则相当于从末尾数第几个元素开始向后查找

    lastIndexOf

  • 从数组的末尾开始向前查找

改变原数组

部分定义:

  • 迭代方法:

    • 每个方法都接受两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值
    • 第一个参数,也即是传入这些方法的函数,会接受三个参数:数组项的值、该项在数组中的位置、数组对象本身

      修改数组的length属性

  • 数组的length属性不是一个只读项,所以可以通过设置比数组长度小的值移除末尾的几项,或者通过设置比数组长的值在末尾添加几项,被添加进去的值会为 undefined

    arr.reverse()

  • 反转数组项的顺序

    arr.sort(fn?: function)

  • 返回经过排序的原数组

  • 当不传入参数时,sort会按升序排列数组项。
  • sort会调用每个数组项的toString方法,比较得到的字符串,即使数组项全是数值也是这样
  • 当传入一个比较函数时,比较函数接收两个参数,

    • 如果第一个参数应该位于第二个之前,就返回一个负数
    • 参数相等,则返回0
    • 第一个参数应该在后面,就返回整数

      arr.push(element1, …, elementN)

  • push() 将一个或多个元素逐个添加到数组的末尾,返回该数组的新长度

    arr.pop()

  • pop() 从数组末尾移除最后一项,返回被移除的值

    arr.shift()

  • shift() 移除数组第一项,返回被移除的值

    arr.unshift()

  • unshift()在数组前端一次添加任意个项,返回数组的长度

  • 也即是 arr.unshift(1, 2) 会得到 [1, 2, …]

    arr.splice(start[, deleteCount[, item1[, item2[, …]]]])

  • 按照↓的规则,修改原始数组,返回从原始数组中删除的项,如果没有删除,则返回一个[]

  • start
    • 指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;
    • 如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);
    • 如果负数的绝对值大于数组的长度,则表示开始位置为第0位。
  • deleteCount 可选
    • 整数,表示要移除的数组元素的个数。
    • 如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
    • 如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是说,如果它大于或者等于start之后的所有元素的数量),那么start之后数组的所有元素都会被删除。
    • 如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。
  • item1, item2, … 可选
    • 要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。

不改变原数组

arr.concat(p: arr | any)

  • 该方法会先创建当前数组的一个副本,然后把接收到的参数添加到这个副本的末尾,最后返回新构建的数组
  • 所以也可以通过不给concat传参数的方式,得到一个当前数组的深拷贝。
  • 如果传入的参数是一个或多个数组,该方法会把这些数组中的每一项都添加到结果数组中,也会解开子数组的嵌套,与解构赋值相同的是,只会解开一层子数组的嵌套。

    1. var c = [].concat([1,[2, [3]]])
    2. c // [1, [2 , [3]]]
  • 如果传入的参数不是数组,这些值就会被简单的添加到结果数组的末尾

    arr.slice([begin[, end]])

  • 返回符合下面规则的数组↓

  • begin 可选
    • 提取起始处的索引(从 0 开始),从该索引开始提取原数组元素。
    • 如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
    • 如果省略 begin,则 slice 从索引 0 开始。
    • 如果 begin 大于原数组的长度,则会返回空数组。
  • end 可选

    • 提取终止处的索引(从 0 开始),在该索引处结束提取原数组元素。slice 会提取原数组中索引从 begin 到 end 的所有元素(包含 begin,但不包含 end)。
    • slice(1,4) 会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。
    • 如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
    • 如果 end 被省略,则 slice 会一直提取到原数组末尾。
    • 如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。

      every 迭代方法

  • 测试一个数组内的所有元素是否都能通过某个指定函数的测试。如果传入函数对每一项都返回true,它返回true。

    some 迭代方法

  • 测试一个数组内的所有元素是否都能通过某个指定函数的测试。如果传入函数对任一项返回true,它返回true。

    filter 迭代方法

  • 对数组中的每一项运行传入函数,返回该函数返回值为true的项组成的数组

    forEach 迭代方法

  • 对数组中的每一项运行传入函数,没有返回值。

    map 迭代方法

  • 对数组中的每一项运行传入函数,返回每次函数调用结果组成的数组

  • 如果传入函数没有具体声明形参数量,那么会被被传入三个参数:currentValue,index,array(原数组),也即是说:

    1. ['a', 'b', 'c'].map(console.log)
    2. // a 0 ["a", "b", "c"]
    3. // b 1 ["a", "b", "c"]
    4. // c 2 ["a", "b", "c"]

    reduce

  • 参数见「归并方法」

  • 从数组的第一项开始,逐个遍历到最后,构建一个最终返回的值。

    reduceRight

  • 参数见「归并方法」

  • 从数组的最后一项开始,逐个遍历到第一个,构建一个最终返回的值。

    归并方法

  • 以上两种方法都接收两个参数,一个在每一项上调用的函数和(可选的)作为归并基础的初始值。

  • 传入的函数接收四个参数:前一个值、当前值、当前索引、数组对象。这个函数返回的任意值都会作为第一个参数自动传给下一项。
    1. var values = [1,2,3,4,5]
    2. var sum = values.reduce(function(prev, cur) { return prev + cur })
    3. sum // 15

零散信息

1. 数组最多可以包含 42 9496 7295 项