JS学习笔记 (四) 数组进阶
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学习笔记 (四) 数组进阶的更多相关文章
- JS学习笔记 (五) 函数进阶
1.函数基础 1.1 函数的基本概念 函数是一段JavaScript代码,只被定义一次,但是可以被调用或者执行许多次.函数是一种对象,可以设置属性,或调用方法. 函数中的参数分为实参和形参.其中,形参 ...
- JS学习笔记 (三) 对象进阶
1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ...
- Node.js学习笔记(四) --- fs模块的使用
目录 . fs.stat 检测是文件还是目录 . fs.mkdir 创建目录 . fs.writeFile 创建写入文件 . fs.appendFile 追加文件 . fs.readFile 读取文件 ...
- [前端JS学习笔记]JavaScript 数组
一.JavaScript数组的奇葩 大多数语言会要求数组的元素是同个类型, 但是JavaScript允许数组元素为多种类型. var arr = ["羽毛球", 666, {&qu ...
- 【学习】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]]; ...
- 【学习】js学习笔记:数组(一)
1.创建数组并赋值 //对象方式 var arr=new Array(1,2,3,4); //隐形声明方式 var arr2=[5,6,7,8]; 2.数组可以存储任何类型的数据 3.访问数组,是用下 ...
- Objective-C 学习笔记(四) 数组
Objective-C 数组作为函数参数传递 如果想在一个函数作为参数,通过一维数组,就必须声明函数形式参数 方式一 指针作为形式参数 - (void) myFunction(int *) pa ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- [Blender] Blender 获取 Instance 的信息
最近希望用 Blender 生成 Instance 的能力,将生成的导入游戏引擎中来渲染.Instance Rendering 是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用. ...
- Hadoop的由来、Block切分、进程详解
Hadoop的由来.Block切分.进程详解 一.hadoop的由来 Google发布了三篇论文: GFS(Google File System) MapReduce(数据计算方法) BigTable ...
- Docke 搭建 apache2 + php8 + MySQL8 环境
Docker 安装 执行 Docker 安装命令 curl -fsSL https://get.docker.com/ | sh 启动 Docker 服务 sudo service docker st ...
- Live2d Widget
写在最前 最早的时候看别人的博客很多都有一个可爱的看板娘,然后就找了教程给自己也整了一个.因为找到的教程都是稂莠不齐的,原作者自己说的也略显含糊(其实是我自己看不懂).总之秉承着一如既往的小白风格.把 ...
- LOJ6671 EntropyIncreaser 与 Minecraft (生成函数)
题面 EntropyIncreaser 是组合计数大师. EntropyIncreaser 很喜欢玩麦块.当然,EntropyIncreaser 拥有非同常人的超能力,他玩的是MOD版的 n 维麦块, ...
- HiveSql调优系列之Hive严格模式,如何合理使用Hive严格模式
目录 综述 1.严格模式 1.1 参数设置 1.2 查看参数 1.3 严格模式限制内容及对应参数设置 2.实际操作 2.1 分区表查询时必须指定分区 2.2 order by必须指定limit 2.3 ...
- [第二章 web进阶]XSS闯关-1
定义:跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户浏览网 ...
- Batch Norm 与 Layer Norm 比较
一.结论 Batch Norm一般用于CV领域,而Layer Norm一般用于NLP领域 Batch Norm需要计算全局平均,而Layer Norm不需要计算全局平均 二.Batch Norm Ba ...
- LFS(Linux From Scratch)构建过程全记录(二):磁盘分区
写在前面 本文将会详细记录LFS中,构建分区,构建文件系统和挂载分区的全过程 准备新硬盘 为了更加符合"从零开始构建Linux"的要求,我在虚拟机中,新建了一个磁盘 我们将会在这个 ...
- 第一章:模型层 - 5:模型的元数据Meta
模型的元数据,指的是"除了字段外的所有内容",例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的.但是,我要说但是,有 ...