数组字面量
一个数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式,数组字面量可以出现在任何表达式可以出现的地方,数组的第一个值将获得属性名 '0',第二个值将获得属性名 '1',以此类推。
var empty = [];
var numbers = ['zero', 'one', 'two', 'three'];
empty[1] //undefined
numbers[1] // 'one'
empty.length; //0
numbers.length; //4
JS允许数组包含任意混合类型的值
var misc = ['string', 99.9, true, false, null, undefined, ['nested', 'array'], { Object: true }, NaN, Infinity]
console.log(misc.length) //10
长度
JavaScript数组的length是没有上界的,如果你用大于或等于当前length的数组组为下标来保存一个元素,那么length将增大来容纳新元素,不会发生数组边界错误
length属性的值是这个数组的最大整数属性名加上1,它不一定等于数组里的属性的个数:
var myArray = [];
myArray.length; // 0
myArray[100000] = true;
myArray.length //100001
可以直接设置length的值,设置更大的length无须给数组分配更多的空间,而把length设小将导致所有下标大于等于新length的属性被删除
numbers.length = 3
// numbers 是['zero','one','two']
用push方法可以更方便地完成同样地事情
numbers.push('go')
// numbers 是 ['zero','one','two','go']
删除
由于JavaScript 的数组其实就是对象,所以 delete 运算符可以用来移除数组中的元素
delete numbers[2]
// numbers 是 ['zero','one',undefined,'go']
但是这样会在数组中滞留一个空间,这是因为排在被删除元素之后的元素保留了它们最初的名字(下标),而你通常想要的是递减后面每个元素的名字
JavaScript提供了一个 splice 方法,可以删除一些元素并将它们替换成其他的元素,第一个参数是数组的序号,第二个参数是要删除的元素个数,任何额外的参数会在序号那个点的位置被插入到数组中
numbers.splice(2,1)
// numbers 是 ['zero','one','go']
值为 'go' 的属性的键值从 '3' 变到 '2'
枚举
for 语句可以用来遍历一个数组的所有属性
var i
for(i=0;i < myArray.length; i++){
console.log(myArray[i]);
}
方法
JavaScript提供了一套作用于数组的方法,这些方法是被存储在 Array.prototype 中的函数
我们给 array 增加一个方法,它将允许我们堆数组进行计算
Array.method('reduce', function(f, value) {
var i;
for (i = 0; i < this.length; i++) {
value = f(this[i], value);
}
return value;
})
通过给 Array.prototype 扩充了一个函数,每个数组都继承了这个方法,我们定义了一个 reduce 方法,它接受一个函数和一个初始值作为参数,它遍历这个数组,以当前元素和该初始值为参数调用这个函数,并且计算出一个新值,当完成时,它返回这个值,如果我们传入一个将两个数字相加的函数,它会计算相加的和,如果我们传入将两个数字相乘的函数,他会计算其乘积
var data = [4, 8, 15, 16, 23, 42]
var add = function(a, b) {
return a + b;
}
var mult = function(a, b) {
return a * b;
}
//调用 data 的reduce 方法,传入 add 函数
var sum = data.reduce(add, 0) // sum = 108
//调用 data 的reduce 方法,传入 mult 函数
var product = data.reduce(mult, 1) // product = 7418880
因为数组也是对象,所以我们可以直接给一个单独的数组添加方法
// 给data 数组添加一个 total 方法
data.total = function(){
return this.reduce(add,0);
};
total = data.total(); // total = 108
维度
JavaScript的数组通常不会初始化,如果你用 [ ] 得到一个新数组,它将是空的,如果你访问一个不存在的元素,则将得到的值是 undefined ,如果你实现的算法是假设每个元素都从一个已知的值开始,那么你必须自己准备好这个数组,JavaScript应该提供一些类似于 Array.dim 这样的方法来做这个事情,但我们很容易纠正这个疏忽
Array.dim = function(dimension, initial) {
var a = [],
i;
for (i = 0; i < dimension; i++) {
a[i] = initial;
}
return a;
}
//创建一个包含 10 个 0 的数组
var myArray = Array.dim(10, 0)
JavaScript没有多维数组,但就像大多数类C语言一样,它支持元素为数组的数组
var matrix = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
];
matrix[2][1] // 7
一个空矩阵的每个单元将拥有一个初始值 undefined ,如果你希望它们有不同的初始值,你必须明确地设置它们,同样,JavaScript应该对矩阵提供更好的支持,好在我们也可以修正它
Array.matrix = function(m, n, initial) {
var a, i, j, mat = [];
for (i = 0; i < m; i++) {
a = [];
for (j = 0; j < n; j++) {
a[j] = 0;
}
mat[i] = a;
}
return mat;
}
//构造一个用 0 填充的 4*4 矩阵
var myMatrix = Array.matrix(4, 4, 0);
console.log(myMatrix[3][3]) //0
接下来构造一个恒等矩阵的方法
Array.identity = function(n) {
var i, mat = Array.matrix(n, n, 0);
for (i = 0; i < n; i++) {
mat[i][i] = 1;
}
return mat;
}
myMatrix = Array.identity(4);
console.log(myMatrix[3][3]) //1