使用字面量创建数组:
var arr=[1,true,"hello",4,5,10]; //可以在创建时指定数组元素,数组中的元素可以是任意数据类型
var arr2=new Array(10,20,30); //使用构造函数创建数组也可以同时添加元素
arr=10; //数组中只有一个元素10
arr2=new Array(10); //数组长度为10
arr=[[2,3],[4,5]]; //二维数组
数组的常用方法:
1.push(),向数组末尾添加一个或多个元素,并返回数组新的长度,可以将要添加的元素作为方法的参数传递,这样元素会自动添加到数组末尾
var arr=[1,2,3];
var result=arr.push(4,5,6);
console.log(result); //运行结果:6
2.pop(),该方法可以删除数组的最后一个元素,并将被删除的元素作为返回值返回
var arr=[1,2,3];
var result=arr.pop();
console.log(result); //运行结果:3
3.unshift(),向数组开头添加一个或多个元素,并返回新的数组长度,向前面插入元素后,其他元素的索引会依次调整
4.shift(),删除数组的第一个元素,并将被删除的元素作为返回值返回
数组的遍历:
var arr=[1,2,3,4,5,6];
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
}
JS中的forEach()方法也可以遍历数组,但它只支持IE8(不包含)以上的浏览器,此方法需要一个函数作为参数(这种由我们创建但不由我们调用的函数称为回调函数),数组中有几个元素就会执行几次,每次执行时,浏览器会将遍历到的元素以实参的形式传递进来。浏览器会在回调函数中传递三个参数:1.当前遍历的元素,2.当前遍历元素的索引,3.正在遍历的数组
var arr=[1,2,3,4,5,6];
arr.forEach(function(value,index,obj){
console.log(arr);
});
slice(),从数组中提取指定元素,有截取开始位置的索引(包含)和截取结束位置的索引(不包含)两个参数,第二个参数可以省略不写,此时截取从开始索引往后的所有元素,索引可以传递一个负值,表示从后往前计算(例如-1表示倒数第一个元素)。该方法不会截取原数组,而是将截取到的元素封装到一个新数组中返回
var arr=[1,2,3,4,5,6];
var result=arr.slice(1,-2);
console.log(result); //运行结果:2,3,4
splice(),此方法会影响原数组,将指定元素从原数组中删除,并将被删除的元素作为返回值返回,还可以添加新的元素。传递三个参数,第一个表示开始位置的索引,第二个表示删除的数量,第三个及更多的参数可以传递一些新的元素,这些元素将会自动插入到开始位置索引前面
var arr=[1,2,3,4,5,6];
var result=arr.splice(0,2,9,8);
console.log(result); //运行结果:1,2
//原数组:9,8,3,4,5,6
concat(),连接两个或更多的数组,并将新数组返回,该方法不会对原数组产生影响
var arr1=[1,2];
var arr2=[3,4];
var arr3=[5,6];
var result=arr1.concat(arr2,arr3,9,8);
console.log(result); //运行结果:1,2,3,4,5,6,9,8
join(),将数组转换为字符串,不会对原数组产生影响。在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符,如果不指定连接符,则默认是“,”
var arr=[1,2,3,4,5,6];
result=arr.join("x");
console.log(result); //运行结果:1x2x3x4x5x6
reverse(),反转数组,此方法会直接修改原数组
var arr=[1,2,3,4,5,6];
arr.reverse();
console.log(arr); //运行结果:6,5,4,3,2,1
sort(),对数组中的元素进行排序,会影响原数组,默认按照Unicode编码进行排序。
var arr=[d,a,c,b,e];
arr.sort();
console.log(arr); //运行结果:a,b,c,d,e
var arr1=[2,3,5,11,4];
arr1.sort();
console.log(arr1); //运行结果:11,2,3,4,5
我们也可以自己定义排序的规则:在sort()中添加一个回调函数来指定排序规则,回调函数中需要定义两个形参,浏览器会分别使用数组中的元素作为实参去调用回调函数。浏览器根据回调函数的返回值来决定元素的顺序:返回值>0,元素交换位置;返回值<0,元素位置不变;返回值=0,认为两个元素相等,位置也不变
var arr=[2,3,5,11,4]; //升序排列
arr.sort(function(a,b){
/*if(a>b){
return 1;
}else if(a<b){
return -1;
}else{
return 0;
}*/
return a-b;
});
console.log(arr); //运行结果:2,3,4,5,11
函数的方法:
call()和apply(),都是函数对象的方法,需要通过函数对象调用,当对函数调用call()和apply()时都会执行函数。在调用call()和apply()时可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this。call()方法可以将实参在对象之后依次传递;apply()方法需要将实参封装到一个数组中统一传递。
function fun(a,b){
console.log(a);
console.log(b);
}
var obj={
name:"obj",
sayName:function(){
alert(this.name);
}
};
fun.call(obj,2,3); //输出2,3
fun.apply(obj,[2,3]); //输出2,3
callback:
1.以函数形式调用,this是window
2.以方法的形式调用,this是调用方法的对象
3.以构造函数的形式调用,this就是新创建的那个对象
4.使用call()和apply()调用时,this是指定的对象
arguments:
在调用函数时,浏览器每次都会传递进两个隐含的参数:
1.函数的上下文对象
2.封装实参的对象arguments
arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度。在调用函数时,我们所传递的实参都会在arguments中保存,arguments.length可以用来获取实参的长度。我们即使不定义形参,也可以通过arguments来使用实参:arguments[0]表示第一个参数,arguments[1]表示第二个参数。此对象有一个属性callee,这个属性对应一个函数对象,就是当前正在执行的函数的对象
function fun(){
console.log(arguments.length);
}
fun("hello",3); //运行结果:2
(作者观看的学习视频:B站尚硅谷)