数组对象用来在单独的变量名中存储一系列的值。在JavaScript中我们有且仅能使用关键词 new 来创建数组对象。
var myArray = new Array();
console.log(myArray.length); //输出0
myArray[0] = 'China';
myArray[1] = 'America';
myArray[2] = 'Japan';
//输出 [ 'China', 'America', 'Japan' ]
也可以使用一个整数来控制数组的容量:
var myArray = new Array(3);
console.log(myArray.length); //输出3
//输出 [ , , , ]
myArray[0] = 'China';
myArray[1] = 'America';
myArray[2] = 'Japan';
//输出 [ 'China', 'America', 'Japan' ]
如果声明数组时括号内的变量不止一个或不是整数,那么就不是数组容量,而是直接定义数组内的变量了。
也可以直接使用方括号初始化数组变量。
var myArray1 = new Array(1,2,3);
//输出 [ 1, 2, 3 ]
var myArray2 = [1, 2, 3];
//输出 [ 1, 2, 3 ]
var myArray3 = new Array('1');
//输出 [ 1 ]
通过指定数组名以及索引号码,你可以访问某个特定的元素。
即使数组下标越界也不会报错,只会返回 undefined。
var myArray = new Array(1,2,3); // [ 1, 2, 3 ]
myArray[0]; // 1
myArray[3]; // undefined, 在打印数组时会被显示为空串
如需修改已有数组中的值,只要向指定下标号添加一个新值即可。
JavaScript是弱类型的,数组中的所有变量类型都为var,所以在一个数组中可以同时出现诸如 “string” 和 “int”,之类不同类型的值。
如果下表越界,则会将超出部分至该位置之前的值全部定义为空(这里既不是undefined,也不是null,也不是”)。
var myArray = new Array('China', 'America', 'Japan');
myArray[0] = 0;
myArray[4] = 4;
//输出 [ 0, 'America', 'Japan', , 4 ]
var arr = [1,2,3];
arr[5] = 0;
console.log(arr);
//输出 [ 1, 2, 3, , , 0 ]
var arr = [1,2,3];
arr.push('x', 'y', 'z');
//输出 6
console.log(arr);
//输出 [ 1, 2, 3, 'x', 'y', 'z' ]
var arr = [1,2,3];
arr.unshift('x', 'y', 'z');
//输出 6
console.log(arr);
//输出 [ 'x', 'y', 'z', 1, 2, 3 ]
var arr = [1,2,3,4,5];
arr.splice(1, 0, 'm');
//输出 []
console.log(arr);
//输出 [ 1, 'm', 2, 3, 4, 5 ]
arr.splice(1, 3, 'x', 'y', 'z');
//输出 [ 'm', '2', '3' ]
console.log(arr);
//输出 [ 1, 'x', 'y', 'z', 4, 5 ]
var arr = [ 1, 2, 3];
arr.pop();
//输出 3
console.log(arr);
//输出 [ 1, 2 ]
var arr = [ 1, 2, 3];
arr.shift();
//输出 1
console.log(arr);
//输出 [ 2, 3 ]
var arr = [1,2,3,4,5];
arr.splice(1, 1);
//输出 [ 2 ]
console.log(arr);
//输出 [ 1, 3, 4, 5 ]
arr.splice(1, 3, 'x', 'y', 'z');
//输出 [ 3, 4, 5 ]
console.log(arr);
//输出 [ 1, 'x', 'y', 'z' ]
var myArray = new Array(1,2,3);
for(var value in myArray) {
console.log(value);
}
使用 join( [ separator ] ),separator 默认为逗号(,)。
toLocaleString 、toString 、valueOf:可以看作是join的特殊用法,不常用
var myArray = new Array(1,2,3,undefined,4);
myArray.join(); //输出 '1,2,3,,4'
myArray.join('-'); //输出 '1-2-3--4'
myArray.join('-*-'); //输出 '1-*-2-*-3-*--*-4'
myArray.toString(); //输出 1,2,3,,4
myArray.toLocaleString(); //输出 1,2,3,,4
使用 arrayA.concat( arrayB ) 方法来合并两个数组,合并操作不会修改原数组。
var arrayA = new Array(1,2,3);
var arrayB = new Array();
arrayB[0] = 'a';
arrayB[1] = 'b';
arrayB[2] = 'c';
arrayA.concat(arrayB);
//输出 [ 1, 2, 3, 'a', 'b', 'c' ], 该操作只会生成一个新数组, 并不会修改原先的数组
//arrayA = [ 1, 2, 3]
//arrayB = [ 'a', 'b', 'c']
slice(start, [end]) 以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制 start 之后的所有元素。
该操作返回一个新的数组,并不会修改原来的数组。
var arr = [ 1, 2, 3, 4, 5 ];
arr.slice(2);
//输出 [3, 4, 5 ]
arr.slice(2, 4);
//输出 [ 3, 4 ]
console.log(arr);
//输出 [ 1, 2, 3, 4, 5]
使用 sort( [ function ] ),sort 默认按ASCII码进行排序。
sort 会直接改变数组中的元素排列方式
(1)纯数字的情况
var numArray = [1, 999, 123, 55, -30];
numArray.sort();
//输出 [ -30, 1, 123, 55, 999 ]
numArray.sort(function(a, b){
//在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
return a-b;
});
//输出 [ -30, 1, 123, 55, 999 ]
numArray.sort(function(a, b){
return b-a;
});
//输出 [ 999, 123, 55, 1, -30 ]
(2)混合基本变量的默认排序方式(前2个比较方式均是错误的)
var myArray = ['bob', 'America', , undefined, 'Tina', 'China', 1, '=', '3', true ];
myArray.sort(function(a, b){
//当不是数字时,根本无法适用于减号('-')操作符,所以返回0,不进行排序
return a-b;
});
// 输出 ['bob', 'America', true, 'Tina', 'China', 1, '=', '3', undefined, ]
myArray.sort(function(a, b){
return b-a;
});
// 输出 [ 'bob', 'America', true, 'Tina', 'China', 1, '=', '3', undefined, ]
myArray.sort();
// 输出 [ true, 1, '3', '=', 'America', 'China', 'Tina', 'bob', undefined, ], 两个不可比较的数字, JS默认会按照ASCII码进行排序。
(3)混合基本变量的自定义排序方式
var myArray = ['bob', 'America', undefined, , 'Tina', 'China', 1, '=', '3', true ];
var sortFunc = function(reverse) {
return function(a, b) {
/*
根据我的测试,这一段可以不要,因为undefined和(空)根本不会进入比较。
if(!a && !b) {
return 0;
}
if(a && !b) {
console.log('a && !b');
return reverse ? -1 : 1;
}
if(!a && b) {
console.log('!a && b');
return reverse ? 1 : -1;
}
*/
if(typeof a === typeof b) {
if(reverse) {
return a > b ? -1 : 1;
}
return a < b ? -1 : 1;
}
if(reverse) {
return typeof a > typeof b ? -1 : 1;
}
return typeof a < typeof b ? -1 : 1;
};
};
myArray.sort(sortFunc(false));
//输出 [ true, 1, '3', '=', 'America', 'China', 'Tina', 'bob', undefined, ]
myArray.sort(sortFunc(true));
//输出 [ 'bob', 'Tina', 'China', 'America', '=', '3', '1', true, undefined, ]
(4)JSON对象的自定义排序方式
var employees=[]
employees[0]={name:"Bob", age:32}
employees[1]={name:"Tina", age:17}
employees[2]={name:"Bob", age:62}
employees[3]={name:"Tom", age:58}
var sortBy = function(major, minorFunc) {
return function(a, b) {
if(typeof a === 'object' && typeof b === 'object') {
var nameA = a[major];
var nameB = b[major];
if(nameA === nameB) {
return typeof minorFunc === 'function' ? minorFunc(a,b) : 0;
}
if(typeof nameA === typeof nameB) {
return nameA < nameB ? -1:1;
}
return typeof nameA < typeof nameB ? -1 : 1;
}
return 0;
};
};
employees.sort(sortBy('name',sortBy('age')));
/*
输出
[ { name: 'Bob', age: 32 },
{ name: 'Bob', age: 62 },
{ name: 'Tina', age: 17 },
{ name: 'Tom', age: 58 } ]
*/
reverse() 会直接修改数组中的元素排列方式
var arr = [1,2,3];
arr.reverse();
//输出 [ 3, 2, 1 ]