1. 数组

数组是值的有序集合,每个值被称为元素。
数组有以下特点:

  • 无类型:数组元素可以是任意元素。

  • 动态性:数组的长度是动态的,可随时增加和缩减。无需在创建时为其声明固定大小也无需在长度变化时重新分配空间。

  • 数组是特殊的对象,并且经过优化,用索引访问数组比访问常规的对象属性快。

  • 数组继承自Array.prototype的属性和方法

2. 数组的操作

2.1 创建数组

有两种方式创建数组。
1. 通过数组直接量:`[]`.[,,]这样是2个元素,并且数组元素的值为undefined.
2. 使用构造函数`new Array()`.不传入参数时创建空数组,一个数字参数为数组的长度,2个以上参数则每个参数为创建的数组的元素。

2.2 读写数组


使用方括号的语法可以读或者写数组元素。方括号内的内容是返回非负整数值的任意表达式。如果内容是负数或非整数,则会将其转换为字符串,就作为常规的对象属性来访问。如果使用了非负整数的字符串,就作为数组的索引访问。

2.3 数组长度

每个数组都有一个`length`属性,代表数组中元素的个数。**length属性一定大于数组索引的最大值**。因此,当length小于数组最大索引时,大于length的数组元素会被删除。

2.4 添加和删除数组元素


添加元素:(1)给数组的新索引赋值;(2)使用数组方法:push(),unshift(),splice()
删除元素:(1)使用delete运算符,数组长度并不会改变,访问该位置时返回undefined;(2)使用数组方法:pop(),shift(),splice()

2.5 数组遍历

(1)使用for循环遍历数组。 (2)使用数组方法遍历:forEach(),map()
- 跳过null,undefiend,不存在的元素:if(!a[i]) continue;
- 跳过值为undefiend和不存在的元素: if(a[i]===undefiend) continue;
- 跳过不存在元素但仍然要处理值为undefined的元素:if(!(i in a)) continue;

2.6 检测数组

使用`Array.isArray()`传入要检测的数组,若为数组则返回true.

3. 数组方法

将数组的方法分为:(1)原数组会改变;(2)原数组不会改变。从方法的作用和返回值来讲述。

3.1 原数组会改变

- `reverse()`:将元素倒序排列。返回逆序后的原数组。
- `sort([func])`:对元素进行排序。当不传递参数时,将元素转为字符串并按**字母表**顺序排序。传递参数比较函数时,若第一个函数参数在前则返回小于0,等于返回0,在后则返回大于0。返回排序后的原数组。
- `splice()`:添加或者删除元素。第一个参数为操作开始的索引,第二个参数为要删除的元素的个数,第三个参数为要加入数组的元素。若不传入第三个参数则为删除数组,若第二个参数为0则为添加元素。会直接在原数组上进行修改。返回由删除元素组成的**数组**,若未删除则返回空数组。
- `push()`:在数组的末尾添加一个新元素,相当于给a[a.length]赋值。返回数组的新长度。
- `pop()`:从数组的末尾删除一个元素。返回被删除的元素。
- `unshift()`:从数组的开头添加一个新元素。返回数组的新长度。
- `shift()`:从数组的开头删除一个新元素。返回被删除的元素。

3.2 原数组不会改变

- `join()`:将数组元素转换为字符串并连接在一起。默认将数组元素用“,”连接,传入的参数即为连接符。返回连接的字符串。
- `concat()` :不传入参数的时候就是复制调用的数组,传入参数则将传入的加入到复制的数组的后面。返回新数组。
- `slice()`:获取相应位置之间的子数组。第一个参数是开始的位置,第二个参数是结束的位置但不会获取该位置的元素,若无第二个参数则为数组末尾。返回获取的子数组。

- `reduce(),reduceRight()`:该方法的callback函数的参数为previousValue,currentvalue,index,array。第二个参数为初始值。callback作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。回调函数第一次执行时,previousValue 和 currentValue 可以是一个值,如果 initialValue 在调用 reduce 时被提供,那么第一个 previousValue 等于 initialValue ,并且currentValue 等于数组中的第一个值;如果initialValue 未被提供,那么previousValue 等于数组中的第一个值,currentValue等于数组中的第二个值。可用于数组扁平化和对数组求和等。reduceRight()则从从右向左合并。返回最后一次执行callback之后的值。

- `indexOf(),lastIndexOf()`:返回给定元素能找在数组中找到的第一个索引值,否则返回-1。第一个参数为要查找的元素,第二个参数为查找开始的位置。lastIndexOf从后向前找。

以下四种方法第一个参数为函数(callback),对数组的每一个元素调用一次该函数,会跳过delete删除的元素和从未被赋值的元素。该函数一般有三个参数:当前元素,元素索引以及数组。第二个参数可选,为第一个参数的this的值的对象,可以理解为callback.call(thisArg, element, index, array).
方法中遍历的范围在第一次调用 callback 前就会确定。调用后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是方法遍历到他们那一刻的值。已删除的项不会被遍历到。
- `forEach()`:从头至尾遍历数组,对每个元素调用指定的函数。没有办法中止或者跳出 forEach 循环,除了抛出一个异常。返回undefiend.
- `map()`:返回由原数组中的每个元素调用指定方法后的返回值组成的新数组。
- `filter()`:使用指定的函数测试所有元素。返回包含所有通过测试的元素的新数组。
- `every(),some()`:测试数组的所有元素是否都通过了指定函数的测试。如果全部元素都返回true则every()会返回true。如果有一个元素返回true,则some()返回true.这两种方法都执行**“短路操作”**,即对于every()来说,只要检测到某一个元素返回false,则直接返回false,不会再遍历以后的元素。对于some()来说,如果有一个返回true,则直接返回true

4. 数组的类别

- 稀疏数组:数组中至少有一个元素未被赋值。当用in操作符(index in array)检查索引是否存在于数组时,返回false.若元素被赋值为undefined时,in操作符也会返回true.
- 多维数组:使用两次[]操作符访问数组中的数组。
- 类数组:具有(1)数值length属性;(2)非负整数属性的对象可以看做是类数组。由于这些类数组并不是继承自Array.prototype,所以不能使用数组方法,但是可以通过Function.call()方法调用。字符串可以看做是一种类数组。但是由于字符串是不可变的,只读,因此会对原数组做出改变的方法不能在字符串上调用。







Yawenina
2.3k 声望117 粉丝