前端——语言——Core JS——《The good part》读书笔记——第六章节(Arrays)
本章介绍数组的内容,Java中的数组在创建时,会分配同等大小的内存空间,一旦创建数组的大小无法改变,如果数据超过数组大小,会进行扩容操作。并且数组的元素类型在创建时必须是已知的,而且只能存放相同数据类型的元素。
JS的数组,它与硬件的概念不沾边,在创建时等同于创建了一个对象,只不过对象的属性必须是数字,而且由编译器自动管理。数组的大小概念是对象拥有多少个属性,数组的元素可以是任何值,没有数据类型的约束。
与Java数组对比,JS的数组更偏向于对象的概念,与数组的数据结构也没有任何关系,不具有快速的查询速度,在中间插入数据,删除数据缓慢的特点。
本章的内容不在依照书籍的原始结构目录结构,而是将分为两类知识点,数组(容器)本身和元素(元素)。
数组(容器):
- 操作:创建,合集,过滤,测试,聚合,排序,类型判断,清空,转换为字符串。
- 概念:sparse数组,多维数组,”array-like”对象。
元素:
- 操作:添加,修改,删除,查询,遍历。
以下是书籍的元素结构
- 第一小节介绍数组的字面量
- 第二小节介绍数组的length属性
- 第三小节介绍数组的删除
- 第四小节介绍数组的遍历
- 第五小节介绍类型判断
- 第六小节介绍数组的方法
- 第七小节介绍多维数组
1.1 数组字面量
通过字面量创建数组非常方便,它的格式为var arr = []。
基于JS数组的理解,当给数组中添加元素时,会自动添加数字的属性,例如arr.push(“val 1”),此时自动给数组对象添加属性”0”。程序员也可以指定属性的名称,arr[1000] = “val 1000”,此时数组称为sparse数组,因为的数字属性不是连续的,中间存在间隔。
1.2 length属性
数组的length属性表示数组的长度。
当数组不是sparse数组时,数组的长度与数组的大小含义是相同的,都表示数组元素的个数。
当数组是sparse数组时,数组的长度为数组的最大索引值加1。
数组的length属性随着元素的添加和删除在动态改变,当使用push,unshift等方式添加元素时,length值加1,当使用splice,pop,shift方式删除元素时,length值减1。注意在使用delete删除元素时,length的值并不改变,这是因为delete元素本质是将元素的值修改为undefined。
数组的length属性可以修改,大于length的索引值对应的元素会被删除,可以通过设置length为0,清空当前数组。
1.3 删除
- 删除数组的方式有以下几种
- delete方式,它将元素设置为undefined,length值不改变
- splice方式,它将数组的元素用新元素替换,会导致数组的整体移动。
- pop方式,删除最后一个元素并返回该元素,删除元素的位置固定。
- shift方式,删除第一个元素并返回该元素,会导致数组整体向前移动,删除位置较为固定
- 修改length属性的值,但是一般不这样做,除非某些特殊情况,例如清空数组时修改length值为0很方便。
1.4 遍历
遍历数组使用for循环,使用for-in时,循环数组的所有属性值,包括那些继承的属性。
1.5 判断
判断对象为数组的方式有
- 使用isArray方法。
- 使用constructor属性值,缺点在于多窗口时,无法判断
- 使用constructor的name属性,获取构造器名称的方法需要自己编写。
- 使用class属性值,截取后面八位的值。
1.6 元素方法
1.6.1 添加
添加元素有两种方式:字面量赋值,通过方法
- 字面量:array[index] = value;
- 方法:通过push,unshift,splice。
方法3- 16 push方法
名称 |
push |
描述 |
往数组末尾添加元素,可以一次添加多个元素 |
参数 |
参数:elem1,elem2,elemN
|
示例 |
var array = [3,2,1]; array.push(“a”,”b”) // 返回3,2,1,a,b。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push |
方法3- 17 unshift方法
名称 |
unshift |
描述 |
与push方法基本相同,区别在于往数组开头添加元素,所有的元素都往后移。 |
方法3- 18 splice方法
名称 |
splice |
描述 |
添加或删除数组元素,本质上是使用参数中的元素替换数组中的元素。若参数元素个数大于需要替换的元素,则为添加元素,小于时,则为删除元素,相等时,为替换元素。 |
参数 |
参数:start
|
参数:num
|
|
参数:elem1,elem2,elemN等
|
|
示例 |
var array = [3,2,1]; array.splice(1) // 返回2,1;array为[3] array.splice(1,1) // 返回2;array为[3,1]; array.splice(1,1,”a”,”b”,”c”),返回2;array为[3,”a”,”b”,”c”,1]; 注:这里假设每次splice操作之前array的值都为[1,2,3] |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift |
1.6.2 删除
删除元素有三种方式:字面量,delete操作符,方法。
- 字面量:array[index] = undefined
- delete:delete array[index]
- 方法:pop,shift,splice。
方法3- 19 pop方法
名称 |
pop |
描述 |
从末尾中取出元素,并删除该元素。返回值为取出的元素 |
示例 |
var array = [3,2,1]; array.pop() // 返回3,2。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop |
方法3- 20 unshift方法
名称 |
unshift |
描述 |
与pop方法基本相同,区别在于取出数组开头的元素,并删除,所有的元素都往前移动。效率很低。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift |
1.6.3 查找
查找的方法indexOf,lastIndexOf。
方法3- 21 indexOf方法
名称 |
IndexOf |
描述 |
在数组从start位置开始查找(从左--->右)元素x,如果都不指定时,默认为整个数组。找到元素,返回元素的索引值,失败返回-1。 |
参数 |
参数:x
|
参数 |
参数:start
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.indexOf(1) // 返回1 tempArray.indexOf(1,3) // 返回-1,在[4,5]中不存在1。 |
方法3- 22 lastIndexOf
名称 |
LastIndexOf |
描述 |
与indexOf作用相同,唯一区别在与lastIndexOf从右--->左进行搜索。 |
参数 |
参数:x
|
参数 |
参数:start
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.indexOf(1) // 返回1 tempArray.indexOf(1,3) // 返回-1,在[4,5]中不存在1。 |
1.6.4 遍历
遍历数组的方法有三种:foreach方法,for循环,jQuery的each方法。
方法3- 23 foreach方法
名称 |
forEach |
描述 |
遍历数组中的所有元素,break关键字无法结束forEach的循环,使用return可以。 |
参数 |
参数:function(value,index,array)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.forEach(function(value){ console.log(value); }) |
1.7 容器方法
1.7.1 创建
创建数组可以通过三种方式,字面量,构造器,方法。
- 字面量:var tempArray = [elem1,elem2,elem3,,elem4];数组中可以出现连续的逗号,此时该元素为undefined,在计算数组的length时需计算该元素。
- 构造器:构造器存在三种形式
- 第一种形式,无任何参数 tempArray = new Array();
- 第二种形式,只有一个参数,此时参数的含义指定数组的大小,new Array(10);
- 第三种形式,拥有多个参数,这些参数为数组的元素。new Array(1,2,3)
- 方法:
表格2- 24 concat方法
名称 |
concat |
描述 |
对数组元素进行拼接,返回新的数组。 若参数为普通数据类型,为当前元素与参数元素的并集, 若参数为数组,为当前元素与数组的并集, 若没有参数,返回当前数组的拷贝。 若参数中存在嵌套数组时,不会循环提取嵌套中的数组,而是将其作为一个数组元素进行处理。 |
示例 |
Var array = [3,2,1]; array.concat (4) // 返回[3,2,1,4] |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat |
表格2- 25 map方法
名称 |
Map |
描述 |
遍历数组的元素,根据function(value)当前的返回值构建新的数组。 |
参数 |
参数:function(value,index,array)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.map(function(value){ return value *2; }) // 此时构建的数组为原来元素 * 2。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map |
1.7.2 过滤
过滤的方法有filter。
方法3- 24 filter方法
名称 |
filter |
描述 |
遍历数组中的所有元素,若function(value)返回true,把当前元素放入到新数组中,返回false,则什么都不做。对于null与undefined元素会自动忽略。 |
参数 |
参数:function(value,index,array)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.filter(function(value){ return value >=2; }); // 返回[2,3,4,5] |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter |
1.7.3 排序
排序的方法有sort,reverse
方法3- 25 sort方法
名称 |
sort |
描述 |
对数组元素进行排序,当不传入任何排序算法时,按自然排序方式正序排序。传入排序算法时,按照排序算法排序 |
参数 |
参数:function(a,b) l 说明:排序算法,a表示当前元素,b表示后一个元素,若函数返回值小于0,则a < b,排在b之前;若大于0,则a >b,排在b之后。 l 类型:排序算法。 l 是否必填:否,默认值为自然排序。 |
示例 |
var array = [3,2,1]; array.sort() // 返回1,2,3 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort |
方法3- 26 reverse方法
名称 |
reverse |
描述 |
对数组元素进行逆序,即array.length -1的元素与0元素互换位置,length-2的元素与1元素互换位置,以此类推。 |
示例 |
var array = [3,2,1]; array.reverse() // 返回1,2,3 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse |
1.7.4 测试
测试的方法有every,some
方法3- 27 every方法
名称 |
every |
描述 |
遍历数组中的所有元素,若function(value)返回false,停止循环,并且every返回false。 表示的含义是数组中所有元素必须都满足function的条件。 |
参数 |
参数:function(value,index,array)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.every(function(value){ return value >=1; }); // 返回true。若 value <=3,则返回false,因为4,5不满足。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every |
方法3- 28 some方法
名称 |
some |
描述 |
与every相反,若数组中存在任意一个满足条件的元素,则中断循环,并且返回true。 |
参数 |
参数:function(value,index,array)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.some(function(value){ return value >=1; }); // 返回true。若 value <=3,则返回true,因为1,2,3满足条件。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some |
1.7.5 聚合
聚合的方法有reduce,reduceRight。
方法3- 29 reduce方法
名称 |
reduce |
描述 |
若数组中没有元素,抛出异常,存在一个元素,返回当前元素,存在两个或两个以上的元素,则将两个元素的运算结果返回,并将结果作为参数与第三个元素进行运算,以此类推,直到数组中所有的元素都参与过运算。 |
参数 |
参数:function(a,b)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.reduce(function(a,b){ return a+b; }); // 返回15. |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce |
方法3- 30 reduceRight方法
名称 |
reduceRight |
描述 |
与reduce相同,只不过运算的执行顺序为右--->左。对于对象执行顺序比较敏感的运算会与reduce存在差别,例如减号。不敏感的则完全相同 |
参数 |
参数:function(a,b)
|
示例 |
var tempArray = [1,2,3,4,5]; tempArray.reduceRight(function(a,b){ return a-b; }); // 返回-5。5-4-3-2-1。 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight |
1.7.6 转换字符串
转换字符串的方法有toString,toLocalString,join。
方法3- 31 join方法
名称 |
join |
描述 |
将数组元素使用分隔符拼接为字符串 |
参数 |
参数:separator
|
示例 |
Var array = [1,2,3]; array.join(“,”) // 返回1,2,3 |
链接 |
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join |
1.7.6 自定义
如果数组中现有方法无法满足你的需求,可以通过修改Array.prototype的方式添加自定义方法。代码如下
- $(function(){
- // 添加数组元素
- appendArrayMethod();
- // 测试size方法
- testSize();
- // 测试intersect方法
- // testIntersect();
- // 测试差集的方法
- testDiffer();
- });
- // 给数组添加三个方法,数组的大小,交集,差集
- function appendArrayMethod(){
- $.extend(Array.prototype,(function(){
- /**
- * 返回数组的大小
- * @returns {number}
- */
- function size(){
- var size = 0;
- this.filter(function(){
- size ++;
- });
- return size;
- }
- /**
- * 计算两个数组的交集
- * @param array
- * @returns {*}
- */
- function intersect(array){
- if(!array) throw {name:"非法参数",message:"交集运算,参数必须存在"};
- if(!Array.isArray(array)) throw {name:"非法参数",message:"交集运算,参数必需是数组"};
- return this.filter(function(value){
- return array.indexOf(value) !== -1
- });
- }
- /**
- * 计算两个数组的差集
- * @param array
- */
- function differ(array)
- {
- if(!array) throw {name:"非法参数",message:"差集运算,参数必须存在"};
- if(!Array.isArray(array)) throw {name:"非法参数",message:"差集运算,参数必需是数组"};
- return this.filter(function(value){
- return array.indexOf(value) === -1;
- })
- }
- return {
- size:size,
- intersect:intersect,
- differ:differ
- }
- })())
- }
- /**
- * 测试size方法
- */
- function testSize()
- {
- var arr1 = ["a","b","c"];
- console.log(arr1.size()); // 返回3
- arr1[1000]="d";
- console.log(arr1.size()); // 返回4
- }
- /**
- * 测试交集的方法
- */
- function testIntersect()
- {
- var arr1 = ["a","b","c"];
- var arr2 = ["c","d","e"];
- console.log(arr1.intersect(arr2));
- console.log(arr1.intersect(null));
- }
- /**
- * 测试差集的方法
- */
- function testDiffer()
- {
- var arr1 = ["a","b","c"];
- var arr2 = ["c","d","e"];
- console.log(arr1.differ(arr2));
- console.log(arr1.differ(null));
- }
1.8 多维数组
JS中多维数组的概念含义是数组的元素为数组元素,可以理解为数组的相互嵌套。
至此本篇内容结束,该书的第八章节介绍数组的方法将不再重复介绍。
前端——语言——Core JS——《The good part》读书笔记——第六章节(Arrays)的更多相关文章
- 前端——语言——Core JS——《The good part》读书笔记——初篇
本书是一本经典,优秀的JS书籍. 目的 在书籍中作者多次提及本书的目的,让读者去发现语言中的精华部分,避免糟粕部分,提高代码的编写质量.简述为取其精华去其糟粕. 本书的内容只涉及到Core JS部分, ...
- 前端——语言——Core JS——《The good part》读书笔记——第九,十章节(Style,Good Features)
第九章节 本章节不再介绍知识点,而是作者在提倡大家培养良好的编码习惯,使用Good parts of JS,避免Bad parts of JS.它是一篇文章. 本文的1-3段阐述应用在开发过程中总会遇 ...
- 前端——语言——Core JS——《The good part》读书笔记——第一章节(Good Parts)
本章是引言,有四个小节,具体内容如下: 第一小节 第一小节介绍作者的观点,作者编写本书的目的. 原文:I discovered that I could be a better programmer ...
- 前端——语言——Core JS——《The good part》读书笔记——第四章节(Function)
本章介绍Function对象,它是JS语言最复杂的内容. Java语言中没有Function对象,而是普通的方法,它的概念也比较简单,包含方法的重载,重写,方法签名,形参,实参等. JS语言中的Fun ...
- 前端——语言——Core JS——《The good part》读书笔记——第五章节(Inheritance)
本章题目是继承,实质上介绍JS如何实现面向对象的三大特性,封装,继承,多态.本章的最后一个小节介绍事件. 与Java语言对比,虽然名称同样称为类,对象,但是显然它们的含义存在一些细微的差异,而且实现三 ...
- 前端——语言——Core JS——《The good part》读书笔记——第七章节(正则)
本章介绍正则表达式的内容.正则表达式是一门独立的语言,它拥有自己的语法规则,在学习本章之前需要了解基本的语法规则. 正则表达式是通用的,意味着同样的语法规则可以适用于不同的编程语言,相同的正则表达式在 ...
- 前端——语言——Core JS——《The good part》读书笔记——第三章节(Object)
本章介绍对象. 在学习Java时,对象理解为公共事物的抽象,实例为具体的个例,对象为抽象的概念,例如人为抽象的概念,具体的个例为张三,李四. Java对象种类多,包含普通类,JavaBean,注解,枚 ...
- 前端——语言——Core JS——《The good part》读书笔记——第八章节(Methods)
本章介绍JS核心对象的方法.这些对象包括Array,Function,Number,Object,RegExp,String.除这些常用的核心对象还有Date,JSON. 本章更偏向于API文档,介绍 ...
- 前端——语言——Core JS——《The good part》读书笔记——附录三,四,五(JSLint,铁路图,JSON)
1.JSLint 本书的JSLint部分只是一个引言,详细了解该工具的使用参考http://www.jslint.com/ 2.铁路图 在本书中使用过的铁路图集中放在这部分附录中,其实读完本书之后,没 ...
随机推荐
- 我的第一个Maven Helloworld
使用MAVEN创建项目可以有两种方式进行创建,第一种,使用mvn命令创建Maven项目,第二种,使用eclipse创建Maven项目. 在创建Maven项目之前,我们需要安装maven,并和配置JDK ...
- 1米(m)=10分米(dm)=10^2厘米(cm)=10^3毫米(mm) =10^6微米(um)=10^9纳米(nm)=10^10埃米(A)=10^12皮米(pm)
millimeter 毫米 micrometer 微米 nanometer 纳米 square meter 平方米
- ASP.NET 模型验证2--验证部分属性
在开发MVC时,模型验证非常常见,平常我们用的应该都是全验证 if(ModelState.IsValid){ //验证成功要做的事 .....} 但是有时候我们需要部分验证,比如修改用户信息时,因为更 ...
- 记录 shell学习过程(2) read的用法
echo -n "login:"read username #read后面直接使用一个变量用于接收输入的数据 echo -n "password:"read ...
- Learn from Niu 2020.1.21
1. 你一定要看计算机领域的文章. 如果你是看一堆应用,你最终还是会不知道怎么做. 从计算机到energy是降维打击, 当你学习了计算机的hot skill,再去做应用很容易. 2. 搞研究的思路: ...
- 如何在vivado中调用ultraedit 编辑器
ISE下点击菜单Edit -> Preferences -> Editor. 在Editor选项框里选择Custom,在Command line syntax文本框里输入: {C:/Pro ...
- 【NOIP2012普及组】质因数分解
P1075 质因数分解 假期第一天就给一道入门难度的题写题解…… 这道题一开始就被我想复杂了:埃式筛,欧拉筛……然而开一个1e9的数组?不现实. 直到看到题解区的dalao用唯一分解定理: 算术基本定 ...
- 第四篇,JavaScript面试题汇总
JavaScript是一种属于网络的脚本语言,已经被广泛用于web实用开发,常用来为网页添加各种各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- MonoBehaviour单例的另外一种省事的写法
using UnityEngine; public class CommSystem: SingletonGeneric<CommSystem> { public static strin ...
- OpenCV之Core组件进阶
颜色空间缩减 利用C++类型转换时向下取整操作,实现定义域内颜色缩减.表达式如下 Inew = (Iold/10)*10 简单的颜色空间缩减算法可由以下两步组成: (1)遍历图像矩阵的每个元素 (2) ...