数组
创建数组
var arr1 = new Array();
var arr2 = new Array(1,'2',true);
var arr3 = [];
var arr4 = [1,'2',true];
new关键字只有在实例化对象或者需要延迟加载数据的情况下才使用。在JavaScript中分配大量的new变量地址是一项很慢的操作,考虑效率要避免使用。
用[]的形式创建数组,代码简单且效率更好。arr = []创建数组时,会分配默认元素个数,也就是说,哪怕只有一个元素,也会占据默认元素个数的空间,当元素个数超过个数时,会再度分配新的空间出来。
数组的内存空间
了解JavaScript数组的特殊性
了解数据结构中数组的定义:
在计算机科学中,数组数据结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。——维基百科
由此,数组应该满足:
- 数组中所有元素是同种类型的元素(同一类型元素所需存储空间大小一致,所以我们可以很方便的利用元素的索引来计算出元素所在的位置);
- 分配一块连续的内存存储(固定长度、连续)。
了解js中的数组
var arr = [1 , '2' , true , [3]];
- 同一个JS数组的元素可以是不同的数据类型;
- JS数组可以任意更改大小。
数组变大的部分,内存空间可能不连续
数组的属性
length 数组长度
var arr = [1,2,3];
alert(arr.length);//读取数组长度,结果为3
arr.length = 10;//修改数组长度为10,此时数组增加七个空值
arr.length = 0;//快速清空数组,此时数组中没有任何元素
constructor 创建数组对象的原型函数
arr本身没有constructor属性,arr.constructor真实情况是arr.__proto__.constructor
var arr = [1,2,3];
//判断arr是不是数组
console.log(arr.constructor === Array);
//判断arr是不是Array构造函数的实例化对象
prototype 数组构造函数中添加属性或方法
Array.prototype.sum = function() {
var sum = 0;
for(var i = 0;i < this.length;i++){
sum += this[i];
}
return sum;
}
数组的方法
常用
isArray() 判断数组
//现有一个变量arr,判断是否是数组类型
//1.最常用,最好用的方法
Array.isArray(arr);
//2.只能有一个全局执行环境才能实现的方法
arr instanceof Array;
/*如果网页中包括多个框架(iframe),实际上就存在多个全局执行环境,从而存在多个版本Array构造函数,
如果从一个框架向另一个框架传入数组,那么传入的数组在第二个框架中原生创建的数组分别具有不同的构造函数*/
//3.对象构造函数的constructor判断
arr.__proto__.constructor === Array;
/*arr的隐式原型属性指向构造函数的原型对象,原型对象的constructor属性指向构造函数*/
//4.Array原型链上的isPrototypeOf
Array.prototype.isPrototypeOf(arr);
/* isPrototypeOf() 用于测试一个对象是否存在于另一个对象的原型链上*/
//5.Object.getPrototypeOf
Object.getPrototypeOf(arr) === Array.prototype;
/*Object.getPrototypeOf()方法返回指定对象的原型*/
//6.Object.prototype.toString
Object.prototype.toString.call(arr) === '[object Array]';
/*虽然Array继承自Object,但js在Array.prototype上重写了toString,
而我们通过toString.call(arr)实际上是通过原型链调用*/
push() 尾部添加
//向数组末尾添加一个或多个元素,并返回数组长度
/*参数:至少一个
返回值:数组长度
是否改变原数组:是*/
var array=["张三","李四","王五"];
/*将要添加的元素作为方法的参数*/
var num=array.push("赵高","嬴政"); //num为数组长度
console.log(num); //结果为5
console.log(array); //["张三","李四","王五","赵高","嬴政"]
pop() 尾部删除
//删除并返回数组的最后一个元素
/*参数:无,
返回值:被删除元素的值,
是否改变原数组:是*/
var array=["张三","李四","王五"];
var result=array.pop();
console.log(array); //"张三,李四"
console.log("result"+result); //"王五"
unshift() 头部添加
//向数组的开头添加一个或多个元素,并返回数组长度
/*参数:至少一个,
返回值:数组长度,
是否改变原数组:是*/
var array=["张三","李四","王五"];
/*将要添加的元素作为方法的参数*/
var num=array.unshift("赵高","嬴政"); //num为数组长度
console.log(num); //结果为5
console.log(array); //["赵高","嬴政","张三","李四","王五"]
shift() 头部删除
//删除数组的第一个元素,并返回被删除的元素
/*参数:无
返回值:被删除的元素值,
是否改变原数组:是*/
var array=["张三","李四","王五"];
console.log(array);
var result=array.shift();
console.log(array); //"李四,王五"
console.log("result"+result); //"张三"
slice() 截取数组
//从某个已有的数组返回选定的元素
//arraryObject.slice(start,end);
/*参数:分多种情况
返回值:新的数组,
是否改变原数组:否*/
var array=["一号位","二号位","三号位","四号位","五号位"];
result=array.slice(0,2);
console.log("result1="+result); //result1="一号位","二号位"
//不写第二个参数
result==array.slice(2);
console.log("result2="+result); //result2="三号位","四号位","五号位"
//第二个参数为负数
result==array.slice(1,-1);
console.log("result3="+result); //result3="二号位","三号位","四号位"
splice() 增删改数组
//删除元素,并将被删除元素返回,并向数组添加新元素
/*result=array.splice(1,2);
第一个参数表示起始位置索引
第二个参数表示数量
第三个及以后可以是新的元素*/
/*参数:分多种情况
返回值:被删除的元素,
是否改变原数组:是*/
var array=["一号位","二号位","三号位","四号位","五号位"];
result=array.splice(0,2,"六号位");
console.log(array); //"六号位","三号位","四号位","五号位"
console.log("result="+result); //result1="一号位","二号位"
//只两个参数,实现删除功能
//第二个参数为0,只实现插入功能
concat() 连接数组
//合并两个或多个数组,并将新数组返回
/*参数:一个或多个数组或数组值
返回值:新数组,
是否改变原数组:否*/
var array1=["一号位","二号位","三号位"];
var array2=["四号位","五号位","六号位"];
var array3=array1.concat(array2);
console.log(array3); //["一号位","二号位","三号位","四号位","五号位","六号位"]
console.log(array1); //["一号位","二号位","三号位"]
console.log(array2); //["四号位","五号位","六号位"]
join() 数组转字符串
//将一个数组转换成一个字符串,并将结果返回
/*参数:连接数组元素的字符
返回值:字符串,
是否改变原数组:否*/
var array=["一号位","二号位","三号位","四号位","五号位"];
var result=array.join("+");
console.log(result); //结果为"一号位+二号位+三号位+四号位+五号位"
console.log(array); //["一号位","二号位","三号位","四号位","五号位"]
sort() 数组排序
//数组里的元素进行排序
//默认按照Unicode编码进行排序
//自己规定排序规则
/*参数:函数
返回值:排序后的数组,
是否改变原数组:是*/
var array=["4","5","6","7","8","9","13","12","11","10"];
array.sort(function(a,b){
//升序
return a-b;
});
console.log(array); //["4","5","6","7","8","9","10","11","12","13"]
reverse() 反转数组
//反转数组
/*参数:数组
返回值:反转后的数组,
是否改变原数组:否*/
var array=["一号位","二号位","三号位","四号位","五号位"];
var result=array.reverse(array);
//结果为"五号位","四号位","三号位","二号位","二号位"
其他数组方法
快速排序算法
function quickSort(arr){
//当数组长度只有1或0直接返回数组
if(arr.length<=1) {return arr};
//声明左数组和右数组
let left = [],right = [];
//使用第一个元素做基准值
let base = arr[0];
//遍历
for(let i = 1,len = arr.length;i<len;i++){
if(arr[i]<base){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return [].concat(quickSort(left),[base],quickSort(right));
}
使用Set() 数组去重
let arr = [1,1,1,1,1,1,1,1];
//使用Array.form将伪数组转化为真数组
arr = Array.form(new Set(arr));
forEach() 遍历
let arr = [1,,55,16,3,84,6,354,34];
/*参数:回调函数,回调函数this指向
回调函数参数:元素,索引,数组*/
arr.forEach(function(value,index,arr){
//数组的处理
})
some()
let arr = [1,2,3,4,5,6,97,441];
/*遍历数组,找到一个符合条件的值,找到就中止并返回true*/
/*参数:回调函数,回调函数中this指向
回调函数参数:元素,索引,原数组*/
//判断数组中是否有值大于10
arr.some(function(value,index,arr){
return value>10;
})
every()
let arr = [1,565,1,851,65,41,3,541];
//遍历数组,所有数组值都符合条件才返回true
/*参数:回调函数,回调函数中this指向
回调函数参数:元素,索引,原数组*/
arr.every(function(value,index,arr){
return value>10;
})
filter() 过滤数组
let arr = [1,2,3,4,5,6,7,8,9,70];
//遍历数组的时候将返回值为 true 的元素放入新数组
/*参数:回调函数,回调函数this指向
回调函数参数:元素,索引,数组*/
let newArr = arr.filter(item => item % 2 === 0);
map()
//map作用是生成新数组,遍历元素组放到新数组里
/*参数:回调函数,回调函数中this指向
回调函数参数:元素,索引,原数组*/
let arr = [1,2,3,4,5,6,7,8,9,10];
let newArr = arr.map(item => if(item<5){continue;})
reduce()
/*reduce接受两个参数
参数一 回调函数接受四个参数
accumulator 累计器
currentValue 当前值
currentIndex 当前索引
array 数组
参数二 第一次调用callback函数时的第一个参数的值
如无,则使用数组中第一个元素
*/
let arr = [1,2,3,4];
let sum = arr.reduce((acc,current) => acc + current , 10000);
console.log(sum); //10100;