数组

作者: 尘满面鬓微霜 | 来源:发表于2017-02-22 14:38 被阅读0次

    1.数组的定义

    任何类型的数据,都可以放入数组。如果数组的元素还是数组,就形成了多维数组。

    var arr = [
      {a: 1},
      [1, 2, 3],
      function() {return true;}
    ];
    
    arr[0] // Object {a: 1}
    arr[1] // [1, 2, 3]
    arr[2] // function (){return true;}
    
    var a = [[1, 2], [3, 4]];
    a[0][1] // 2
    a[1][1] // 4
    

    2. 数组的本质

    本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2…)。JavaScript语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。对象有两种读取成员的方法:“点”结构(object.key)和方括号结构(object[key])。但是,对于数值的键名,不能使用点结构。

    typeof [1, 2, 3] // "object"
    
    var arr = ['a', 'b', 'c'];
    
    arr['0'] // 'a'
    arr[0] // 'a'
    
    Object.keys(arr)
    // ["0", "1", "2"]
    
    var arr = [1, 2, 3];
    arr.0 // SyntaxError
    

    3.length属性

    只要是数组,就一定有length属性。该属性是一个动态的值,等于键名中的最大整数加上1。

    var arr = ['a', 'b'];
    arr.length // 2
    
    arr[9] = 'd';
    arr.length // 10
    

    当数组的length属性设为2(即最大的整数键只能是1)那么整数键2(值为c)就已经不在数组中了,被自动删除了。上面代码表示,当length属性设为大于数组个数时,读取新增的位置都会返回undefined。

    如果人为设置length为不合法的值,JavaScript会报错。

    var arr = [ 'a', 'b', 'c' ];
    arr.length // 3
    
    arr.length = 2;
    arr // ["a", "b"]
    
    var a = ['a'];
    
    a.length = 3;
    a[1] // undefined
    

    4.类数组对象

    它们看上去很像数组,可以使用length属性,但是它们并不是数组,所以无法使用一些数组的方法。类似数组的对象只有一个特征,就是具有length属性。

    //数组的slice方法将类似数组的对象,变成真正的数组。
    var arr = Array.prototype.slice.call(arrayLike);
    
    // for循环
    function logArgs() {
      for (var i = 0; i < arguments.length; i++) {
        console.log(i + '. ' + arguments[i]);
      }
    }
    
    // forEach方法
    function logArgs() {
      Array.prototype.forEach.call(arguments, function (elem, i) {
        console.log(i+'. '+elem);
      });
    
    //字符串也是类似数组的对象,所以也可以用Array.prototype.forEach.call遍历。
    Array.prototype.forEach.call('abc', function(chr) {
      console.log(chr);
    });
    // a
    // b
    // c
    }
    

    5.in 运算符

    检查某个键名是否存在的运算符in,适用于对象,也适用于数组

    var arr = [ 'a', 'b', 'c' ];
    2 in arr  // true
    '2' in arr // true
    4 in arr // false
    
    var arr = [];
    arr[100] = 'a';
    
    100 in arr // true
    1 in arr // false
    

    6.for…in 循环和数组的遍历

    for...in循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。但是,for...in不仅会遍历数组所有的数字键,还会遍历非数字键。

    var a = [1, 2, 3];
    a.foo = true;
    
    for (var key in a) {
     console.log(key);
    }
    // 0
    // 1
    // 2
    // foo
    

    7.数组的空位

    当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。数组的空位不影响length属性。使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。如果某个位置是undefined,遍历的时候就不会被跳过。```javascript
    var a = [1, 2, 3];
    delete a[1];

    a[1] // undefined
    a.length // 3

    相关文章

      网友评论

          本文标题:数组

          本文链接:https://www.haomeiwen.com/subject/dqcmwttx.html