2.02.22 数组
1.数组
1.概念
- 数组就是一系列的数据集合,每一项可保存任何类型的数据,每个元素之间用逗号隔开。不同于基本数据类型,数组数据类型是引用数据类型,数组是一段线性分配的内存,他通过整数计算偏移并访问其中的元素。数组是一种性能出色的数据结构
2.数组声明
1.数组字面量(推荐)
- 介绍:数组字面量提供了一种非常方便的创建新数组的表示法。一个数组字面量是在一对方括号[]中包围零个或多个用逗号分隔的值的表达式。数组字面量允许出现在任何表达式可以出现的地方。
var empty = [];
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
2.使用构造函数
- 介绍:javascript提供了 Array 构造函数,可以通过new关键字创建数组的示例,我们不推荐使用该方法创建数组
var empty = new Array()
var numbers = new Array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine')
- 该方式可以声明一定长度的空数组:
var arr4 = new Array(8);
3.数组可以存放任何数据类型的数据
- 基本类型:number、string、null、undefined、boolean,包括引用类型中的:函数、对象、数组
3.访问/修改数组元素
-
介绍:数组的第一个值将获得属性名’0’,第二个值将获得属性名’1’,以此类推。我们一般称数组的属性名为数组的索引下标。数组的每个元素都有索引,这是你访问和修改数组中值的钥匙。
-
访问数组元素:我们可以通过每一项数据对应的索引下标访问对应的数组元素。只需要在数组变量名后面加上用方括号括起的索引;如:
var empty = [];
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
empty[1] // undefined
numbers[0] // 'zero'
numbers[3] // 'three'
- 修改数组元素:同样使用数组索引来修改数组中的值。如:
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
numbers[3] = 'san' // ['zero', 'one', 'two', 'san', 'four', 'five', 'six', 'seven', 'eight', 'nine']
- 注意:若当前数组没有此索引将会把值作为新的元素添加到数组指定索引上。
var empty = [];
empty[0] = 'hello' // ['hello']
empty[2] = 'world' // ['hello',,'world']
4.数组的length属性
- 概念:每个数组都有一个 length 属性,指出了数组中当前包含了多少个元素。
var empty = []
empty.length // 0
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
numbers.length // 10
- length属性的值实际上是这个数组的最大下标值索引元素下标值加上1,他不一定等于数组里属性的个数。
var myArray = []
myArray.length // 0
myArray[10000] = true
myArray.length // 10001
- 你可以直接设置length的值,设置更大的length不会给数组分配更多的空间。而把length设小将导致所有下标大于等于新length的属性被删除
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
number.length = 3 // ['zero', 'one', 'two']
5.数组的遍历
- 介绍:数组的遍历就是操作数组中的每一个数组元素,也可以理解数组遍历就是把每个元素从头到尾都访问一次。
- 一般使用循环语句进行遍历
var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52];
// 我们将索引的初始化, 条件测试, 循环完毕更新数据都写入到for语句中
for (var i = 0; i < scores.length; i++) {
// 只要索引小于数组的长度,就继续循环。
console.log(scores[i]);
// 使用console.log输出这个当前索引项数据。
}
- for in 循环
- 语法如下:
// for(var 下标 in 对象)
for(var i in arr){
console.log("arr[" + i + "] =>", arr[i]);
}
- for of 循环
- 语法:
// for(var 元素 of 数组)
for(var v of arr){
console.log(v);
}
6.嵌套数组
- 因为数组数据类型中每一项都可以存放任意数据类型,所以数组支持在其内部存放数组数据类型。我们会根据嵌套的层级,人为的称其为“一维数组”、“二维数组”… 二维及以上也可以被称为“多维数组”。
- 遍历多维数组
var arr = [ [11,8,35], [7,51,99] ];
for(var i=0;i<arr.length;i++) { // 第一重遍历
// arr[i]外层数组第i项子数组,初始化新变量 j 用来遍历子数组的每一项下标
for(var j=0; j < arr[i].length ; j++){
console.log(arr[i][j])
}
}
7.向数组末尾的添加新数据
- 使用数组自身提供的push方法:往数组尾部添加一个或多个元素,该方法返回数组新长度
const animals = ['pigs', 'goats', 'sheep'];
const count = animals.push('cows');
console.log(count); // output: 4
console.log(animals); // output: Array ["pigs", "goats", "sheep", "cows"]
animals.push('chickens', 'cats', 'dogs');
console.log(animals); // output: Array ["pigs", "goats", "sheep", "cows", "chickens", "cats", "dogs"]
2.代码小技巧
//复制数组
var arr1=[1,7,6,8,8,0,7,3,8,2,4];
var arr2=[];
for(var i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
console.log("arr1=>",arr1);
console.log("arr2=>",arr2);
//进阶: for of 实现复制数组 动态增加数组长度 这里有个小技巧
arr3=[];
for(v of arr1){
arr3[arr3.length]=v;
}
console.log("arr1=>",arr1);
console.log("arr3=>",arr3);
//去重 原生的数组去重方法
var arr4=[];
for(var i=0;i<arr1.length;i++){
var flag=true;
for(var j=0;j<arr4.length;j++){
if(arr1[i]==arr4[j]){
flag=false;
break;
}
}
if(flag){
arr4[arr4.length]=arr1[i];
}
}
console.log("arr1=>",arr1); //[1,7,6,8,8,0,7,3,8,2,4]
console.log("arr4=>",arr4); //[1,7,6,8,0,3,2,4]
//错误的想法:
//现在你不等于arr5[0]你就存进去数了
//其实要你不等于arr5整个数组才存进去数
/* var arr5=[1];
for(var i=0;i<arr1.length;i++){
for(var j=0;j<arr5.length;j++){
if(arr1[i]!=arr5[j]){
arr5[arr5.length]=arr1[i];
break;
}
}
}
console.log("arr1=>",arr1); //[1,7,6,8,8,0,7,3,8,2,4]
console.log("arr5=>",arr5); */