一、定义

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始)。整个数组用方括号表示,数组的值用','分割;数组的数据可以是任何类型。

本质上,数组属于一种特殊的对象,对应的键名也是字符串"0", "1", "2"。。。。

var arr = ['a', 'b', 'c'];

Object.keys(arr)
// ["0", "1", "2"]

二、获取数组值

只能通过arr[0]的方式来获取数组值
因为单独的数值不能作为标识符,arr.0的写法不合法的。

var arr = [3, 4, 5, 6]
console.log(arr[3])      //6
console.log(arr[4])      //undefined

三、数组的基础操作

1、length属性

  • 1)可以直接设置length长度,没有具体数值的数组值,会以空位填充

clipboard.png

  • 2)人为设置length小于当前数组长度,超过length长度的数组的成员会被删除
    清空数组的方式,设置arr.length =0
var arr = [ 'a', 'b', 'c' ];
arr.length // 3

arr.length = 2;
arr // ["a", "b"]

2、in 运算符

1) 运算符in用于检查某个键名是否存在,适用于对象,也适用于数组。

var arr = [ 'a', 'b', 'c' ];
2 in arr  // true
'2' in arr // true
4 in arr // false

2) 如果数组的某个位置是空位,in运算符返回false

var arr = [];
arr[100] = 'a';

100 in arr // true
1 in arr // false

3、push (在数组最后再添加一个元素)

arr.push('jirengu')      //再数组最后添加一个元素
console.log(arr)         // [3, 4, 5, 6, 'hello', 'jirengu']

4、pop (删除数组最后一位并返回数值)

var value = arr.pop()    //把数组最后一位弹出来,返回 
console.log(value)       //'jirengu'

5、unshift (在数组第一位插入一个数值)

arr.unshift('ruoyu')     //在数组第一位新增
console.log(arr)         //['ruoyu', 3, 4, 5, 6, 'hello']

6、shift(删除数组第一位,并返回被删除值)

var value2 = arr.shift() //把数组第一位拿出来返回,数组发生变化
console.log(value2)      // 'ruoyu'

7、splice(替换数组的一部分,并把替换内容作为新数组返回)

var arr2 = arr.splice(1, 2)
splice的第一个参数:截断开始的下标;splice的第二个参数:截断长度。之后的参数为替换的内容。原数组会会变化,截取的部分自动为一个数组返回。
用途一:截断数组

arr= [3, 4, 5, 6, 'hello']

var arr2 = arr.splice(1, 2)         //从下标为1的元素开始,拿出来2个元素作为一个数组返回,原数组发生改变
console.log(arr)         // [3, 6, 'hello']
console.log(arr2)        //  [4, 5]

用途二:替换数组内容

arr= [3, 6, 'hello']
arr.splice(1, 0, 8,9)    //从下标为1的位置(元素6)开始,删除0个,新增两个元素(在6前面新增8,9)
console.log(arr)         //[3, 8, 9, 6, 'hello']

7、slice(截取数组)

slice的第一个参数:开始截断的下标;slice的第二个参数:结束截断数组的下标(不包括这个数)。原数组不会变化

arr=[3, 8, 9, 6, 'hello']
var arr3 = arr.slice(2,3)           //从 arr 下标为2开始,到下标为3结束(不包括3),做为新数组,原数组不变
console.log(arr3)       // [9]
console.log(arr)        //[3, 8, 9, 6, 'hello']

8、join('-')(用某个符号连接数组所有的值,生成字符串)

原数组不变

arr=[3, 8, 9, 6, 'hello']

var str = arr.join('-')
console.log(str)        // "3-8-9-6-hello"
console.log(arr.join(',')); //"3,8,9,6,hello"

9、arr.concat(array) (连接两个数组)

concat方法用于拼接数组,a.concat(b)返回一个a和b共同组成的新数组。
不会修改任何一个原始数组

var a = [1,2,3,4,5];
var b = [6,7,8,9];
console.log(a.concat(b));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(a); //[1, 2, 3, 4, 5]
console.log(b); //[6, 7, 8, 9]

10、reverse()数组逆序

用于将数组逆序,它会修改原数组

var a = [1,2,3,4,5];
a.reverse();
console.log(a); //[5, 4, 3, 2, 1]

11、sort(对数组进行排序)

1)没有参数,默认根据字符串Unicode码来排序。

var a=[5,4,3,2,1]
a.sort()
console.log(a) //[1, 2, 3, 4, 5]
var a=[7,8,9,10,11]
a.sort()
console.log(a) //[10, 11, 7, 8, 9]

2)可以自定义一个排序方式,如arr.sort([compareFunction]),比较规则如下

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前

或者是按照true和false来判断,true的话就会调换位置。
3)原数组会改变

var a = [7,8,9,10,11]

    a.sort(function(v1,v2){
        return v1-v2
    })
    console.log(a) //[7, 8, 9, 10, 11]

    var users = [
        {
            name: 'aaa',
            age: 21
        },
        {
            name: 'baa',
            age: 18
        },
        {
            name: 'abc',
            age: 24
        }
    ]
    // 按age 从小到大排序

    var sortByAge = users.sort(function(v1, v2){
        return  v1.age > v2.age
    })

  // 按name从大到小排序
    var sortByName = users.sort(function(v1, v2){
        return  v1.name > v2.name
    })

四:ES5 数组拓展(注意驼峰写法)

1、Array.isArray(arr)判断是不是数组

这是Array对象的一个静态函数,用来判断一个对象是不是数组

var a = [];
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false

2、indexOf(element)/ lastIndexOf(element)寻找数组是否有对应的内容

这两个方法用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。

var arr =[2,3,5,7,3,9]
arr.indexOf(3) //1

3、forEach(function(element,index,arry))遍历数组,对数组的每个元素执行一次提供的函数

1)原理:遍历数组,参数为一个回调callback函数,回调函数有三个参数:

  • element:数组当前项的值
  • index:数组当前项的索引(可选)
  • array:数组对象本身(可选)
  • thisArg:当执行回调 函数时用作this的值。如果给forEach传递了thisArg参数,当调用时,它将被传给callback函数,作为它的this值。否则,将会传入 undefined 作为它的this值(可选,爱用不用)

2)注意:

  • 数组内已删除或者未初始化的项不会遍历到
  • 返回值是:undefined,原数组会改变,这个和map和reduce不一样

3)举个例子

var arr=[1,2,5,6,8]
arr.forEach(function(e,i,arr){
arr[i]=e*e
})
console.log(arr)// [1, 4, 25, 36, 64]

4、map(function(element,index,arry))遍历数组,对数组的每个值执行函数操作,并把结果返回新数组

1)原理:遍历数组,对函数的每个值执行回调函数,返回值组成一个新数组。原数组不变
2)函数参数:

  • element:数组当前项的值
  • index:数组当前项的索引(可选)
  • array:数组对象本身(可选)
  • thisArg:执行 callback 函数时使用的this 值(可选)

3)返回值:
一个新数组,每个元素都是回调函数的结果

4)举个例子

var obj2 =[{ key:1,value:2},
          { key:4,value:8},
          { key:5,value:78}]
var array= obj2.map(function(obj){
var arr2=[]
 arr2[obj.key] =obj.value
return arr2})})        
          

5、filter(function(element,index,arry))遍历数组,对数组每一个元素执行callback函数,并将满足条件的值返回新数组

1)原理:遍历数组,对数组每一个元素执行callback函数,并将满足条件的值返回新数组。原数组不变
2)函数参数:

  • element:数组当前项的值
  • index:数组当前项的索引(可选)
  • array:数组对象本身(可选)
  • thisArg:执行 callback 函数时使用的this 值(可选)

3)返回值:
一个新的通过测试的元素的集合的数组,如果没有通过测试则返回空数组

4)举个例子

var a =[2,3,4,5,7,9,6]
console.log(a.filter(function(e){
return e%2==0
}))  //[2, 4, 6]

参考文献

6、reduce(function(v1, v2), value)遍历数组,对数组的值依次两两执行回调函数,将两个数组值合成一个值,reduce从索引最小值开始

1)原理:对累计器和数组中的每个元素(从左到右)应用一个函数,将其简化为单个值。
2)函数参数:

  • currentValue:数组中正在处理的元素
  • index:数组当前项的索引(可选)
  • array:数组对象本身(可选)
  • Accumulator (累计器):累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(初始值)
  • initialValue(初始值)(可选)作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用 reduce 将报错

3)返回值:
函数累计处理的结果

4)举个例子

var a = [1, 2, 3, 4, 5, 6]
var sumvalue= a.reduce(function(v1,v2){
return v1+v2})

将二维数组转化为一维

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  function(a, b) {
    return a.concat(b);
  },
  []
);
// flattened is [0, 1, 2, 3, 4, 5]

mdn文档
5)要点
回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值

7、every(function(element, index, array))测试数组的所有元素是否都通过了指定函数的测试

1)原理:
every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 false(表示可转换为布尔值 false 的值)的元素。如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 true,every 就会返回 true
2)函数参数:

  • element:数组当前项的值
  • index:数组当前项的索引(可选)
  • array:数组对象本身(可选)
  • thisArg:执行 callback 函数时使用的this 值(可选)

3)返回值:
true/false

4)举个例子

var a = [1, 2, 3, 4, 5, 6]

console.log(a.every(function(e){
return e>0}))  //true

5)every不会改变原数组 mdn

8、some(function(element, index, array))测试数组中的某些元素是否通过由提供的函数实现的测试

1)原理:
some 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,some 将会立即返回 true。否则,some 返回 false
2)函数参数:

  • element:数组当前项的值
  • index:数组当前项的索引
  • array:数组对象本身

3)返回值:
true/false

4)举个例子

var a = [1, 2, 3, 4, 5, 6]

console.log(a.some(function(e){
return e>5}))  //true

5)some不会改变原数组


bamboo
75 声望9 粉丝

bamboo前端学习笔记


« 上一篇
JSON 格式
下一篇 »
js 定时器笔记