《JavaScript语言精粹》第六章

112 阅读2分钟

数组

数组字面量

```
var number = [    '1','2','3','4','5']
var nmberObj = {
    'one':'1',
    'two':'2',
    'three':'3',
    'four':'4',
    'five':'5'
};
```
  • number有length属性,numberObj没有
  • JavaScript允许数组包含任意混合类型的值
    var m =[
        'string',98.2,true,null,undefined,['nested','array'],{object:true},NaN,Infinity
    ];
    

长度

  • Javascript数组的length没有上界。

    用大于或等于length的数字作为下标保存的一个元素,会增大length,并且不会报错。

    var myarr = [];
    myarr[100] = true;
    myarr.length;  //1001
    //只包含一个属性
    

删除

  • JavaScript的数组是对象,所以可以用delete移除数组元素
    delete number[2];
    

    于是--->["1", "2", empty, "4", "5"]留下了个undefined

  • 而splice(a,b)方法可以删除元素并且替换,a数组中的序号,b是删除元素的个数

    效率不高

枚举

  • for in无法保证属性的顺序,可能从原型链中得到意外属性的问题
  • for语句就避免了这些问题,和C语言一样的用法

混淆的地方

  • 对象与数组的选择:当属性名是小而连续的整数时,应该使用数组。否则,使用对象。JS本身对数组和对象的区别是混乱的。typeof运算符报告数组的类型是'object',这没有任何意义。

方法

  • Array.prototype:可以通过Array.prototype给数组扩充方法。

维度

  • JS数组通常不会预置值。如果你用[]得到一个新数组,它将是空的。如果你访问一个不存在的元素,得到的值则是undefined。JS应该提供为数组指定初始值的方法,但我们可以弥补这个疏忽:
    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);
    
  • 多维数组:JS没有多维数组,但就像大多数类C语言一样,它支持元素为数组的数组:
    var matrix = [[0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
    ];
    matrix[2][1]; //7
    //注意:Array.dim(n, [])在这里不能工作,如果使用它,每个元素都指向同一个数组的引用,后果不堪设想
    
  • 初始化多维数组:一个空的矩阵每个单元都会拥有一个初始值undefined。
    Array.matrix = function(m, n, initial){
        var a, i, j, mat=[];//由于JS变量作用域问题,将变量在函数体最前面声明。
        for(i=0; i<m; i++){
        a = [];
        for(j=0; j<n; j++){
            a[j] = initial;
        }
        mat[i] = a;
        }
        return mat;
    };
    //构造一个用0填充的4X4矩阵
    var myMatrix = Array.matrix(4, 4, 0);
    document.writeln(myMatrix[3][3]);   //0