js数组

作者: 青春前行 | 来源:发表于2017-08-29 23:30 被阅读0次

    1、数组的定义
    var arr=[];
    var arr=[
    {a:1,b:2},
    [1,2,3],
    function(){retrun true;}
    ];
    上面的分别定义的数组的3个成员一次是数组对象、数组、函数
    var arr=[[1,2],[3,4]];//多维数组
    2、数组的本质:
    数组的本质属于一种特殊的对象。
    typeof [1,2,3] //object
    数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2…)。
    var arr = ['a', 'b', 'c'];
    Object.keys(arr)
    // ["0", "1", "2"]
    Object.keys()方法返回的是数组的所有键名。
    JavaScript语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。
    var arr = ['a', 'b', 'c'];

    arr['0'] // 'a'
    arr[0] // 'a'
    上面代码分别用数值和字符串作为键名,结果都能读取数组。原因是数值键名被自动转为了字符串。
    3、length属性【可读可写】:
    JavaScript使用一个32位整数,保存数组的元素个数。这意味着,数组成员最多只有4294967295个(232 - 1)个,也就是说length属性的最大值就是4294967295。
    4、类似数组的对象:
    var obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3
    };

    obj[0] // 'a'
    obj[2] // 'c'
    obj.length // 3
    obj[3]='d';
    obj.length;//3
    obj.push('d') // TypeError: obj.push is not a function
    这里添加d,但是length没变,说明不是数组。
    典型的类似数组的对象是函数的arguments对象,以及大多数DOM元素集,还有字符串。
    function args() { return arguments }
    var arrayLike = args('a', 'b');

    arrayLike[0] // 'a'
    arrayLike.length // 2
    arrayLike instanceof Array // false

    // DOM元素集
    var elts = document.getElementsByTagName('h3');
    elts.length // 3
    elts instanceof Array // false

    // 字符串
    'abc'[1] // 'b'
    'abc'.length // 3
    'abc' instanceof Array // false
    数组的slice方法将类似数组的对象,变成真正的数组。

    var arr = Array.prototype.slice.call(arrayLike);
    遍历类似数组的对象,可以采用for循环,也可以采用数组的forEach方法。

    // 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
    上面代码表明,数组存在键名为2的键。由于键名都是字符串,所以数值2会自动转成字符串。

    注意,如果数组的某个位置是空位,in运算符返回false。

    var arr = [];
    arr[100] = 'a';

    100 in arr // true
    1 in arr // false
    上面代码中,数组arr只有一个成员arr[100],其他位置的键名都会返回false。
    for…in 循环和数组的遍历
    for...in循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。

    var a = [1, 2, 3];

    for (var i in a) {
    console.log(a[i]);
    }
    // 1
    // 2
    // 3
    但是,for...in不仅会遍历数组所有的数字键,还会遍历非数字键。

    var a = [1, 2, 3];
    a.foo = true;

    for (var key in a) {
    console.log(key);
    }
    // 0
    // 1
    // 2
    // foo
    上面代码在遍历数组时,也遍历到了非整数键foo。所以,不推荐使用for...in遍历数组。

    数组的遍历可以考虑使用for循环或while循环。

    var a = [1, 2, 3];

    // for循环
    for(var i = 0; i < a.length; i++) {
    console.log(a[i]);
    }

    // while循环
    var i = 0;
    while (i < a.length) {
    console.log(a[i]);
    i++;
    }

    var l = a.length;
    while (l--) {
    console.log(a[l]);
    }
    上面代码是三种遍历数组的写法。最后一种写法是逆向遍历,即从最后一个元素向第一个元素遍历。

    数组的forEach方法,也可以用来遍历数组,详见《标准库》一章的Array对象部分。

    var colors = ['red', 'green', 'blue'];
    colors.forEach(function (color) {
    console.log(color);
    });
    7、数组的空位
    当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。

    var a = [1, , 1];
    a.length // 3
    上面代码表明,数组的空位不影响length属性。

    需要注意的是,如果最后一个元素后面有逗号,并不会产生空位。也就是说,有没有这个逗号,结果都是一样的。

    var a = [1, 2, 3,];

    a.length // 3
    a // [1, 2, 3]
    上面代码中,数组最后一个成员后面有一个逗号,这不影响length属性的值,与没有这个逗号时效果一样。

    数组的空位是可以读取的,返回undefined。

    var a = [, , ,];
    a[1] // undefined
    使用delete命令删除一个数组成员,会形成空位,并且不会影响length属性。

    var a = [1, 2, 3];
    delete a[1];

    a[1] // undefined
    a.length // 3
    上面代码用delete命令删除了数组的第二个元素,这个位置就形成了空位,但是对length属性没有影响。也就是说,length属性不过滤空位。所以,使用length属性进行数组遍历,一定要非常小心。

    数组的某个位置是空位,与某个位置是undefined,是不一样的。如果是空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。

    var a = [, , ,];

    a.forEach(function (x, i) {
    console.log(i + '. ' + x);
    })
    // 不产生任何输出

    for (var i in a) {
    console.log(i);
    }
    // 不产生任何输出

    Object.keys(a)
    // []
    如果某个位置是undefined,遍历的时候就不会被跳过。

    var a = [undefined, undefined, undefined];

    a.forEach(function (x, i) {
    console.log(i + '. ' + x);
    });
    // 0. undefined
    // 1. undefined
    // 2. undefined

    for (var i in a) {
    console.log(i);
    }
    // 0
    // 1
    // 2

    Object.keys(a)
    // ['0', '1', '2']
    这就是说,空位就是数组没有这个元素,所以不会被遍历到,而undefined则表示数组有这个元素,值是undefined,所以遍历不会跳过。

    相关文章

      网友评论

          本文标题:js数组

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