数组简介和定义(1)
数组(Array) ,顾名思义,用来存储一组相关的值,从而方便进行求和、计算平均数、逐项遍历等操作。
每种高级编程语言中都有数组,它是非常重要的一种数据结构。
数组是值的有序集合,数组中的每个值称为一个元素,每个元素在数组中都有一个数字位置,称为索引,索引从 0 开始,依次递增。在 JavaScript 中,您可以使用 Array 对象定义数组,此外,Array 对象中还提供了各种有关数组的属性和方法。
数组定义方法
访问数组项
JS中越界访问不会报错,而是返回undefined
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [1, 2];
var arr2 = new Array(1, 2, 3);
var arr3 = new Array(2);
console.log('arr1数组:');
console.log(arr1);
console.log(arr1[0])
console.log(arr1[2])
console.log('arr2数组:');
console.log(arr2);
console.log(arr2[1]);
console.log(arr2[3]);
console.log('arr3数组:');
console.log(arr3);
console.log(arr3[0]);
console.log(arr3[1]);
</script>
</body>
</html>
数组的长度
.length属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5];
console.log(arr.length);
var lastItem = arr[arr.length - 1]; // 数组最后一项
console.log(lastItem);
</script>
</body>
</html>
数组简介和定义(2)
更改数组项
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 'hello', 'world'];
arr[0]++;
console.log(arr);
arr[6] = '你好'; // 添加一项
console.log(arr);
</script>
</body>
</html>
数组的遍历
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [2, 4, 6, 8, 10];
for (var i = 0; i < arr1.length; i++) {
console.log(arr1[i]);
}
console.log('分割~~~~~~~~~~~~');
var arr2 = [1, 3, , , 5, 7, 9, ,];
for (var i = 0; i < arr2.length; i++) {
console.log(arr2[i]); // 中间逗号中未写值,或尾部的逗号中未写值,会被解析为undefined
}
</script>
</body>
</html>
数组类型的检测
Array.isArray()
兼容到IE8
- 数组用typeof检测结果是object
- Array .isArray()方法可以用来检测数组
- Array .isArray()判断对象是否为数组
数组的常用方法
数组的常用方法(1)
push( )方法
- 向数组的末尾添加一个或更多元素,
并返回数组的长度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6, 7];
console.log(arr);
var arrLength = arr.push(8, 9, 10);
console.log(arr);
console.log(arrLength);
</script>
</body>
</html>
pop( )方法
- 删除数组中的最后一项
- 并返回所删除的项
- pop方法中的参数不需要填写,填写也是没用的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5];
var dele = arr.pop();
console.log(arr);
console.log(dele);
</script>
</body>
</html>
unshitf( )方法
- 在数组的首项插入新项
- 若插入多项,用逗号隔开
- 向数组的开头添加一个或多个元素,
并返回新数组的长度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5]
var newLength = arr.unshift(-1, 0);
console.log(arr);
console.log(newLength);
</script>
</body>
</html>
shift( )方法
- 删除数组的首项(下标为0的位置)
- 并返回所删除的项
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6];
var item = arr.shift();
console.log(arr); //被删除过后的数组
console.log(item); //被删除的项
</script>
</body>
</html>
数组的常用方法(2)
splice( )方法
splice()方法可用于替换数组中的项
- 参数1,从下标为(参数1)的项开始
- 参数2,连续替换的项数
- 参数3,所替换的内容,不限多少
会直接改变原数组
splice 拼接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6];
arr.splice(1, 3, 6); // 从下标为1的位置开始,连续替换3项,替换为6
console.log(arr); // [1, 6, 5, 6]
</script>
</body>
</html>
splice()方法也可以指定位置插入新项
- 只需将splice( )的第二个参数设置为0 (可以理解为不替换项,替换0项)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6];
arr.splice(0, 0, 0); //在首项插入0
console.log(arr);
arr.splice(2, 0, 'hello'); // 在下标为2的位置前,插入一段字符串
console.log(arr);
</script>
</body>
</html>
splice()方法也可以用于删除项
splice(index,count)中的参数count是要删除的项目数量,如果设置为0,则不会删除任何项。
splice的删除方法有两个参数,第一个是index,它必须要有,第二个是count,可设置也可不设置,如果设置的话,那么删除的个数就是count所定的,如果不设置,那么删除从index开始的所有值。
两个参数
- 第一个参数,指定下标位置
- 第二个参数,删除多少项
一个参数
- 删除从参数开始的所有值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [1, 2, 3, 4, 5, 6];
arr1.splice(0); // 从下标为0的位置开始删除
console.log(arr1);
var arr2 = [1, 2, 3, 4, 5, 6];
arr2.splice(1, 3); // 从下标为1的位置开始删除,删除3项
console.log(arr2);
var arr3 = [1, 2, 3, 4, 5, 6];
arr3.splice(1, 0); // 第二个参数为0,则不会删除任何项
console.log(arr3);
</script>
</body>
</html>
注意点:
splice()方法会以数组形式返回被删除的项。
splice方法,一定是有返回值的,返回的值都是被删除的项或被替换的项,并且以数组的形式被返回
若没有被删除的项,则返回空数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [1, 2, 3, 4, 5, 6];
var item1 = arr1.splice(0); // 返回所删除的项
console.log(item1);
var arr2 = [1, 2, 3, 4, 5, 6];
var item2 = arr2.splice(1, 2, 11, 12); // 返回所替换的项
console.log(item2);
var arr3 = [1, 2, 3, 4, 5, 6];
var item3 = arr3.splice(6, 0, 7); // 后添加的项不反回
console.log(arr3);
console.log(item3);
</script>
</body>
</html>
slice( )方法
- 字符串有这个方法,数组也有这个方法
- 截取数组的一部分,并返回这个新的数组
不会改变原数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newArr = arr.slice(-6, 8); // 参数1必须小于参数2
console.log(newArr);
</script>
</body>
</html>
数组的常用方法(3)
join( ) 方法
join()方法用于把
数组中的所有元素变成一个字符串,并通过指定的分隔符进行分隔,返回的不是数组,而是一个字符串,且不会改变原数组。
- 将数组转换为字符串
- 不写参数表示 以默认的逗号分隔 ==
.join(',')==.toString( ) - 参数写空字符串:代表不用连接符
- 不会改变原数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newStr = arr.join();
console.log(newStr);
console.log(typeof newStr);
</script>
</body>
</html>
split( ) 方法
- 将字符串转换为数组
- 参数一般不留空,通常以空字符串作为参数
.split(''); 不会改变原数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var str = 'hello world';
var newArr = str.split('');
console.log(newArr);
</script>
</body>
</html>
字符串和数组更多相关性
可以使用下标的方式遍历字符串
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var str = 'hello world';
console.log(str[0]);
console.log(str[1]);
console.log(str[2]);
console.log(str.charAt(3));
console.log('~~~~~~~~~~');
for (var i = 0; i < str.length; i++) {
console.log(str[i]);
}
</script>
</body>
</html>
concat( ) 方法
拼接两个或更多的数组,并返回结果
- 合并数组
不会改变影响原数组- concat的返回值是它们总共合并的新数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6, 7, 8, 9, 10];
console.log(arr1.concat(arr2));
console.log(arr2.concat(arr1));
</script>
</body>
</html>
reverse( ) 方法
反转数组中元素的顺序
- 会直接
改变原来的数组 只有数组才能调用reverse() 方法,字符串不行
字符串逆序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var str = 'hello beiJing';
var arr = str.split('');
arr.reverse();
var retStr = arr.join('');
console.log(str);
console.log(retStr);
</script>
</body>
</html>
indexOf( ) 方法
搜索数组中的元素,并返回它所在的位置
- 检索数组中出现的元素第一次出现的位置(下标)
- 返回它第一次出现位置的下标 (有重复出现的也返回第一次出现的位置的下标)
- 若没有,则返回-1
- 可以写一个参数,也可以写两个参数,第二个参数表示查找的起点,从第二个参数开始检索
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6];
console.log(arr.indexOf(3, 5));
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 5, 5, 6];
console.log(arr.indexOf(5, 4)); // 找5,从下标为4的位置开始找
console.log(arr.indexOf(5, 5));
console.log(arr.indexOf(5, 6));
console.log(arr.indexOf(1));
console.log(arr.indexOf(7));
</script>
</body>
</html>
其它示例:
注意:
说明indexOf() 与 includes() 的判断方法都是以全等(===)为判断标准的
includes() 方法
- 返回的是布尔值
- 判断数组中是否包含该值
sort() 方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0];
arr.sort(function (a, b) {
return a - b;
});
console.log(arr);
</script>
</body>
</html>
数组遍历
遍历相关算法
求数组总和、平均数
题目:求数组中每一项的总和、平均数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var average = 0;
var arr = [1, 2, 3, 4, 5];
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
document.write(sum + '<br>');
average = sum / arr.length;
document.write(average);
</script>
</body>
</html>
求数组中最大值、最小值
题目:求数组项的最大值和最小值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 90, 99, -3, -6, 35];
var max = arr[0]; // 不要初始化为0,因为数组中可能有负值
var min = arr[0];
for (var i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
} else if (arr[i] < min) {
min = arr[i];
}
}
console.log('最大值:' + max + ',最小值' + min);
</script>
</body>
</html>
数组去重和随机样本
数组去重
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 1, 1, 2, 5, 5, 6, 9];
var retArr = [];
for (var i = 0; i < arr.length; i++) {
if (!retArr.includes(arr[i])) { //如果retArr数组不包含arr数组的元素,就将arr数组的元素推入retArr中
retArr.push(arr[i]);
}
}
console.log(retArr);
</script>
</body>
</html>
随机样本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 2, 3, 4, 5, 6, 7, 8];
var newArr = [];
for (var i = 0; i < 3; i++) {
var rand = parseInt(Math.random() * arr.length);
newArr.push(arr[rand]);
arr.splice(rand, 1);
}
console.log(newArr);
</script>
</body>
</html>
冒泡排序
首先要理解冒泡排序的原理,冒泡排序指的是依次比较数组中相邻的两个值,如果后面的比前面的小,则将小的元素排到前面,依照这个规则进行多次并且递减的迭代。
外层趟数一趟可以排好一个数字,假若10个数字,那么就需要9趟就可以排好
内层趟数,每次都对比相邻的两位元素(不满足就交换位置)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0];
for (var i = 1; i < arr.length; i++) { // 外层趟数比所比较的元素数少一次
for (var j = arr.length - 1; j >= i; j--) { //将每趟中的相邻两个元素相比较
if (arr[j] < arr[j - 1]) {
var temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
console.log(arr);
</script>
</body>
</html>
二维数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [[1, 2, 3], [4, 5, 6], [88, 99, 100]];
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
console.log(arr[i][j]);
}
}
</script>
</body>
</html>
JavaScript类型值与克隆
引用类型
变量(基本数据类型)存储在栈内存中
引用数据类型 存储在堆内存中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var a = 1;
var b = a;
a++;
console.log(a);
console.log(b);
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr1 = [66, 77, 88];
var arr2 = arr1;
arr1.push(99);
console.log(arr1);
console.log(arr2);
</script>
</body>
</html>
通过以上我们得出:
判断相等时区别
- 基本数据类型比较
值 - 引用数据类型比较的是
地址
例子:
浅克隆(Shadow Clone)
浅克隆就是,遍历数组的每一项推入到结果数组中,但是原数中如果有多维数组、或其他引用引用类型值,则克隆的只是地址,而不会创建出新的地址。
例子
解析:
本题中,arr1与arr2并没有指向同一个地址,但是索引的元素是同一个地址,所以通过改变索引是可以影响双方的值的
技巧
知识图谱