定义数组
var a = new Array();表示定义空数组
var a = new Array(1,true,“string”,[1,2],{x:1,y:2});实数数组
var a = new Array(5);只有一个参数时候表示定义数组长度
var a = new Array(1);表示定义数组长度1,不是数组a[0]
var a =[1,true,“string”,[1,2],{x:1,y:2}];使用直接量定义数组,是用[ ]而不是{ }
使用数组
数组长度是弹性的,且下标都是从0开始的
如果下标为负数,浮点数,布尔值,对象等其他值,JavaScript将自动将它转换为字符串,作为对象属性的名字,而不再是数组下标
数组长度为length属性
var a = [1,2,3]; // 声明数组直接量
a.length = 5; // 增长数组长度
alert(a[4]); // 返回undefined,说明该元素还没有被赋值
a.length = 2; // 缩短数组长度
alert(a[2]); // 返回undefined,说明该元素的值已经丢失
可以通过数组方式支持栈和队列结构操作
可以通过对象结构支持哈希表结构类型
多维数组定义:
var a = [ // 定义二维数组
[1,2,3],
[4,5,6],
[7,8,9]
];
使用数组对象
检索数组
1, for(var i in a) alert(a[i]);
2, for( var i = 0; i < a.length ; i ++ ) alert(a[i]);
操作数组:
1,pop()和push()操作同栈操作表示对数组尾部进行操作
var a = []; // 定义数组,模拟空栈
a.push(1); // 进栈,栈值为[1],此时该方法返回值为1
a.pop(); // 出栈,栈值为空,此时该方法返回值为1
a.push(2); // 进栈,栈值为[2],此时该方法返回值为1
a.pop(); // 出栈,栈值为空,此时该方法返回值为2
a.push(3,4); // 进栈,栈值为[3,4],此时该方法返回值为2
2,unshift()和shift()表示对数组头部进行操作
var a = [0]; // 定义数组
a.unshift(1,2); // 同时增加两个元素
alert(a); // 返回[1,2,0]
var a = [0]; // 定义数组
a.unshift(1); // 增加元素1
a.unshift(2); // 增加元素2
alert(a); // 返回[2,1,0]
shift()表示将数组的第一个元素移出,并返回该元素的值,然后将剩下的所有元素前移一位,如果数组为空,不进行任何操作,返回undefined
3,concat()合并数组
var a = [1,2,3,4,5]; // 定义数组
var b = a.concat(6,7,8); // 为数组a连接3个元素
alert(b); // 返回[1,2,3,4,5,6,7,8]
concat后面参数也可以跟随多个参数,多个数组进行合并
var a = [1,2,3,4,5]; // 定义数组
var b = a.concat([[1,2],3],[4,5]); // 连接数组
alert(b.length); // 返回9,说明数组[1,2]没有被打散
操作子数组
1,splice()表示插入,删除或者替换数组的元素
第一个参数为操作的起始下标(0开始),第二个参数为指定删除的元素个数,第三个及以后表示删除点插入的元素
例如:
var a = [1,2,3,4,5]; // 定义数组
a.splice(1,2,3,4,5) // 执行删除和插入操作
alert(a); // 返回[1, 3,4,5,4,5]
var a = [1,2,3,4,5]; // 定义数组
a.splice(2); // 从第三个元素开始执行删除
alert(a); // 返回[1, 2]
var a = [1,2,3,4,5]; // 定义数组
a.splice(2,2); // 从第三个元素开始删除二个元素
alert(a); // 返回[1, 2, 5]
var a = [1,2,3,4,5]; // 定义数组
a.splice(2,0,0,0,0); // 执行插入多个元素操作
alert(a); // 返回[1, 2, 0, 0, 0, 3, 4, 5]
var a = [1,2,3,4,5]; // 定义数组
var b = a.splice(6,2,2,3); // 起始值大于length属性值
alert(a); // 返回[1, 2, 3, 4, 5, 2, 3]
var a = [1,2,3,4,5]; // 定义数组
var b = a.splice(-2,-2,2,3); // 第一、二个参数都为负值
alert(a); // 返回[1, 2, 3, 2, 3, 4, 5]
当第一个参数大于length时,表示在尾部添加元素
当第一个参数为负数时,表示从尾部向前数,最后一个元素下标为-1,所以例子中-2表示在元素4之前插入2,3元素,第二个参数为负数时被视为0
2,slice()表示返回数组的一部分
第一个参数表示起始下标(包括起始下标),第二个参数表示结束下标(不包括结束下标)
var a = [1,2,3,4,5]; // 定义数组
var b = a.slice(2,5);
// 截取数组中第三个元素到第六个元素前的所有元素
alert(b); // 返回[3, 4, 5]
var b = a.slice(2);
// 截取数组中第三个元素,以及后面所有元素
alert(b); // 返回[3, 4, 5]
var b = a.slice(-4,-2);
// 截取倒数第四个元素,直到倒数第二个元素前的所有元素
alert(b); // 返回[2, 3]
var b = a.slice(-2,-4);
// 截取倒数第二个元素,直到倒数第四个元素前的所有元素
alert(b); // 返回空集
var b = a.slice(3,10); // 截取第四个元素,直到后面所有元素
alert(b); // 返回[ 4, 5]
当参数为负数时,按照末尾元素下标为-1,依次类推
当第一个参数大于等于第二个参数时,不执行操作,返回空集
当第一个参数大于length时,不执行操作,返回空数组
当第二个参数大于length时,被视为length
slice()不会修改元数组,splice()会修改原数组
数组排序
1,reverse()表示颠倒数组中元素位置
var a = [1,2,3,4,5]; // 定义数组
a.reverse(); // 颠倒数组顺序
alert(a); // 返回数组[5,4,3,2,1]
2,sort()表示对数组元素进行排序
var a = ["a","e","d","b","c"]; // 定义数组
a.sort(); // 按字母顺序对元素进行排序
alert(a); // 返回数组[a,b,c ,d,e]
var a = ["aba","baa","aab"]; // 定义数组
a.sort(); // 按字母顺序对元素进行排序
alert(a); // 返回数组[aab,aba ,baa]
使用排序函数
排序函数调用,a.sort(f)
排序函数:必须包含两个参数a,b
如果a在b前面,则返回小于0值,如,1
如果a在b后面,则返回大于0值,如,1
例如:表示奇数排在前面,偶数排在后面
function f( a, b ){ // 排序函数
var a = a % 2; // 获取参数a的奇偶性
var b = b % 2; // 获取参数b的奇偶性
if( a == 0 ) return 1; // 如果参数a为偶数,则排在左边
if( b == 0 ) return -1; // 如果参数b为偶数,则排在右边
}
var a = [3, 1, 2, 4, 5, 7, 6, 8, 0, 9]; // 定义数组
a.sort( f ); // 根据数字大小由大到小进行排序
alert( a ); // 返回数组[3,1,5,7,9,0,8,6,4,2]
数组和字符串转换
1,toString()将数组换成字符串,当数组用于祖父从环境中,JavaScript会自动调用toString(),比如:数组相加,多维数组转换成字符串时,会将元素全部提取出然后用逗号隔开
例如:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; // 定义数组
var s = a.toString(); // 把数组转换为字符串
alert( s ); // 返回字符串"1, 2, 3, 4, 5, 6, 7, 8, 9, 0"
alert( typeof s ); // 返回字符串string,说明是字符串类型
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; // 定义数组
var b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; // 定义数组
var s = a + b; // 数组连接操作
alert( s );
// 返回字符串"1, 2, 3, 4, 5, 6, 7, 8, 9, 01, 2, 3, 4, 5,
//6, 7, 8, 9, 0"
alert( typeof s ); // 返回字符串string,说明是字符串类型
var a = [[1, [2, 3], [4, 5]], [6, [7, [8, 9], 0]]];
// 定义多维数组
var s = a.toString(); // 把数组转换为字符串
alert( s ); // 返回字符串"1, 2, 3, 4, 5, 6, 7, 8, 9, 0"
2,toLocalString()将数组转换成局部字符串,根据特定区域分隔符把生成字符串连接起来,例如:大陆将数组转换为浮点数再执行字符串操作
3,join()将数组元素连接起来构建一个字符串
例如:
var b = a.join("==")表示元素用 == 连接的字符串
4,与join()相反的split(),split()表示根据分隔符分隔成数组
例如:
var s = "1==2== 3==4 ==5"; // 定义字符串
var a = s.split("=="); // 分隔字符串为数组
alert( a ); // 返回数组[1, 2, 3, 4, 5]
alert( a.constructor == Array ); // 返回true,说明是数组
定位
1,indexOf()表示数组从前往后搜索到元素的下标,未找到返回-1
第一个参数表示指定值,第二个参数表示起始位置fromIndex(可选,默认为0),如果第二个参数为负表示fromIndex+length位置开始,如果为大于length则返回-1
例如:
var ar = ["ab", "cd", "ef", "ab", "cd"];
document.write(ar.indexOf("cd") + "<br/>"); //1
document.write(ar.indexOf("cd", 2) + "<br/>"); //4
document.write (ar.indexOf("gh")+ "<br/>"); //-1
document.write (ar.indexOf("ab", -2) + "<br/>"); //3
2,lastIndexOf()表示返回指定值再数组中最后一个匹配项的索引,参数同IndexOf(),只是从后向前搜索
迭代
1,forEach为数组中每个元素调用定义的回调函数
回调函数:function callbackfn(value,index,array)
function ShowResults(value, index, ar) {
document.write("value: " + value);
document.write(" index: " + index);
document.write("<br />");
}
var letters = ['a', 'b', 'c'];
letters.forEach(ShowResults);
2,every检查定义的回调函数是否为数组的任何元素返回true
function CheckIfEven(value, index, ar) {
document.write(value + " ");
if (value % 2 == 0)
return true;
else
return false;
}
var numbers = [2, 4, 5, 6, 8];
if (numbers.every(CheckIfEven))
document.write("都是偶数。");
else
document.write("不全为偶数。");// 2 4 5不全为偶数。
包含多个参数
//下面示例检测数组numbers中元素的值是否在指定范围内。
var checkNumericRange = function(value) {
if (typeof value !== 'number')
return false;
else
return value >= this.minimum &&
value <= this.maximum;
}
var numbers = [10, 15, 19];
var obj = { minimum: 10, maximum: 20 }
if (numbers.every(checkNumericRange, obj))
document.write ("都在指定范围内。");
else
document.write ("部分不在范围内。");
3,some检查定义的回调函数是否为数组的任何元素返回true
function CheckIfEven(value, index, ar) {
if (value % 2 == 0)
return true;
}
var numbers = [1, 15, 4, 10, 11, 22];
var evens = numbers.some(CheckIfEven);
if(evens)
document.write("不全是奇数。");
else
document.write("全是奇数。");
4,map对数组的每个元素调用定义的回调函数,并返回包含结果的数组
相当于对数组进行操作
例如:
var obj = {
divisor: 10,
remainder: function (value) {
return value % this.divisor;
}
}
var numbers = [6, 12, 25, 30];
var result = numbers.map(obj.remainder, obj);
document.write(result); // 6,2,5,0
5,filter对数组的每个元素调用定义的回调函数,并返回回调函数为其返回true的值的数组
例如:筛选出数组中的素数
function CheckIfPrime(value, index, ar) {
high = Math.floor(Math.sqrt(value)) + 1;
for (var div = 2; div <= high; div++) {
if (value % div == 0) {
return false;
}
}
return true;
}
var numbers = [31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53];
var primes = numbers.filter(CheckIfPrime);
document.write(primes); //31,37,41,43,47,53
使用filter方法过滤字符串中每个单词的首字母。
function CheckValue(value, index, ar) {
if (index == 0)
return true;
else
return ar[index - 1] === " ";
}
var sentence = "The quick brown fox jumps over the lazy dog.";
var subset = [].filter.call(sentence, CheckValue);
document.write(subset); // T,q,b,f,j,o,t,l,d
实用例子
快速交换
a=[b,b=a][0]可以快速交换a,b的值
数组下标
数组的下标不一定是非负整数,可以是其他任意类型
例如:
var a = [];
a[true] = 1;
a[“张三”] = 1;
a[1,1] = 4;(逗号运算符,其运算返回值是最后一个值)
JavaScript不支持二维数组