数组,在c、Java语言里面是一种数据结构,但是在JavaScript里面是一个对象,主要目的是用一个变量来存储多个值。在一些语言里面,数组只能存储一类数据,但是在JavaScript里,没这限制,当然一个数组里面存储多种数据类型的数据好不好就看自己怎么用了。
声明一个数组,有两种方法:1、var arr=new Array(); 2、var arr=[].很多大牛推荐用第2种方法来初始话数据,据说这样性能更好。
当然在声明数组的时候,我们还能做点其他的事情。如var arr=new Array(5);声明一个数组,并且这个数组的长度为5,和其他语言不同的是,我们可以给这个数组添加超过5个元素,而且这个数组长度可以自动增长。又如var arr=new Array(1,2,3);声明一个数组,并且给这个数组添加三个元素,分别为1,2,3 。又如 var arr=[1,2,3];声明一个数组,并且给这个数组添加三个元素,分别为1,2,3 。这就好比是我们在声明一个变量一样,声明并初始化一个变量。
下面介绍一些数组的方法:
concat() : 用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。如:var a0=[0,1],a1=[1,2],a2=[2,3],a3=[3,4];var arr=a0.concat(a1,a2,a3);可以得到arr=[0, 1, 1, 2, 2, 3, 3, 4].concat的参数可以不是数组,如var arr=a0.concat(a1,a2,a3,5,6,7);可以得到arr=[0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7].返回一个新的数组。
every() : 用于检测数组所有元素是否都符合指定条件(通过函数提供)。方法使用指定函数检测数组中的所有元素:如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测;如果所有元素都满足条件,则返回 true。 every() 不会对空数组进行检测,不会改变原始数组。ie8及以下的浏览器不支持此方法。如:
var ages = [32, 33, 16, 40];function checkAdult(age,index,arr) { console.log('age:'+age+',index:'+index+',arr:'+arr); console.log('this:'+this); return age >= 18;}function myFunction() { var flag = ages.every(checkAdult,ages); console.log('flag:'+flag);}
every的语法:array.every(function(currentValue,index,arr), thisValue)。currentValue(必须,当前元素的值),index(可选,当前元素的索引值),arr(可选,当前元素属于的数组对象),thisValue(可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined")。返回值为true或者false。
filter() : 该方法会创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。该方法不会对空数组进行检测,不会改变原始数组。ie8及以下的浏览器不支持此方法。 filter的语法:array.filter(function(currentValue,index,arr),thisValue) ;currentValue(必须,当前元素的值),index(可选,当前元素的索引值),arr(可选,当前元素属于的数组对象),thisValue(可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined")。返回值为符合条件的元素组成的数组。如:
var ages = [32, 33, 16, 40];function filterAdult(age,index,arr) { console.log('age:'+age+',index:'+index+',arr:'+arr); console.log('this:'+this); return age >= 18;}function myFunction() { var flag = ages.filter(filterAdult,ages); console.log('flag:'+flag);}
indexOf() : 该方法可返回某个指定的元素在数组中首次出现的位置。该方法将从头到尾地检索数组,看它是否含有检索的元素 。开始检索的位置在数组的 fromindex 处或数组的开头(没有指定 fromindex 时)。如果找到一个元素,则返回元素的第一次出现的位置。数组中的字符位置是从 0 开始的。如果在数组中没找到字符串则返回 -1。ie8及以下的浏览器不支持此方法。 indexOf 的语法:array.indexOf(item,start) ;item(必须,查找的元素),start(可选的整数参数。规定在数组中开始查找的位置。它的合法取值是 0 到 array.length - 1。如省略该参数,则将从数组的首个元素开始查找。)。返回值为元素在数组中的位置,如果没与搜索到则返回 -1。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.indexOf("Apple");fruits.indexOf("Appl");
lastIndexOf() : 该方法可返回一个指定的元素在数组中最后出现的位置,在一个在数组中的指定位置从后向前搜索。如果要检索的字符串值没有出现,则该方法返回 -1。该方法将从尾到头地检索数组,看它是否含有检索的元素。开始检索的位置在数组的 fromindex 处或数组的结尾(没有指定 fromindex 时)。如果找到一个元素,则返回找到的元素在数组中的位置。ie8及以下的浏览器不支持此方法。lastIndexOf 的语法:array.lastIndexOf(item,start) ;item(必须,查找的元素),start(可选的整数参数。规定在数组中从最后面开始查找的位置。它的合法取值是 0 到 array.length - 1。如省略该参数,则将从数组的最后一个元素开始查找。)。返回值为元素在数组中的位置,如果没与搜索到则返回 -1。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.lastIndexOf("Apple");fruits.lastIndexOf("Appl");
join() : 该方法用于把数组中的所有元素转换一个字符串,元素是通过指定的分隔符进行分隔的。返回值为一个字符串。该字符串是通过把数组的每个元素转换为字符串,然后把这些字符串连接起来,在两个元素之间插入分隔符而生成的。 join 的语法:array.join(separator); separator(可选,指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。)。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.join();fruits.join('');
map() : 该方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。该方法按照原始数组元素顺序依次处理元素。该方法不会对空数组进行检测,不会改变原始数组。ie8及以下的浏览器不支持此方法。map 的语法:array.map(function(currentValue,index,arr), thisValue) ;currentValue(必须,当前元素的值),index(可选,当前元素的索引值),arr(可选,当前元素属于的数组对象),thisValue(可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined")。如:
var ages = [32, 33, 16, 40];function mapAdult(age,index,arr) { console.log('age:'+age+',index:'+index+',arr:'+arr); console.log('this:'+this); return age-18;}function myFunction() { var flag = ages.map(mapAdult,ages); console.log('flag:'+flag);}
pop() : 该方法用于删除数组的最后一个元素并返回删除的元素。pop 的语法:array.pop() 。如:
var ages = [32, 33, 16, 40];ages.pop();
push() : 该方法可向数组的末尾添加一个或多个元素,并返回新的长度。push 的语法:array.push(item1, item2, ..., itemX) ;item1, item2, ..., itemX(必须,要添加到数组的元素)。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.push("Banana","Orange");fruits.push(["Banana","Orange"]);
shift() : 该方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。shift 的语法:array.shift()。如:
var ages = [32, 33, 16, 40];ages.shift();
unshift() : 该方法可向数组的开头添加一个或更多元素,并返回新的长度。ie8及以下的浏览器不支持此方法。unshift 的语法:array.unshift(item1,item2, ..., itemX) ; item1,item2, ..., itemX(必须,要添加到数组的元素)。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.unshift("Banana","Orange");fruits.unshift(["Banana","Orange"]);
reverse() : 该方法用于颠倒数组中元素的顺序。返回新的数组。reverse 的语法:array.reverse() 。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.reverse();
slice() : 该方法可从已有的数组中返回选定的元素。该方法不会改变原始数组,返回一个数组。 slice 的语法:array.slice(start, end) ; start(必需,规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。),end(可选,规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。) 。如:
var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.slice(1,2);//["Banana"]fruits.slice(1,1);//返回一个空数组fruits.slice(1,-5);//["Banana", "Orange"]fruits.slice(-1);//["Apple"]
splice() : 该方法用于插入、删除或替换数组的元素。该方法会改变原始数组。返回一个数组,如果从原数组中删除了元素,则返回的是含有被删除的元素的数组,否则返回空数组。splice 的语法:array.splice(index,howmany,item1,.....,itemX) ;index(必需,规定从何处添加/删除元素。
该参数是开始插入和(或)删除的数组元素的下标,必须是数字。),howmany(必需,规定应该删除多少元素。必须是数字,但可以是 "0"。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。),item1,.....,itemX(可选,要添加到数组的新元素)。如:var fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"];fruits.splice(1,0,'test');//[]fruits.splice(1,2,'test');//["test", "Orange"]
some() : 该方法用于检测数组中的元素是否满足指定条件(函数提供)。该方法会依次执行数组的每个元素,如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测;如果没有满足条件的元素,则返回false。该方法不会对空数组进行检测,不会改变原始数组。ie8及以下的浏览器不支持此方法。some 的语法:array.some(function(currentValue,index,arr),thisValue) ;currentValue(必须,当前元素的值),index(可选,当前元素的索引值),arr(可选,当前元素属于的数组对象),thisValue(可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined")。如:
var ages = [32, 33, 16, 40];function someAdult(age,index,arr) { console.log('age:'+age+',index:'+index+',arr:'+arr); console.log('this:'+this); return age>18;}function myFunction() { var flag = ages.some(someAdult,ages); console.log('flag:'+flag);}
sort() : 该方法用于对数组的元素进行排序。该方法会改变原始数组。排序顺序可以是字母或数字,并按升序或降序,默认排序顺序为按字母升序。当数字是按字母顺序排列时"40"将排在"5"前面,使用数字排序,你必须通过一个函数作为参数来调用,函数指定数字是按照升序还是降序排列。返回排序后的数组。sort 的语法:array.sort(sortfunction);sortfunction(可选,规定排序顺序。必须是函数。)。如:
var ages = [32, 33, 16, 40];ages.sort(riseFunc);//升序function riseFunc(l,r){ return l-r;}//降序function downFunc(l,r){ return r-l;}
toString() : 该方法可把数组转换为字符串,并返回结果。数组中的元素之间用逗号分隔。toString的语法:array.toString() 。如:
var ages = [32, 33, 16, 40];ages.toString();//"32,33,16,40"
valueOf() : 该方法返回 Array 对象的原始值。该原始值由 Array 对象派生的所有对象继承。valueOf() 方法通常由 JavaScript 在后台自动调用,并不显式地出现在代码中。valueOf() 方法不会改变原数组。valueOf 的语法:array.valueOf() 。如:
var ages = [32, 33, 16, 40];ages.valueOf();
遍历数组:遍历数组最常用的方法是使用for循环,如:
var arr=[0, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7];for(var i=0;i
有人说数组这里的arr.length应该用一个变量缓存起来,这样速度更快,个人觉得没这必要,数组的length是他的属性,当你改变数组的时候,js会自动维护这个属性,所以你每次使用arr.length的时候其实并没有去计算数组的长度。 再有就是for...in,但是for...in在某些浏览器上存在兼容性问题,而且性能上也比for循环差不少,所以比较少用,在遍历对象的时候倒是用的不少。 还有就是forEach,IE8及以下的浏览器不支持,如:
var arr=[0, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7];arr.forEach(function(element, index, array){ console.log('element:'+element+',index:'+index+',array:'+array)});
判断是否是数组:
function isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }