1.数组字面量是由方括号包含的零个或多个用逗号隔开的值的表达式,通过属性’0‘可以获得属性
var empty = [];
var number = ["one", "tow", "three", "four"];
console.log(empty[1]); // undefined
console.log(number[1]); // tow
console.log(empty.length); // 0
console.log(number.length); // 4
对象字面量
var object_number = {
"0" : "one",
"1" : "two",
"2" : "three",
"3" : "four"
};
console.log(object_number.length); // undefined
number和object_number都是对象
number继承了Array.prototype并拥有许多方法
object_number继承了Object.prototype,没有length方法
JS允许数组包含任意混合的值
var misc = [100, "text", true, {}, [1, 2]];
console.log(misc.length); // 5
2.长度
每个数组都有length属性,表示数组的个数且没有上界
var myArray = [];
console.log(myArray.length); // 0
myArray[1000] = "hi";
console.log(myArray.length); // 1001
设置数组空间的大小,超过索引的值将被删除
number.length = 3;
console.log(number); // Array [ "one", "tow", "three" ]
向数组末尾添加数据
number[number.length] = "five";
number.push("six");
console.log(number); // Array [ "one", "tow", "three", "five", "six" ]
3.删除
由于JS中数组本来就是对象,且下标为对象的属性,因此我们可以用delete删除
delete number[number.length - 1];
console.log(number); // Array [ "one", "tow", "three", "five", <1 个空的
但是,你会发现数组的索引却没有变化
因此我们用另一种形式,splice方法
number.splice(number.length - 2, 2);
console.log(number); // Array [ "one", "tow", "three" ]
console.log(number.length); // 3
4.枚举
由于JS中的数组是对象,我们可以用for-in来实现枚举
但是for-in不能够按顺序列出数组数据,且可能产生不需要的原型属性
for(var a in number) {
console.log(a + "=" + number[a]);
}
幸运的是,我们可以用for循环来实现
for(var i = 0, len = number.length; i < len; i++) {
console.log(number[i]);
}
5.容易混淆的地方
有时我们会混淆数组和对象的使用
其实确定一个对象是数组很简单
当对象的属性名是小而连续的整数时,那么该对象就是数组,否则为对象
定义一个函数来判断一个变量是数组
var is_array = function (value) {
return value &&
typeof value === "object" &&
typeof value.length === "number" &&
typeof value.splice === "function" &&
!(value.propertyIsEnumerable('length'));
}
console.log(is_array([1,2])); // true
6.方法
我们为Array.prototype可以扩展方法,因此数组也可扩展方法
Function.prototype.method = function (name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
return this;
}
Array.method("reduce", function (func, value){
var i, len;
// this表示方法调用模式
// 代表调用该方法的数组对象
for (i = 0, len = this.length; i < len; i++) {
value = func(this[i], value);
}
return value;
});
var data = [1, 2, 3, 4, 5];
var add = function (a, b) {
return a + b;
}
var mult = function (a, b) {
return a * b;
}
console.log(data.reduce(add, 0)); // 15
console.log(data.reduce(mult, 1)); // 120
同时,我们也可以为数组添加方法,以证明数组就是对象
data.total = function () {
return this.reduce(add, 0);
}
console.log(data.total()); // 15
7.指定初始值
数组没有初始化,当我们调用一个为空的数组时,返回的是undefined
console.log([][0]); // undefined
因此我们需要定义一个dim方法,来初始化数组
Array.method("dim", function (len, init) {
var i, len;
this.length = len;
for(i = 0; i < this.length; i++) {
this[i] = init;
};
return this;
});
console.log([].dim(10, 0)); // Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
JS数组没有二维数组,需要我们创建
// m 表示二维数组的长度
// n 表示二维数组中的数组的长度
// return this : 返回二维数组本身
Array.method('matrix', function (m, n, init) {
var innerArr = [], i, j;
// 表示二维数组的长度
this.length = m;
for(i = 0; i < this.length; i++) {
// 表示二维数组中的数组的长度
innerArr.length = n;
for(j = 0; j < innerArr.length; j++) {
// 将二维数组中的数组初始化值
innerArr[j] = init;
}
// 将二维数组中的数组添加到二维数组中去
this[i] = innerArr;
}
return this;
});
// 构造一个4x4,初始化为10的二维数组
var myMat = [].matrix(4, 4, 10);
console.log(myMat); // Array [ Array[4], Array[4], Array[4], Array[4] ]
console.log(myMat[1][1]); // 10