1. 数组基础
js中的数组是可以存放任意数据类型值的集合,数组的元素可以是任意数据类型,数组的长度可以动态调整
JavaScript里数组的最大长度是: 4,294,967,295,即 2^32 - 1
1.1. 数组创建
1.1.1. 使用Array构造函
- 一个参数,如果是number类型的整数,则代表的是数组的长度。如果是number类型的小数,则报错。如果是其他类型,则当做数组元素放进去
- 两个参数或者多个参数,当做数组元素放进去
var arr = new Array();
var arr = new Array(20); // 预先指定数组的大小
var arr = new Array("terry","larry","boss"); //传入参数
1.1.2. 使用数组字面量
var arr = ["terry","larry","boss"];
var arr = [] //空数组
1.2. 数组访问
- 数组变量名[索引]
- 索引数值需小于数组长度(0~length-1)
- 如果给大于等于length的索引赋值,数组自动增加到索引+1的长度,中间跳过的索引赋值underfined
var arr = [0, 1, 2, 3];
arr[7] = 7;
console.log(arr);
console.log(arr[7]);
console.log(arr[5]);
1.3. 数组在内存中的表现
var arr = new Array()
arr对象 = new 构造函数()
1.4. 数组检测
- 对于一个网页或者一个全局作用域而言,使用instanceof操作符即可判断某个值是否是数组。
- 如果网页中包含多个框架,就会存在两个不同的全局环境,存在两个不同版本的Array构造函数,使结果不准确。因此,ECMAScript5新增了Array.isArray()方法进行判断
var arr = [];
typeof arr ; //结果为object
arr instanceof Array //结果为true,在同一个全局作用域下可以这么判断
Array.isArray(arr); //结果为true,判断arr是否是数组类型
1.5. 数组序列化
- toString() 在默认情况下都会以逗号分隔字符串的形式返回数组项
- join() 使用指定的字符串用来分隔数组字符串
- JSON.stringify()和JSON.parse() JSON序列化和反序列化
var arr = [1,5,2,8,10,{a:1}];
console.log(arr);//[ 1, 5, 2, 8, 10, { a: 1 } ]
console.log(arr.toString());//1,5,2,8,10,[object Object]
console.log(arr.join(""));//152810[object Object]
console.log(arr.join("-"));//1-5-2-8-10-[object Object]
var result = JSON.stringify(arr);
console.log(result);//[1,5,2,8,10,{"a":1}]
console.log(JSON.parse(result));//[ 1, 5, 2, 8, 10, { a: 1 } ]
2. 数组API
2.1. 构造函数的方法
- Array.isArray() 判断某个变量是否是一个数组对象
- Array.from() 从类数组对象或者可迭代对象中创建一个新的数组实例
Array.from('foo'); //[ 'f', 'o', 'o' ]
const set = new Set(['foo', 'bar', 'baz', 'foo']);
Array.from(set); //[ 'foo', 'bar', 'baz' ]
//Set是唯一值的集合,会删除重复的值
- Array.of() 根据一组参数来创建新的数组实例,支持任意的参数数量和类型
Array.of(1, 2, 'hello') //[ 1, 2, 'hello' ]
2.2. 原型的方法
2.2.1. 栈与队列方法
栈、队列方法会改变原数组
- 栈 LIFO (Last-In-First-Out)
- pop() 移除数组中的最后一个项并且返回该项,同时将数组的长度减一
- push() 可接受任意类型的参数,将它们逐个添加到数组的末尾,并返回数组的长度
- 队列 FIFO (First-In-First-Out)
- shift() 移除数组中的第一个项并且返回该项,同时将数组的长度减一
- unshift() 在数组的前端添加任意个项,并返回数组的长度
var arr = ['red', 'yellow', 'green', 'blue', 'orange', 'black'];
console.log(arr.length); //6
console.log(arr.pop()); //black
console.log(arr.length); //5
console.log(arr.push('hello', 'world')); ///7
console.log(arr); //['red','yellow','green','blue','orange','hello','world']
console.log(arr.shift()); //red
console.log(arr.length); //6
console.log(arr.unshift('white')); //7
console.log(arr); //['white','yellow','green','blue','orange','hello','world']
2.2.2. 排序方法
- reverse() 反转数组项的顺序。改变原数组
- sort() 对数组的元素进行排序,并返回数组。改变原数组
默认:按照字符在字符编码表中出现的位置进行排序进行排序
含有参数:参数必须是返回值为正值、零值或负值的函数,根据返回的值进行排序。
//默认
var arr = [82,1,43,2,8,32,5];
arr.sort();
console.log(arr);//[1,2,32,43,5,8,82]
//含有参数
var arr = [82,1,43,2,8,32,5];
arr.sort(function (a, b){return a-b});//[1,2,5,8,32,43,82] a为后面的值。返回负值,a在b的前面;返回正值,a在b的后面;返回零值,a、b的相对位置不变
console.log(arr);
2.2.3. 操作方法
- concat()
数组拼接,先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,返回副本。不改变原数组
var arr1 = [3,8,2,5,"hello"];
var arr2 = [10,100,1000];
var result1 = arr1.concat(arr2);
console.log(arr1);//[ 3, 8, 2, 5, 'hello' ]
console.log(result1);//[ 3, 8, 2, 5, 'briup', 10, 100, 1000 ]
- slice(a, b)
数组切割,范围从a到b,左闭右开,将切割的值返回为一个新数组。不改变原数组
var arr = [ 3, 8, 2, 5, 'hello', 10, 100, 1000 ];
var result = arr.slice(4, 6);
console.log(arr);//[ 3, 8, 2, 5, 'hello', 10, 100, 1000 ]
console.log(result);//[ 'hello', 10 ]
- splice()
始终返回一个数组,该数组中包含从原始数组中删除的项,还可以向原数组中插入项。
// 删除 两个参数(起始位置,删除项数)
var arr = [3,8,2,5,"hello"];
var result = arr.splice(1,4);
console.log(arr);//[ 3 ]
console.log(result);//[ 8, 2, 5, 'hello' ]
// 替换 至少3个(起始位置,删除项数,放入的元素)
var arr = [3,8,2,5,"hello"];
var result = arr.splice(1,4,"test",[1,2,3]);
console.log(arr);//[ 3, 'test', [ 1, 2, 3 ] ]
console.log(result);//[ 8, 2, 5, 'hello' ]
// 插入元素 至少3个(起始位置,删除项数0,放入的元素)
var arr = [3,8,2,5,"hello"];
var result = arr.splice(1,0,"test",[1,2,3]);
console.log(arr);//[ 3, 'test', [ 1, 2, 3 ], 8, 2, 5, 'hello' ]
console.log(result);//[]
2.2.4. 位置方法
- indexOf()
从数组开头向后查找,使用全等操作符,找不到该元素返回-1。第一个参数为要查找的项,第二个参数(可选)为索引开始位置 - lastIndexOf()
从数组末尾向前查找,使用全等操作符,找不到该元素返回-1。第一个参数为要查找的项,第二个参数(可选)为索引开始位置
var arr = [1,3,7,2,'hello','world'];
var result = arr.indexOf('hello', 2);//4
var result2 = arr.lastIndexOf(7, 4);//2
console.log(result, result2)
2.2.5. 迭代方法
- every() 对数组中的每一元素运行给定的函数,如果该函数对每一项都返回true,则该函数返回true
- some() 对数组中的每一运行给定的函数,如果该函数对某一项返回true,则返回true
- filter() 对数组中的每一项运行给定的函数,会返回满足该函数的项组成的数组
- map() 对数组中的每一元素运行给定的函数,返回每次函数调用的结果组成的数组
- forEach() 对数组中的每一元素运行给定的函数,没有返回值,常用来遍历元素
var students = [
{name:"briup",age:12,sno:1001},
{name:"boss",age:32,sno:1002},
{name:"lisi",age:89,sno:1003}
];
console.log(students);
//判断是否都是成年人-every
var result = students.every(function(item){
return item.age>18;
});
console.log("判断是否都是成年人:"+result);
// 查看学生中有没有成年人-some
var result = students.some(function(item){
return item.age>18;
});
console.log("查看学生中有没有成年人:"+result);
// 过滤出成年人-filter
var result = students.filter(function(item){
return item.age>18;
});
console.log(students);//学生数组不发生改
console.log(result);//成年人有
// 查找所有学生的姓名,并返回数组-map 映射
var result = students.map(function(item){
return item.name;
});
console.log(students);//所有学生信息
console.log(result);//只有学生姓名的数组 [ 'briup', 'boss', 'lisi' ]
//forEach 遍历数组
var arr = [3,8,2,5,"hello","5",5];
console.log(arr);
var result2=arr.forEach(
function(arr){
console.log(arr);//3 8 2 5 hello 5 5
});
console.log(result2);//underfined