1、稀松数组

  1. let arr = [1,2,3,4,5,6]
  2. delete arr[1]
  3. console.log(arr) // => [1,,3,4,5,6]
  4. console.log(arr[1]) // => undefined 等于arr['1'],没有值,所以返回undefined

2、类数组

是一种对象,有length属性,箭名是有顺序的数字下标;但是没有继承Array.prototype的方法。常见的类数组有:函数内部的arguments(构造函数是Object函数)、与dom集合字符串(唯一的原生类数组)。
类似于Array,但除了length属性和索引元素之外没有任何Array属性,可以进行遍历,但不能调用Array.prototype上的方法。
将类数组转换为数组:
(1)利用Array.prototype.slice.call()或者[].slice.call(),该方法会截取对应元素再返回新数组。

  1. function argumentsFoo(){
  2. let args = arguments
  3. return arguments
  4. }
  5. let myArguments = argumentsFoo(1,2,3)
  6. console.log(myArguments)
  7. let newArguments = Array.prototype.slice.call(myArguments)
  8. console.log(newArguments)

(2)利用es6的拓展运算符: [ …arguments ]

  1. function argumentsFoo(){
  2. let args = arguments
  3. return arguments
  4. }
  5. let myArguments = argumentsFoo(1,2,3)
  6. console.log(myArguments)
  7. let newArguments = [...myArguments]
  8. console.log(newArguments)

(3)使用Array.from()转化

  1. function argumentsFoo(){
  2. let args = arguments
  3. return arguments
  4. }
  5. let myArguments = argumentsFoo(1,2,3)
  6. console.log(myArguments)
  7. let newArguments = Array.from(myArguments)
  8. console.log(newArguments)

字符串可以遍历,但是不能直接改变length属性(push、pop等方法),会报错:
Cannot assign to read only property ‘length’ of object ‘[object String]’,字符串对象的length只读

数组方法总结

一、将数组每个元素转化为字符串后,再进行拼接,以及对应方法。

1、Array.prototype.toString
Array.prototype.toString方法被重写过,行为是,将数组每个元素字符串化后,用’ , ‘拼接成字符串。具有数组扁平化的功能。彻底扁平化。
2、Array.prototype.join
Array.prototype.join方法,把数组元素被转换成字符串,再用一个分隔符将这些字符串连接起来,并返回该字符串。如果缺少seperator,则默认用逗号来连接。join只会在最外层的元素之间添加分隔符进行拼接

  1. let arr = [1,2,[3,[4]]]
  2. console.log(arr.join())

3、与数组的join对应的是,String.prototype.split,以seperator进行分割,并将分割后的元素以数组的形式返回。

  1. let str = '1,2,3,4,5'
  2. console.log(str.split(',')) // => [1,2,3,4,5]
  3. //如果没有传分隔符,则将该字符串作为数组首项,进行返回

二、对数组头部、尾部的操作,会改变原数组

(1)push - unshift : 在数组头部、尾部添加元素,返回操作后数组的新长度
push(item1,……,itemN),在数组尾部添加若干元素。
unshift(item1,……,itemN),在数组头部添加若干元素。
用es3模拟以上方法。
(2)pop - shift 没有形参,删除数组首项或尾项,返回删除的元素。

三、数组排序, 改变原素组

(1)自定义排序 sort
sort默认将元素字符串化后,进行比较(字符串比较,是根据对位字符的unicode码来比较)。
接受一个函数,函数需要返回正、零、负值进行排序。
(2)反序 reverse

四、合并数组

(1)concat,不改变原数组。
(2)也可以用Array.prototype.push.apply来模拟合并,这个方法会改变原数组。
不能用push来模拟,因为push是直接把每个元素依次添加在数组尾部。而concat,遇到数组外的值,会直接添加到数组尾部,遇到数组时,会遍历一次数组,将每个元素添加在目标数组尾部。

  1. let arr1 = [1,2,3];
  2. console.log(arr1.concat(4,[5,6]))
  3. Array.prototype.push.apply(arr1,[4,[5,6]])
  4. console.log(arr1)

(3)利用es6拓展运算符

  1. let arr1 = [1,2,3],
  2. arr2 = [5,6,7];
  3. let arr3 = [...arr1,...arr2];
  4. console.log(arr3)

五、数组片段截取

slice,截取一定范围元素,并以数组形式返回。
start,可选。 截取开始位置,可正可负。
end,可选。
参数为左闭右开。如果开始与结束没有对应元素,则返回空数组。
另一个用处:Array.prototype.slice.call(arrLike) 如arguments、字符串、dom集合 。这样可以将类数组转化为数组

六、增删改查,改变原数组,返回删除的元素组成的数组。

splice,删-增。
start 指定删除开始位置。如果start小于零,开始位置为 ( arr.length + start )
deleteCount 删除个数。如果deleteCount省略,则从start开始删除后面所有元素。
newItem1,…..,newItemN, 新增的元素。

七、判断数组是否包含某个元素 es6

1、查找元素所在位置

(1)indexOf( item[, fromIndex] ),查找第一个对应元素所在位置,可指定查找开始位置。
(2)lastIndexOf( item[, fromIndex]),查找最后一个对应元素所在位置,可指定查找开始位置。
如果数组不包含对应元素,则返回 -1
可在数组去重过程中,判断是否数组已包含相关元素。

2、判断是否包含某个值,直接返回boolean

Array.prototype.includes( valuetoFind[, fromIndex] )

3、查找符合条件的第一个元素或元素索引

Array.prototype.find()返回数组中满足提供的测试函数的第一个元素的值,否则返回undefined
Array.prototype.findIndexOf()返回数组中满足提供的测试函数的第一个元素的索引,否则返回-1
这一组方法与Array.prototype.indexOf区别在于,这组方法可以自定义判断条件

八、es6中Array的一些静态方法。

(1)Array.of方法,将参数作为数组元素,创建新的数组。
用来解决Array()参数不定而导致的差异性行为:
Array只传一个number,产生length为number的空数组。
Array传多个number,则以number为数组元素,创建新数组。
(2)Array.from
将类数组转换为数组。(1、Array.prototype.slice.call; 2、es6拓展运算符,也是对Array.from的封装)

九、Array.fill填充方法。

通用方法,用于批量填充元素,改变原数组,返回改变后的数组。
value, 填充的值
start,填充开始位置,可正可负
end,可有可无,可正可负,默认this.length

十、数组方法对比

image.png