数组定义的两种方式

1. 系统自带的构造方法

new Array(length/content);

例:

var arr = new Array(1,2,3,4,5) 这种写法和使用数组字面量实现的效果是一样的

var arr1 = new Array(10)

如果只传一个参数且是整数,系统会把这个数字当作要创建的数组的长度,来创建一个没值的空数组

javascript数组的声明方法 js如何声明一个数组_javascript数组的声明方法

2. 数组字面量(该方式和第一种方式差不多,也相当于new Array())

var arr = [];

例:

var arr = [1,2,3,4,5] 并不是数组的每一位都必须有值,如稀松数组

var arr = [1,,,,,0]

var arr1 = [,,]

javascript数组的声明方法 js如何声明一个数组_js_02

数组能使用的所有方法都来源于Array.prototype

数组的读和写

数组长度为num

  • arr[num] //不报错 读出来是undefined
  • arr[num] = xxx; //可以溢出写

例:

javascript数组的声明方法 js如何声明一个数组_js_03

数组的常用方法

数组能使用的所有方法都来源于Array.prototype

改变原数组

1. push()方法

在数组的末尾添加 任意类型 任意个数 的数据,返回添加数据后的数组长度

javascript数组的声明方法 js如何声明一个数组_字符串_04


数组的push()方法能被重写

Array.prototype.push = function(){
  return 'haha'
}

javascript数组的声明方法 js如何声明一个数组_js_05


重写push方法模拟原push方法

Array.prototype.push = function(){
  for(var i = 0;i<arguments.length;i++){
    this[this.length] = arguments[i];
  }
  return this.length
}
2. pop()方法

将数组的最后一位元素剪切(删除+返回)出来,传或不传参数都是一样的,只会剪切最后一位

javascript数组的声明方法 js如何声明一个数组_回调函数_06

3. shift()方法

将数组的第一位元素剪切(删除+返回)出来,传或不传参数都是一样的,只会剪切第一位(和pop()方法仅操作位置不同)

javascript数组的声明方法 js如何声明一个数组_字符串_07

4. unshift()方法

向数组的首部添加 任意类型 任意个数 的数据,返回添加数据后的数组长度(和push()方法仅是添加位置的不同)

javascript数组的声明方法 js如何声明一个数组_数组_08


重写unshift方法模拟原unshift方法

Array.prototype.unshift = function(){
 var arr = []
 for(var i = 0;i<arguments.length;i++){
  arr[i]=arguments[i]
 }
 arr.push(...this)
 for(var i = 0;i<arr.length;i++){
  this[i]=arr[i]
 }
 return this.length
}
5. reverse()方法

将数组首尾倒置,对原数组进行操作,没有生成新的数组,返回的是倒置后的原数组,传参无效

javascript数组的声明方法 js如何声明一个数组_javascript数组的声明方法_09

6. splice()方法

从数组的指定位置剪切(删除+返回)并添加相应的数据或只添加数组

格式:arr.splice(n,m[,k,....])

  • 参数n:从第几位开始剪切
  • 参数m:剪切的长度
  • 参数k,…:在在切口处要添加的新数据

剪切并添加数据:

javascript数组的声明方法 js如何声明一个数组_javascript数组的声明方法_10


javascript数组的声明方法 js如何声明一个数组_javascript数组的声明方法_11


只添加数据:

javascript数组的声明方法 js如何声明一个数组_数组_12

注意:
数组的方法允许使用负数的下标

计算公式:pos(数组元素下标) = pos > 0 ? 0 : 数组长度

-1 -> 最后一位元素
-2 -> 倒数第二位元素
-3 -> 以此类推…

7. sort()方法

不改变原数组

1. concat()方法

arr.concat(arr1) 将数组arr和arr1拼接成一个新数组并返回,原数组不变

let arr = [1,2,3]
let arr1 = [4,5,6]
console.log(arr.concat(arr1))

javascript数组的声明方法 js如何声明一个数组_js_13

2. toString()方法

arr.toString() 将数组arr以字符串的形式输出,传不传参没区别,不改变原数组

javascript数组的声明方法 js如何声明一个数组_回调函数_14

3. slice()方法

从数组的指定位置截取(不删除 只返回)数据,不改变原数组

格式:arr.slice(n[,m])

  • 参数n:从该位置开始截取
  • 参数m:(可选)截取到该位置(不包括),没有参数m则默认截取到数组的末尾
4. join()方法和split()方法

arr.join(字符串<数字也可以,但字符串是标准语法>)

join()方法将数组按给定的参数(默认逗号)作为元素之间的连接符,返回一个字符串

javascript数组的声明方法 js如何声明一个数组_数组_15


join()方法可用于拼接字符串,相比栈内存的操作(原始值存储在栈内存中,先进后出)更高效

let str = 'alibaba';
let str1 = 'baidu';
let str2 = 'tencent';
let str3 = 'toutiao';
let str4 = 'aha';
let str5 = 'ohuo';
let strFinal = '';
var arr = [str,str1,str2,str3,str4,str5];//数组是个散列结构,存储在堆内存中
console.log(arr.join(''))
console.log(arr.join())//不传参数默认逗号连接

javascript数组的声明方法 js如何声明一个数组_javascript数组的声明方法_16

str.split(参数)

split()方法是字符串的方法,不是数组的方法,将字符串的元素按给定的参数拆分成数组,和数组的join()方法可逆

javascript数组的声明方法 js如何声明一个数组_数组_17

5.some()方法

用于监听数组中是否有元素满足指定条件,方法会遍历数组中的每个元素并执行逻辑,如果有一个元素满足条件,则不再继续遍历并返回true;如果没有满足条件的元素,则返回false

格式:arr.some(func(currentVal,index,arr),thisVal)

参数1:遍历每个元素时的回调函数

  • 参数currentVal:当前遍历到的元素值
  • 参数index:可选,当前元素索引值
  • 参数arr:可选,当前元素所属数组对象

参数2:可选,可指定回调函数内部的this指向对象,如果没有传或为null,回调函数里的this指向全局window(前提是回调函数不是箭头函数的形式)

some()不会对空数组进行检测

6.every()方法

用于检测数组所有元素是否都符合指定条件
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测;如果所有元素都满足条件,则返回 true。

every() 不会对空数组进行检测

7.reduce()方法

归并,遍历数组的所有项,并构建一个最终值,并返回

手写reduce
有初始值

let a = [4, 2, 3, 3]
  //reduce方法不改变原数组,返回归并后的值
  let b = a.reduce((sum, item, index, arr) => {//最多四个参数,①累加结果②当前元素③当前元素下标(可选)④当前数组(可选)
      //第一个参数是个回调函数

      /**
       * 如果有提供初始值,第一次循环时sum值为初始值
       * 如果没有提供初始值,第一次循环时sum值为arr[0]
       * 后续循环中,sum为上次循环的返回值
       */
      console.log(sum, item, index, arr)
      //必须有return 否则下次循环sum是undefined
      return sum + item;

  }, 0)//第二个参数是归并的初始值,可选
  console.log(b)

javascript数组的声明方法 js如何声明一个数组_js_18


无初始值

let a = [4, 2, 3, 3]
  //reduce方法不改变原数组,返回归并后的值
  let b = a.reduce((sum, item, index, arr) => {//最多四个参数,①累加结果②当前元素③当前元素下标(可选)④当前数组(可选)
      //第一个参数是个回调函数

      /**
       * 如果有提供初始值,第一次循环时sum值为初始值
       * 如果没有提供初始值,第一次循环时sum值为arr[0]
       * 后续循环中,sum为上次循环的返回值
       */
      console.log(sum, item, index, arr)
      //必须有return 否则下次循环sum是undefined
      return sum + item;

  })//第二个参数是归并的初始值,可选
  console.log(b)

可以看到比设置初始值的少了一行输出,是因为没有设初始值,在第一次循环中sum为arr[0],item为arr[1],直接进行计算了

javascript数组的声明方法 js如何声明一个数组_字符串_19

8.reduceRight()方法

反向归并