JavaScript语言精粹之数组篇

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

你可能感兴趣的:(数组字面量,为数字添加方法,构造二维数组并初始化,数组的CRUD,数组与对象)