1、基本知识

1、数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中的位置称为索引,以数字表示,以0开始。
2、数组是无类型的。数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型。数组的元素可以是对象或其它数组。
3、数组是动态的,数组长度可长可短。在创建数组时无须声明一个固定的大小或者在数组大小变化时无须重新分配空间
4、数组可以是稀疏的。数组元素的索引不一定是连续的,它们之间可以有空缺,每个数组都有一个length属性,针对非稀疏数组,该属性就是数组元素的个数,针对稀疏数组,length比实际元素个数要大。
5、JavaScript数组是JavaScript对象的特殊形式。数组索引可以认为是整数的属性名。
6、数组继承自Array.prototype中的属性。它定义了许多的方法,它们对真正的数组和类数组对象都有效。如,字符串、arguments等。

2、操作数组

2.1 创建数组

2.1.1 字面量创建

举个例子:

let empty = [];
let arr1 = [2, 3, 5, 7, 11];
let arr2 = [1.1, true, "a"];
let i = 10;
let arr3 = [i, i + 1, i++, ++i];
let arr4 = [
[1, { x: 1, y: 2 }],
[2, { x: 3, x: 4 }],
];
let arr5 = [1, , 3];
let arr6 = [, ,];

2.1.1 构造函数Array( )创建

可以通过new Array()创建数组,如:

let arr1 = new Array(); //相当于[]
let arr2 = new Array(5);
let arr3 = new Array(1, 2, 3, "四", "五", "六");

2.2 读写数组元素

2.2.1 使用[ ]操作符来访问数组中的一个元素。

注意:
1、方括号中是一个返回非负整数值的任意表达式。
2、使用该语法既可以读又可以写数组的一个元素。
3、若数组的索引小于0,则默认将该索引值作为数组中的一个属性。
举个例子:

let a = ["world"];
let value = a[0];
a[1] = 3.14;
i = 2;
a[i] = 3;
a[i + 1] = 4;
a[a[i]] = a[0];
a["10"] = "hi";
a["ten"] = "hoo";
a[-2] = -2;
a[1.11] = 1.11;
console.log(a); 输出结果:
[
'world',
3.14,
3,
'world',
<6 empty items>,
'hi',
ten: 'hoo',
'-2': -2,
'1.11': 1.11
]

2.2.2 稀疏数组

1、包含从0开始的不连续索引的数组。
2、可以用Array()构造函数或简单地指定数组的索引值大于当前的数组长度来创建稀疏数组。
举个例子:

let a1 = [, , ,];
let a2 = new Array(4);
console.log(1 in a1, 1 in a2);
a1[10] = 100;
a1[8] = undefined;
for (let a in a1) {
console.log(a, a1[a]);
}

输出结果:
false false
8 undefined
10 100

2.2.3 数组长度

每个数组都有length属性,表示数组的长度以及数组内元素的个数。

  • 设置为一个小于当前长度的非负整数n时,当前数组中那些索引值大于或等于n的元素将从中删除。
  • 设置为大于其当前的长度,会在数组尾部创建一系列空的区域
  • 可以用Object.defineProperty()让数组的length属性变成只读的。
    举个例子:
let arr = [1, 2, 3];
arr.length = 5;
console.log(arr); // [ 1, 2, 3, <2 empty items> ] Object.defineProperty(arr, "length", {
writable: false,
configurable: false,
});
arr.length = 3;
console.log(arr); // [ 1, 2, 3, <2 empty items> ], 由于设置了数组的length为不可读,所以不能修改数组长度 arr.push(1000);
console.log(arr); // TypeError 由于设置了数组的length为不可读,所以不能修改数组长度 // 修改数组的length属性为只读
Object.defineProperty(arr, "length", { writable: true });

2.2.4 数组元素操作

方法 描述
push 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度
unshift 在数组头部添加任意个项并返回新数组的长度
pop 从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项
shift 移除数组中的第一个项并返回该项,同时将数组长度减 一
delete 后接要删除的数组元素,数组的长度减一,并返回新数组
join 将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串,可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素。如果不指定分隔符,默认使用逗号。
reverse 将数组中的元素颠倒顺序,返回逆序的数组
sort 将数组中的元素排序并返回排序后的数组,当不带参数调用sort()时,数组元素以字母表顺序排序,若有两个参数,参数的先后顺序决定了数组先后顺序
concat 创建并返回一个新数组,它的元素包括调用concat()的原始数组的元素和concat()的每个参数
slice 返回指定数组的一个片段或子数组,它的两个参数分别指定了片段的开始和结束的位置
splice 当只有一个参数(index)时,表示删除index+1以及后面的所有元素。当有两个参数(index,many)时,表示从index位置开始,删除many个元素。当有多个参数(index,many,item1,item2,item3...itemn)时,表示从index开始,删除many个元素,并添加item1,item2,item3...itemn

举个例子:

let arr = [1, 2, 3, 4, 5, 0, 6];
let arr1 = arr.join("-")
let arr2 = arr.reverse()
let arr3 = arr.sort((a, b) => a - b)
let arr4 = arr.concat(111, [222, 333])
let arr5 = arr.slice(1, 3)
console.log(arr1); // 1-2-3-4-5-0-6
console.log(arr2); // [0, 1, 2, 3, 4, 5, 6]
console.log(arr3); // [0, 1, 2, 3, 4, 5, 6]
console.log(arr4); // [0, 1, 2, 3, 4, 5, 6, 111, 222, 333]
console.log(arr5); // [ 1, 2 ]
let arr = [1, 2, 3]
arr[arr.length] = 4
arr.push(5) //尾部追加
arr.unshift(0) // 头部追加
console.log(arr) // [ 0, 1, 2, 3, 4, 5 ] delete arr[1]
console.log(arr) // [ 0, <1 empty item>, 2, 3, 4, 5 ] arr.pop() // 头部删除
arr.shift() // 尾部删除
console.log(arr); //[ <1 empty item>, 2, 3, 4 ] arr.splice(1, 2, ...[22, 33]) //从1开始删除2个替换成22,33
console.log(arr); //[ <1 empty item>, 22, 33, 4 ] arr.splice(1, 0, ...[222, 333]) // 插入
console.log(arr);// [ <1 empty item>, 222, 333, 22, 33, 4 ] arr.splice(1, 2) // 直接删除
console.log(arr);// [ <1 empty item>, 22, 33, 4 ]

2.2.5 利用原型继承,为数组扩展出插入、删除和替换元素的方法

Array.prototype.remove = function (index, len) {
// return this.splice(index, len) // 返回已经删除的元素
this.splice(index, len)
return this
}
// arr 是要插入的数组
Array.prototype.insert = function (index, arr) {
this.splice(index, 0, ...arr)
return this
}
// arr 是要替换的数组
Array.prototype.replace = function (index, arr) {
this.splice(index, arr.length, ...arr)
return this
} let nums = [1, 2, 3, 4, 5]
console.log(nums.remove(1, 3)); // [1,5]
console.log(nums.insert(1, [22, 33, 44])); // [1, 22, 33, 44, 5]
console.log(nums.replace(1, [222, 333, 444])); // [1, 222, 333, 444, 5]

2.2.6 常见的数组遍历方法

方法 描述
for..in.. 遍历数组的索引(即键名)
for..of.. 遍历数组的元素值
Object.keys 返回数组的索引(即键名)组成的数组
Object.value 返回数组的元素值组成的数组

举个例子:

let arr = ["Chinese","Math","English"];
for(let i in arr){
console.log(i);
}
// 0
// 1
// 2 for(let i of arr){
console.log(i);
}
// Chinese
// Math
// English console.log(Object.keys(arr)); // [ '0', '1', '2' ]
console.log(Object.values(arr)); // [ 'Chinese', 'Math', 'English' ]

2.2.7 实例方法

1、ES5定义了9个数组方法来遍历、映射、过滤、检测、简化和搜索数组

方法 描述
forEach() 从头至尾遍历数组,为每个元素调用指定的函数
map() 将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。
fliter() 返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:该函数返回true或false
every() 对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true
some() 对数组中每一项运行给定函数,如果该函数对任意一项返回true,则返回true
reduce() 接受一个累加器函数,在这个函数中迭代数组的所有项,然后返回一个值。从数组的第一项开始,向后遍历到最后一项
reduceRight() 接受一个累加器函数,在这个函数中迭代数组的所有项,然后返回一个值。从数组的最后一项开始,向前遍历到第一项
indexOf() 搜索某个指定的字符串值在字符串中首次出现的位置,从前往后查找。返回找到的第一个元素的索引,如果没有找到就返回-1
lastIndexOf() 搜索某个指定的字符串值在字符串中最后一次出现的位置,从后向前查找。返回找到的第一个元素的索引,如果没有找到就返回-1

举个例子:

let arr=[1,2,3,4,5]
let reducer=(total,current)=>total+current;
let total=arr.reduce(reducer)
console.log(total); // 15
let strs = "好好学习天天向上"
console.log(strs.indexOf("好")); // 0
console.log(strs.lastIndexOf("好")); // 1

2、ES6新增了8个方法用于对ES5的补充

方法 描述
copyWith( ) 在当前数组内部将指定位置的元素复制到其他位置(会覆盖原有元素),返回当前数组。
find( ) 用户找出第一个符合条件的数组元素(或其索引)
findIndex( ) 用户找出第一个符合条件的数组元素(或其索引)
fill( ) 使用给定值填充一个数组
entries( ) 返回所有成员键值对所组成的数组的遍历器对象
keys( ) 返回键名的遍历器对象
values( ) 返回键值的遍历器对象
includes( ) 判断数组中是否包含给定的值,与字符串的includes方法类似。

举个例子:

let arr = ["小明","男生",16]
for(let i of arr.keys()){
console.log(i);
}
// 0
// 1
// 2 for(let i of arr.values()){
console.log(i);
}
// 小明
// 男生
// 16 for(let i of arr.entries()){
console.log(i);
}
// [ 0, '小明' ]
// [ 1, '男生' ]
// [ 2, 16 ]

2.2.8 构造函数方法

1、Array.from( ),将类似数组的对象和可遍历的对象转化成真正的数组,如HTML中的li标签。
举个例子:

<body>
<ul id="list-nums">
<li>100</li>
<li>200</li>
<li>300</li>
</ul>
</body>
<script>
let lis = document.querySelectorAll("#list-nums li")
console.log(lis);
let items = Array.from(lis,function(item){
return item.textContent;
})
console.log(items);
</script>

输出结果:
NodeList(3) [li, li, li]
test01.html:59 (3) ["100", "200", "300"]

2、Array.of( ),将一组值转换为数组
举个例子:

let arr = [1, 2, 3, 4, 5, 6]
let nums = Array.of(...arr, 7, 8, 9);
console.log(nums); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9]

JS学习笔记 (四) 数组进阶的更多相关文章

  1. JS学习笔记 (五) 函数进阶

    1.函数基础 1.1 函数的基本概念 函数是一段JavaScript代码,只被定义一次,但是可以被调用或者执行许多次.函数是一种对象,可以设置属性,或调用方法. 函数中的参数分为实参和形参.其中,形参 ...

  2. JS学习笔记 (三) 对象进阶

    1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ...

  3. Node.js学习笔记(四) --- fs模块的使用

    目录 . fs.stat 检测是文件还是目录 . fs.mkdir 创建目录 . fs.writeFile 创建写入文件 . fs.appendFile 追加文件 . fs.readFile 读取文件 ...

  4. [前端JS学习笔记]JavaScript 数组

    一.JavaScript数组的奇葩 大多数语言会要求数组的元素是同个类型, 但是JavaScript允许数组元素为多种类型. var arr = ["羽毛球", 666, {&qu ...

  5. 【学习】js学习笔记:数组(二)

    二维数组 例子:矩形反转: <script> var arr=[[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]]; ...

  6. 【学习】js学习笔记:数组(一)

    1.创建数组并赋值 //对象方式 var arr=new Array(1,2,3,4); //隐形声明方式 var arr2=[5,6,7,8]; 2.数组可以存储任何类型的数据 3.访问数组,是用下 ...

  7. Objective-C 学习笔记(四) 数组

    Objective-C 数组作为函数参数传递 如果想在一个函数作为参数,通过一维数组,就必须声明函数形式参数 方式一    指针作为形式参数 - (void) myFunction(int *) pa ...

  8. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

随机推荐

  1. Python自动化测试之文件操作

    1.读.写.追加文件 读:打开文件  r    读写:r+ 写:w 可写不可读  清空原文件   写读:w+ 清空文件 追加:a+  可以读写,文件不存在自动创建 练习读txt文件类容: #-*- c ...

  2. Spring源码-入门

    一.测试类 public class Main { public static void main(String[] args) { ApplicationContext applicationCon ...

  3. JWT漏洞学习

    JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...

  4. 快速搭建 SpringCloud Alibaba Nacos 配置中心!

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...

  5. Helm安装ingress-nginx-4.2.0

    Application version 1.3.0 Chart version 4.2.0 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...

  6. Pytorch: repeat, repeat_interleave, tile的用法

    https://zhuanlan.zhihu.com/p/474153365 torch.repeat 使张量沿着某个维度进行复制, 并且不仅可以复制张量,也可以拓展张量的维度: import tor ...

  7. Java---Stream进阶

    由于本文需要有一定的Stream基础,所以如果不懂什么是Stream的同学请移步:Java---Stream入门 操作分类 graph LR 操作分类 --- 中间操作 终端操作 --- 操作分类 中 ...

  8. MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...

  9. 以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联

    作为数字化产业重要的基础设施之一,物联网迎来了黄金发展期.物联网通信技术通过数据的采集.分析.输出,从浅层次的互联工具和产品深化,到成为重塑生产组织方式的基础设施和关键要素,正深刻地改变着传统产业形态 ...

  10. 部署Netlify站点博客

    Netlify站点部署静态博客 今天尝试把站点部署在Netlify上,因为部署在GitHub Pages上,国内访问速度太慢了,所以就尝试一下别的站点,部署成功之后发现速度还是不太行,后边继续找找原因 ...