一、使用数组
1.1 创建数组
- 通过[ ]操作符声明一个数组变量:
var numbers=[];
- 在生命数组变量时,直接在[]操作符内放入一组元素:
var numbers=[1,2,3,4,5];
- 调用Array的构造函数创建数组,在调用Array的构造函数时,可以只传入一个参数,用来指定数组的长度:
var numbers=new Array(); //创建一个数组
var numbers= new Array([size]);
例子:
var numbers=new Array(10);
print(numbers.length);
//创建一个数组并指定长度,注意不是上限,是长度;
Ps:可以调用Array.isArray()来判断一个对象是否是数组
1.2 读写数组
通过使用数组的length属性来控制循环次数,而不是直接使用数字。JavaScript中的数组也是对象,数组的长度可以是任意增长,超过其创建时指定的长度。length属性反映当前数组的元素个数。
1.3 由字符串生成数组
调用字符串对象的split()生成数组,通过分隔符比如单词空格将一个字符串分成几个部分,并将每部分作为一个元素保存在一个新建的数组中。
var sentence=“the little dog”;
var words=sentence.split();
for (var i=0;i<words.length;i++){
print("word"+i+":"+words[i]);
}
输出为:
word 0: the
word 1: little
word 2: dog
1.4 对数组的整体性操作
主要分为两种方法:
- 浅复制
当一个数组赋给另一个数组时,只是为被赋值的数组增加一个新的引用,仿通过原引用修改数组的值时,另一个引用也会变化。
例子:
var nums=[];
for(var i=0;i<100;i++){
nums[i]=i+1;
}
var samenums=nums;
nums[0]=400;
print(samenums[0]); //显示400
- 深复制
将原数组中的每一个元素都复制到一份到新数组中。
var nums=[];
for(var i=0;i<5;i++){
nums[i]=i+1;
}
var samenums=[];
copy(nums,samenums);
nums[0]=400;
print(samenums[0]); //显示1
另一个将数组视为整体的操作是print()函数,用它可以显示数组中的元素。
二、存取函数
2.1 查找元素
- indexOf()
indexOf()函数是常用的存取函数,用来查找传进来的参数在目标数组中是否存在。若目标数组包含该参数,就返回该元素在数组中的索引;不包含,返回-1.
ps:数组中包含多个相同元素,indexOf()总返回第一个与参数相同的元素的索引。
- lastIndexOf()
该函数返回相同元素中最后一个元素的索引,若没找到相同元素,则返回-1;
2.2数组的字符串表示
两个方法都返回一个包含数组所有元素的字符串,各元素之间用逗号隔开
- join()
- toString()
var names=["hling","honey","sun"];
var namestr1=name.join();
print(namestr1); //hling,honey,sun
var namestr2=name.toString();
print(namestr2); //hling,honey,sun
ps:直接对数组使用print()函数时,系统会自动调用toString()方法。
2.3 由已有数组创建新数组
concat(); //发起者是一个数组,参数是另一个,注意是一个新的数组,不是指向
splice(); //从现有数组里截取一个新数组,可以为一个数组增加或者移除元素;
三、可变函数
3.1 为数组添加元素
push()将一个元素添加到数组末尾;
unshift()将元素添加到数组的开头;
3.2从数组中删除元素
pop()方法删除数组末尾的元素;(和push()一起,堆栈,后进先出),删除并返回数组的最后一个元素。
shift()方法可以删除数组,如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值,删除并返回数组的第一个元素。
3.3为数组排序
- reverse()
该方法将数组中元素的顺序进行翻转; - sort()
sort()方法按照字典顺序对元素进行排序,因此假定的是字符串类型.
var nums=[3,1,2,100,4,200];
nums.sort();
print(nums);
//1,100,2,200,3,4
为了让sort()方法也能排序数字类型,可以再调用方法时传入一个大小比较函数。通过比较函数中两个元素的大小,从而决定整个数组的大小。
function compare(num1,num2){
return num1-num2;
//num1-num2递增顺序,若num2-num1位递减顺序;
}
var nums=[3,1,2,100,4,200];
nums.sort(compare);
print(nums);
//1,2,3,4,100,200
四、迭代器方法
迭代器方法对数组中的每个元素应用一个函数,可以返回一个值、一组值或者一个新数组。
4.1不生成新数组的迭代器方法
- forEach()
该方法接受一个函数作为参数,对数组中的每个元素使用该函数。
function aquare(num){
print(num,num*num);
}
var nums=[1,2,3];
nums.forEach(square);
//程序输出为:
1 1
2 4
3 9
- every()
该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。对于所有的元素,该函数返回true,只要有一个元素返回false,则该方法返回false。
function isEven(num){
return num %2==0;
}
var nums=[2,4,6];
var even=nums.every(isEven);
if(even){
print("all numbers are even");
}
else{
print("not all numbers are even");
}
//输出为:
all numbers are even
//将数组换为var nums2=[2,3,4,6];则输出结果则为:
not all numbers are even
- some()
some()方法接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回true, 该方法返回true。
function isEven(num){
return num%2==0;
}
var nums=[1,2,3,4,5,6];
var someEven=nums.some(isEven);
if(someEven){
print("Some numbers are even");
}
else{
print("No numbers are even");
}
nums=[1,3,5,7,9];
someEven=nums.some(isEven);
if(someEven){
print("Some numbers are even");
}
else{
print("No numbers are even");
}
//该程序的输出为:
Some numbers are even
No numbers are even
- reduce
该方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。reduce()方法可以将数组中的元素连接成一个长的字符串。
function add(runningTotal,current){
return runningTotal+currentValue;
}
var nums=[1,2,3,4,5];
var sum=nums.reduce(add);
print(sum);
//显示结果为55
JavaScript有reduceRight()方法,和reduce()不同的是它从右到左执行。
4.2 生成新数组的迭代器方法
map()
对数组中的每个元素使用某个函数,与forEach()类似,区别在于map()返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果。
function first(word){
return word[0];
}
var words=["for","your","information"];
var acronym=words.map(first);
print(acronym.join(""));
//join()方法,可以传入一个空字符串作为参数
//显示结果为:"fyi"
filter()
filter()和every()类似,传入一个返回值为布尔类型的函数。与every()不同的是,当对数组中所有元素应用该函数时,结果均为true时,该方法并不返回true,而是返回一个新数组,该数组包含应用该函数后结果为true的元素。filter()方法还可以过滤字符串数组。
五、二维数组和多维数组
5.1创建二维数组
需要先创建一个数组,再让数组的每个元素也是一个数组。
创建多维数组的源码:
Array.matrix=function(numrows,numcols,initial){
var arr=[];
for(var i=0;i<numrows;++i){
var columns=[];
for(var j=0;i<numcols;++j){
columns[j]=initial;
}
arr[i]=columns;
}
return arr;
}
5.2处理二维数组的元素
有两种基本的访问方式:按列访问和按行访问;row行,col列。
var grades=[[89,77,78],76,82,81]];
var total=0;
var average=0.0;
for(var row=0;row<grades.length;++row){
for(var col=0;col<grades[row].length;++col){
total+=grades[row][col];
}
average=total/grades[row].length;
print("student "+parseInt(row+1)+" average:"+average.toFixed(2));
total=0;
average=0.0;
}
程序输出为:
student 1 average:81.33
student 2 average:79.67
toFixed(n)保留到小数后n位,grades[row].length使用数组的length属性判断每行包含多少列