前端——语言——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.铁路图 在本书中使用过的铁路图集中放在这部分附录中,其实读完本书之后,没 ...
随机推荐
- 题解【洛谷P2264】情书
题面 看到每一单词在同一句话中出现多次感动值不叠加,一眼想到 \(\text{set}\). 首先将词汇列表中的单词存储起来,我用的是 \(\text{set}\). 对于每一个句子的单词,我们可以先 ...
- ASP.NET MVC简单流程解释(传值方式)
在上篇笔记里我们创建了一个简单的MVC程序 在view中,@Model指的就是MyFirstMvc.Models.IndexModel,我们的提交页面是/Test/Index,当我们输入完数字并按下提 ...
- TAB_JG_COMMAND_SERVERINFO
简介 存储设备基本信息 表结构
- Java TreeSet集合 比较器排序Comparator的使用
比较器排序Comparator的使用 存储学生对象,并遍历,创建TreeSet集合使用带参构造方法 要求,按照学生年龄从小到大排序,如果年龄相同,则按照姓名的字母循序排序 结论 用TreeSet集合存 ...
- actiBPM插件的办法
1.下载actiBPM到本地 从IDEA官网下载actiBPM.jar包 IDEA官网:https://plugins.jetbrains.com/ 官网搜索actiBPM 2.从本地安装actiBP ...
- pve apt-get update error 升级报错-文章未完工和验证
pve: apt-get update error 升级报错 提示如下报错 Hit: http://security.debian.org buster/updates InRelease Hit: ...
- mysql 1130 Navicat for MySQL 连接MySQL 8.0 出现1130错误
可能是帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑登入MySQL后,更改"MySQL"数据库"user"表里的&q ...
- js学习(精华帖)
js获取当前域名.Url.相对路径和参数以及指定参数 js获取当前url组成部分 jquery操作select(增加,删除,清空)
- (复习)父子组件传值使用v-modal双向绑定,报错Avoid mutating a prop directly解决方案
报错:Avoid mutating a prop directly since the value will be overwritten whenever the parent component. ...
- 大数据-es(elasticsearch)
elasticsearch elasticsearch是lucene作为核心的实时分布式检索,底层使用倒排索引实现. 倒排索引原理 索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不 ...