每天一章犀牛书——CHAP7:数组
1. 数组
数组是值的有序集合,每个值被称为元素。
数组有以下特点:
无类型:数组元素可以是任意元素。
动态性:数组的长度是动态的,可随时增加和缩减。无需在创建时为其声明固定大小也无需在长度变化时重新分配空间。
数组是特殊的对象,并且经过优化,用索引访问数组比访问常规的对象属性快。
数组继承自Array.prototype的属性和方法
2. 数组的操作
2.1 创建数组
有两种方式创建数组。
通过数组直接量:[].[,,]这样是2个元素,并且数组元素的值为undefined.
使用构造函数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()方法调用。字符串可以看做是一种类数组。但是由于字符串是不可变的,只读,因此会对原数组做出改变的方法不能在字符串上调用。
关键字:JavaScript, 元素, 返回, 参数
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!