犀牛书——CHAP7:数组

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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
java.lang.ClassNotFoundException是Java中的一个异常类,表示在运行时找不到指定的类。当Java虚拟机(JVM)尝试加载一个类时,如果找不到该类的定义,就会抛出ClassNotFoundException异常。 在你的引用中,你提到了一个java.lang.ClassNotFoundException: com.example.YourServlet异常。这个异常通常发生在使用Java Servlet时,当服务器无法找到指定的Servlet类时抛出。 要解决这个异常,你可以采取以下步骤: 1. 确保你的类路径正确:检查你的项目配置和部署环境,确保Servlet类的路径正确。如果你使用的是Java Web容器(如Tomcat),请确保Servlet类位于正确的目录下。 2. 检查类名拼写:检查你的代码中的类名拼写是否正确。确保类名的大小写和包名的正确性。 3. 检查依赖项:如果你的Servlet类依赖于其他类或库,确保这些依赖项已正确地添加到你的项目中,并且可以在运行时访问到。 4. 清理和重新构建项目:有时,编译错误或构建问题可能导致类文件无法正确生成。尝试清理和重新构建你的项目,以确保所有的类文件都已正确生成。 5. 检查类加载器:如果你在自定义类加载器中加载类,确保你的类加载器能够正确找到并加载指定的类。 6. 检查运行时环境:如果你在不同的环境中运行你的应用程序(例如开发环境和生产环境),请确保运行时环境中存在所需的类。 下面是一个示例代码,演示了如何处理java.lang.ClassNotFoundException异常: ```java try { Class.forName("com.example.YourServlet"); } catch (ClassNotFoundException e) { e.printStackTrace(); // 处理异常的代码 } ``` 这段代码尝试加载名为"com.example.YourServlet"的类。如果找不到该类,就会抛出ClassNotFoundException异常,并且可以在catch块中处理该异常。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值