资讯专栏INFORMATION COLUMN

犀牛书——CHAP7:数组

Alfred / 2558人阅读

摘要:数组有以下特点无类型数组元素可以是任意元素。因此,当小于数组最大索引时,大于的数组元素会被删除。原数组不会改变将数组元素转换为字符串并连接在一起。默认将数组元素用,连接,传入的参数即为连接符。

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()方法调用。字符串可以看做是一种类数组。但是由于字符串是不可变的,只读,因此会对原数组做出改变的方法不能在字符串上调用。






文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79836.html

相关文章

  • 犀牛——CHAP8:函数

    摘要:若有函数名,则在函数体内指代该函数本身,并且只存在于函数体中。返回值与普通函数相同。如果嵌套函数作为普通函数调用,则指向全局对象或者构造函数调用在函数或者方法调用之前使用关键字,则为构造函数调用。创建一个新的对象继承构造函数的属性。 showImg(https://box.worktile.com/view/ddbade8c84bb41cdb20db15228584b8e?pid=4b...

    he_xd 评论0 收藏0
  • 犀牛——CHAP6:对象

    摘要:对象是属性的无序集合。使用对象直接量创建的对象的原型就是,使用运算符创建的对象的原型是构造函数的的值。主要目的是将对象锁定,避免外界干扰。判断对象是否封闭。删除属性可删除对象的自有属性且为的属性。 对象是属性的无序集合。因此,这一章主要从对象和属性两个方面来阐述。showImg(https://box.worktile.com/view/c8f5f376fe314aeca69d9b4c...

    philadelphia 评论0 收藏0
  • 如何循序渐进地学习Javascript

    摘要:如果在初学一门语言的时候第一想到的是问别人,是很难取得进步的。如果你真想学好,我有个大概的自学轨迹供你们参考。第一步,学习的编程。立即可以尝试的实例,也可以让的初学者马上看到效果。读懂别人的代码是学习,而改进别人的代码则是创造了。 javascript入门太容易了,导致几乎人人随便看看就能上手,零基础的人学个三五天都能对外宣称自己掌握了js。可是真正掌握js是一件很难的事情。如果在初学...

    DTeam 评论0 收藏0
  • 犀牛——CHAP10:正则表达式

    摘要:设计目的是为了让在全局范围内有效。在正则表达式后部引用前面的子表达式。传入分隔符或正则表达式。对象属性以下属性返回布尔值。是否包含修饰符以下不返回布尔值整个字符串下一次搜索开始的位置。返回布尔值,若匹配则返回。 1. 正则表达式语法 1.1 表示方法 - `//`字面量模式,`/表达式/修饰符` - 使用`new RegExp(字符串,修饰符 | 正则表达式)`构造函数。 在ES5中,...

    JessYanCoding 评论0 收藏0
  • Part1程序设计基础(Java语言程序设计(10th))

    摘要:缘起这是语言程序设计的,计划之前全部整理完。产生随机数的方法。复习题双分支语句复习题嵌套的语句和多分支语句复习题常见错误和陷阱常见错误两个浮点数值的相等测试复习题产生随机数产生一个到之间的随机值,不包括。 缘起 这是《Java语言程序设计(10th)》的Part1,计划2017-12-31之前全部整理完。 2017-12-23开始想看这本书的,并同时开始实践起Java来的。 Part...

    BDEEFE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<