JS 数组的定义+常用方法

一、数组定义的两种方式

1. 系统自带的构造方法

new Array(length/content);

例:
var arr = new Array(1,2,3,4,5)
这种写法和使用数组字面量实现的效果是一样的
var arr1 = new Array(10)
如果只传一个参数且是整数,系统会把这个数字当作要创建的数组的长度,来创建一个没值的空数组
在这里插入图片描述

2. 数组字面量

该方式和第一种方式差不多,也相当于new Array()

var arr = [];

例:
var arr = [1,2,3,4,5]
并不是数组的每一位都必须有值,如稀松数组
var arr = [1,,,,,0]
var arr1 = [,,]
在这里插入图片描述

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

二、数组的读和写

数组长度为num

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

例:
在这里插入图片描述

三、数组的常用方法

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

(1) 改变原数组

1. push()方法

在数组的末尾添加 任意类型 任意个数 的数据,返回添加数据后的数组长度
在这里插入图片描述
数组的push()方法能被重写

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

在这里插入图片描述
重写push方法模拟原push方法

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

将数组的最后一位元素剪切(删除+返回)出来,传或不传参数都是一样的,只会剪切最后一位
在这里插入图片描述

3. shift()方法

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

4. unshift()方法

向数组的首部添加 任意类型 任意个数 的数据,返回添加数据后的数组长度(和push()方法仅是添加位置的不同)
在这里插入图片描述
重写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()方法

将数组首尾倒置,对原数组进行操作,没有生成新的数组,返回的是倒置后的原数组,传参无效
在这里插入图片描述

6. splice()方法

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

格式:arr.splice(n,m[,k,....])
-参数n:从第几位开始剪切
-参数m:剪切的长度
-参数k,…:在在切口处要添加的新数据

剪切并添加数据:
在这里插入图片描述
在这里插入图片描述
只添加数据:
在这里插入图片描述

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

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

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

7. sort()方法

(2) 不改变原数组

1. concat()方法

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

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

在这里插入图片描述

2. toString()方法

arr.toString()
将数组arr以字符串的形式输出,传不传参没区别,不改变原数组
在这里插入图片描述

3. slice()方法

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

格式:arr.slice(n[,m])
-参数n:从该位置开始截取
-参数m:(可选)截取到该位置(不包括),没有参数m则默认截取到数组的末尾

在这里插入图片描述

4. join()方法和split()方法

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

join()方法将数组按给定的参数(默认逗号)作为元素之间的连接符,返回一个字符串
在这里插入图片描述
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())//不传参数默认逗号连接

在这里插入图片描述

str.split(参数)

split()方法是字符串的方法,不是数组的方法,将字符串的元素按给定的参数拆分成数组,和数组的join()方法可逆
在这里插入图片描述

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()方法

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

格式:arr.reduce(callback,[initialValue])
参数1:回调函数,数组中的每一个元素都会依次执行回调函数,不包括数组中被删除或从未被赋值的元素
-----参数previousValue :初始值 或 上一次回调函数的返回值
-----参数currentValue :当前元素
-----参数index:可选,当前元素下标
-----参数arr:可选,当前数组
参数2:可选,初始值,作为第一次调用回调函数时的第一个参数

let a = [4, 2, 3, 3]
  // reduce方法不改变原数组,返回归并后的值
  let b = a.reduce((previousValue , currentValue , index, arr) => {
      /**
       * 如果有提供初始值,第一次循环时previousValue 值就等于初始值
       * 如果没有提供初始值,第一次循环时previousValue 值为arr[0]
       * 后续循环中,previousValue 为上次循环的返回值
       */
      console.log(previousValue , currentValue , index, arr)
      //必须有return 否则下次循环previousValue 是undefined
      return previousValue + currentValue ;
  }, 0)
  console.log(b)

在这里插入图片描述
无初始值

let a = [4, 2, 3, 3]
  //reduce方法不改变原数组,返回归并后的值
  let b = a.reduce((previousValue , currentValue , index, arr) => 
      /**
       * 如果有提供初始值,第一次循环时previousValue 值为初始值
       * 如果没有提供初始值,第一次循环时previousValue 值为arr[0]
       * 后续循环中,previousValue 为上次循环的返回值
       */
      console.log(previousValue , currentValue , index, arr)
      //必须有return 否则下次循环previousValue 是undefined
      return previousValue + currentValue ;

  })
  console.log(b)

在这里插入图片描述
可以看到比设置初始值的少了一行输出,是因为没有设初始值,在第一次循环中previousValue为arr[0],currentValue为arr[1],直接进行计算了

由此得出结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 回调函数,跳过第一个索引;如果提供initialValue,从索引0开始。

8.reduceRight()方法

反向归并

9.filter()方法

用于过滤数组,满足条件的元素会被返回。该方法会返回一个新的数组,不会改变原数组

格式:arr.filter((item,index,arr)=>{return ...})
-参数item:当前元素
-参数index:当前元素位置
-参数arr:数组本身

let arr = [1, 2, 3, 4, 5]
let new_arr = arr.filter(item => item > 2) 
console.log(new_arr)
// 结果:[3, 4, 5]

可以使用filter()方法来移除数组中的undefined、null、NAN等值

let arr = [1, undefined, 2, null, 3, false, '', 4, 0]
let new_arr = arr.filter(Boolean)
console.log(new_arr)
// 结果:[1, 2, 3, 4]
  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值