zoukankan      html  css  js  c++  java
  • js 数组,集合对象

    shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined  var a = [1,2,3,4,5];  var b = a.shift(); //a:[2,3,4,5] b:1

    unshift:将参数添加到原数组开头,并返回数组的长度  var a = [1,2,3,4,5];  var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5] b:7  注:在IE6.0下测试返回值总为undefined,FF2.0下测试返回值为7,所以这个方法的返回值不可靠,需要用返回值时可用splice代替本方法来使用。

    pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined  var a = [1,2,3,4,5];  var b = a.pop(); //a:[1,2,3,4] b:5

    push:将参数添加到原数组末尾,并返回数组的长度  var a = [1,2,3,4,5];  var b = a.push(6,7); //a:[1,2,3,4,5,6,7] b:7

    concat:返回一个新数组,是将参数添加到原数组中构成的  var a = [1,2,3,4,5];  var b = a.concat(6,7); //a:[1,2,3,4,5] b:[1,2,3,4,5,6,7]

    splice(start,deleteCount,val1,val2,...):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,...  var a = [1,2,3,4,5];  var b = a.splice(2,2,7,8,9); //a:[1,2,7,8,9,5] b:[3,4]  var b = a.splice(0,1); //同shift  a.splice(0,0,-2,-1); var b = a.length; //同unshift  var b = a.splice(a.length-1,1); //同pop  a.splice(a.length,0,6,7); var b = a.length; //同push

    reverse:将数组反序  var a = [1,2,3,4,5];  var b = a.reverse(); //a:[5,4,3,2,1] b:[5,4,3,2,1]

    sort(orderfunction):按指定的参数对数组进行排序  var a = [1,2,3,4,5];  var b = a.sort(); //a:[1,2,3,4,5] b:[1,2,3,4,5]

    slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组  var a = [1,2,3,4,5];  var b = a.slice(2,5); //a:[1,2,3,4,5] b:[3,4,5]

    join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符  var a = [1,2,3,4,5];  var b = a.join("|"); //a:[1,2,3,4,5] b:"1|2|3|4|5"

     

    数组是JavaScript提供的一个内部对象,它是一个标准的集合,我们可以添加(push)、删除(shift)里面元素,我们还可以通过for循环遍历里面的元素,那么除了数组我们在JavaScript里还可以有别的集合吗?

      由于JavaScript的语言特性,我们可以向通用对象动态添加和删除属性。所以Object也可以看成是JS的一种特殊的集合。下面比较一下Array和Object的特性:

      Array:

    新建:var ary = new Array(); 或 var ary = [];  增加:ary.push(value);  删除:delete ary[n];  遍历:for ( var i=0 ; i < ary.length ; ++i ) ary[i];

      Object:

    新建:var obj = new Object(); 或 var obj = {};  增加:obj[key] = value; (key为string)  删除:delete obj[key];  遍历:for ( var key in obj ) obj[key];

      从上面的比较可以看出Object完全可以作为一个集合来使用,在使用Popup窗口创建无限级Web页菜单(3)中我介绍过Eric实现的那个__MenuCache__,它也就是一个模拟的集合对象。

      如果我们要在Array中检索出一个指定的值,我们需要遍历整个数组:

       代码:  var keyword = ;    for ( var i=0 ; i < ary.length ; ++i )    {    if ( ary[i] == keyword )    {    // todo    }    }

     

      而我们在Object中检索一个指定的key的条目,只需要是要使用:

       代码:  var key = '';    var value = obj[key];    // todo

     Object的这个特性可以用来高效的检索Unique的字符串集合,遍历Array的时间复杂度是O(n),而遍历Object的时间复杂度是O(1)。虽然对于10000次集合的for检索代价也就几十ms,可是如果是1000*1000次检索或更多,使用Object的优势一下就体现出来了。在此之前我做了一个mapping,把100个Unique的字符mapping到1000个字符串数组上,耗时25-30s!后来把for遍历改成了Object模拟的集合的成员引用,同样的数据量mapping,耗时仅1.7-2s!!!

      对于集合的遍历效率(从高到低):var value = obj[key]; > for ( ; ; ) > for ( in )。效率最差的就是for( in )了,如果集合过大,尽量不要使用for ( in )遍历。

     

    2:

    var mycars=new Array() mycars[0]="Saab" mycars[1]="Volvo" mycars[2]="BMW"
    这样的代码就是正确的, 可是 我想创建二维数组,为何 如下代码就不行? var mycars=new Array() mycars[0][0]="Saab" mycars[0][1]="Volvo" mycars[1][0]="Angel"
    JS里是没有二维数组的, 不过有个变向数组, 就是数组里在装个数组 var mycars=new Array() var mycars2=new Array() mycars[0]=mycars2
    3:

    【转】潜说js对象和数组

     
    转自:www.jimzhan.com 
    /*
       数组和对象 【JavaScript 权威指南 第五版】
    */
     
    /*
    对象: 是一个无序属性集合, 每个属性都有自己的名字和值 */
     
    /* 创建对象简单方法, 对象直接量 */
    var obj = {};
    var obj = {name: 'maxthon'};
    var obj = {name: {}, text: []};
     
    /* 可使用 new 操作符 */
    var a = new Array();
    var d = new Date();
    var r = new RegExp('javascript', 'i');
    var o = new Object(); // var o = {};
    /* 注: new 操作符后跟构造函数, 所以
        typeof Array;  // 'function'
        typeof Object; // 'function'
        Object 是 Function 的实例.
        Function 是特殊的对象, 也是 Object 的实例.
    */
     
    /* 对象属性 */
    // 使用 . 符合来存取属性的值.
    // 注:同时可使用 [], 里面使用属性名(可使用变量, 这点特别有用).
    var t = {};
    t.text = 'hello';
    t.o = {};
    t.o.name = 'rd';
    t.n = [];
     
    var t = {
        "text": "hello"
    };
    console.log(t.text); // 'hello';
    // 补充: 通常使用关键字 var 来声明变量, 但是声明对象属性时, 不能使用 var 声明
     
     
    /* 对象枚举 */
     
    var F = function () {};
    F.prototype.name = 'RD';
    var obj = new F;
    for (var key in obj) {
        console.log(key); // name;
    }
     
    // 仅枚举对象自身, 不沿原型链向上查
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            console.log(key); //
        }
    }
    /* 注: for in 不能枚举出预定义属性; toString. */
     
     
    /* 检查属性存在性 */
     
    window.a = 'rd';
    console.log(a in window); // true;
     
    var F = function () {};
    F.prototype.name = 'RD';
    var obj = new F;
    console.log('name' in obj); // true;
     
     
    var toString = Object.prototype.toString;
     
    // 如果对象 obj, 含有方法 getName, 则执行它;
    if (obj.getName && toString.call(obj.getName) === '[object Function]') ) {
        obj.getName();
    }
     
    // 补充:
    console.log(null == undefined); // true;
    console.log(null !== undefined); // true;
     
     
    /* 删除属性 */
    delete obj.name;
    // 补充: 使用 delete 操作符, 不能删除使用 var 声明的变量;
     
     
    /* 作为关联数组的对象 */
     
    // 取对象属性:
    obj.name;
    obj['name']; // 这里 name 为字符串.
     
    // 使用 [] 表示时, 属性名是用字符串来表示的. 那么可
    // 在运行过程中进行添加等操作
    // 注:当此属性是做为变量传递时, 特别有用.
    // 又称 关联数组
     
    /* 映射: JavaScript 对象把字符串(属性名) 映射成值. */
    for (var key in obj) {
        console.log(key); // key 属性名, 此处 做为值存在.
    }
     
     
     
    /*
        通用的 Object 属性和方法
     
        JavaScript 中所有对象都继承自 Object 类;
     
        1, constructor 属性.
        指向其构造函数.   
    */
    var F = function () {};
    var f = new F;
    console.log(f.constructor == F); // true
     
    // 构造函数的原型存在属性 constructor 指向自己;
    F.prototype.constructor == F;
     
    // 补充:
    var F = function () {};
    var G = function () {};
    G.prototype = new F;
     
    var g = new G;
    console.log(g.constructor == F); // true;
    console.log(g.constructor == G); // false;
    // 可使用 g instanceof F;
     
     
    /*
      2, toString() 方法
    */
    {'name': 'maxthon'}.toString(); // '[object Object]'
     
    /* 数组使用 toString 方法, 把会元素组成字符串, 其它对象会转化为 [object Object];
    函数使用原始 toString 方法, 会得到函数源码 */
    ['a', 'b', 1, false, ['e','f'], {}].toString();
    // "a,b,1,false,e,f,[object Object]"
     
    function t() {
        console.log('test');
    }
    t.toString();
    // 源码
     
    /*
        3, toLocalString();
            返回对象的一个本地化字符串
        4, valueOf();
            在转化为基本类型时, 会使用到. valueOf/toString.
        5, hasOwnProperty();
        6, propertyIsEnumberable();
            是否可枚举出来;
        7, isPrototyeOf();
            a.isPrototyeOf(b);
            如果 a 是 b 的原型, 则返回 true;
    */
    var o = {}; // new Object;
    Object.prototype.isPrototyeOf(o);    // true;
    Object.isPrototyeOf(o);              // false;
    o.isPrototyeOf(Object.prototype);    // false;
    Function.prototype.isPrototyeOf(Object); // true;
     
    /* 【闭包是存在函数实例, 垃圾没有回收是存在赋值引用】 */
     
     
     
    /*
        数组: 有序的、值的集合;
         
        每个值, 也叫元素, 对应一个下标;
        下标是从 0 开始;
        数组中值, 可以为任何类型. 数组, 对象, null, undefined.
    */
     
    // 创建.
    var arr = [];
    var arr = new Array();
     
    var t = '';
    var arr = [1,2,3, null, undefined, [], {}, t];
     
    /* 使用 new 操作符创建数组的3种情况: */
    var arr = new Array();       // [], 和直接量相同
     
    var arr = new Array(5);      //  长度为 5; []直接量是无法做到的.
    console.log(arr);            // []; JavaScript 引擎会无视 undefined;
     
    var arr = new Array('5');    // 值为 ['5'];
    var arr = new Array('test'); // 值为 ['test'];
     
    /* 相关实例 */
    var s = [1, 2, 3];
    s[5] = 'a';
    console.log(s);
    [1, 2, 3, undefined, undefined, 'a']
     
     
     
    /* 数组的读和写 */
     
    value = array[0];
    a[1] = 3.14;
    i = 2;
    a[i] = 3;
    a[a[i]] = a[0];
     
    // 数组 -> 对象 -> 属性
    array.test = 'rd';
     
    // 数组下标大于等于 0, 并且小于 2的32次方 减 1 的整数.
    // 其它值, JavaScript 会转化成字符串, 做为对象属性的名字, 不再是下标.
     
     
    var array = [];
    array[9] = 10; // array 长度会变成 10;
    // 注: JavaScript 解释器只给数组下标为 9 的元素分配内存, 其它下标无.
     
    var array = [];
    array.length = 10; // 添加 array 的长度;
    array[array.length] = 4;
     
     
    /* 删除数组元素 */
    // delete 运算符把一个数组元素设置为 undefined 值, 但是元素本身还是存在的.
    // 真正删除, 可以使用: Array.shift();【删除第一个】 Array.pop();【删除最后一个】 Array.splice();【从一个数组中删除一个连续范围】  或修正 Array.length 长度;
     
    /* 相关实例 */
    var a = [1, 2, 3];
    delete a[1];
    console.log(a); // [1, undefined, 3];
     
    /* 补充: JavaScript 权威指南 第五版 59页
    由 var 声明的变量是永久性的,  也就是说, 用 delete 运算符来删除这些变量将会引发错误.
    但: 在开发者工具里面, 是可以删除的. 而在网页中, 正如书上所写.
    */
     
     
    /* 数组长度 */
    [].length;
     
     
    /* 遍历数组 */
    var array = [1, 2, 3, 4, 5];
    for (var i = 0, l = array.length; i < l; i++) {
        console.log(array[i]);
    }
     
    array.forEach(function (item, index, arr) {
        console.log(item);
    });
     
    /* 截取或增长数组: 修正 length 长度, 前面已提过 */
     
    /* 多维数组 */
    [[1], [2]]
     
    /* 数组方法 */
    // join
    var array = [1, 2, 3, 4, 5];
    var str = array.join(); // 1,2,3,4,5
    var str = array.join('-'); // 1-2-3-4-5
    // 注: 此方法与 String.split() 方法相反;
     
    // reverse();
    var array = [1, 2, 3, 4, 5];
    array.reverse(); // [5, 4, 3, 2, 1]
    // 注:修改原数组;
     
    // sort();
    var array = [1, 3, 2, 4, 5, 3];
    array.sort();// [1, 2, 3, 3, 4, 5];
    /* 注: 数组中存在未定义元素, 把这些元素放到最后 */
     
    /* 同时可自定义排序, sort(func);
    func 接收两个参数,  如果第一个参数应该位于第二个参数之前, 那么比较函数将返回一个小于0的数, 相反, 返回大于0的数. 相等, 返回0;
    */
    array.sort(function (a, b) {
        return b - a;
    });
     
    // 实例: 按奇数到偶数, 并且从小到大排序
    [1, 2, 3, 4, 5, 6, 7, 2, 4, 5, 1].sort(function (a, b) {
        if (a % 2 && b % 2) {
            return a - b;
        }
         
        if (a % 2) {
            return -1;
        }
         
        if (b % 2) {
            return 1;
        }
     
        return a - b;
     
    });
     
     
    // concat() 方法. 合并数组, 但不深度合并
    var a = [1, 2, 3];
    a.concat(4, 5); // [1, 2, 3, 4, 5]
    a.concat([4, 5]); // [1, 2, 3, 4, 5]
    a.concat([4, 5], [8, 9]); // [1, 2, 3, 4, 5, 8, 9]
    a.concat([4, 5], [6, [10, 19]]); // [1, 2, 3, 4, 5, 6, [10, 19] ]
     
     
    // slice() 方法. 源数组不改变.
    var a = [1, 2, 3, 4, 5];
    a.slice(0, 3); // [1, 2, 3]
    a.slice(3); // [4, 5];
    a.slice(1, -1); // [2, 3, 4]
        a.slice(1, -1 + 5)
            a.slice(1, 4);
    a.slice(-3, -2); // [3]
        a.slice(-3 + 5, -2 + 5);
            a.slice(2, 3);
    /* 注:
        不包括第二个参数指定的元素.
        负值转化为: 负值 + 数组长度
    */
     
    // splice(pos[, len[, a, b]]) 方法. 删除指定位置开始后, 指定长度元素, 再缀加元素;
    // 返回删除元素组成的数组. 原数组改变.
    var a = [1, 2, 3, 4, 5, 6, 7, 8];
    a.splice(4); // [5, 6, 7, 8]; 此时 a: [1, 2, 3, 4]
    a.splice(1, 2); // [2, 3]; 此时 a: [1, 4];
    a.splice(1, 1); // [4]; 此时 a: [1];
     
    var a = [1, 2, 3, 4, 5];
    a.splice(2, 0, 'a', 'b'); // [1, 2, 'a', 'b', 3, 4, 5]
    a.splice(2, 2, [1, 2], 3); // ['a', 'b']; 此时 a: [1, 2, [1, 2], 3, 3, 4, 5]
    /* 注:
        第二个参数后的参数, 直接插入到处理数组中。
        第一个参数可为负数.
    */
     
     
    // push() 方法和pop() 方法.
    // push() 可以将一个或多个新元素附加到数组的尾部, 然后返回数组新长度;
    // pop() 删除数组中的最后一个元素, 减少数组的长度, 返回它删除的值.
    // 注:两个方法都在原数组上修改, 而非生成一个修改过的数组副本.
     
    var stack = [];
    stack.push(1, 2);   // stack: [1, 2];    return 2;
    stack.pop();        // stack: [1];       return 2; 删除的元素值
    stack.push(3);      // stack: [1, 3];    return 2;
    stack.pop();        // stack: [1];       return 3; 删除的元素值
    stack.push([4, 5]); // stack: [1, [4, 5]]returm 2;
    stack.pop();        // stack: [1];       return [4, 5]; 删除的元素值
     
    // unshift() 方法和 shift() 方法. 同上, 从数组头开始.
     
     
    // toString() 方法和 toLocalString()
    [1, 2, 4].toString(); // 1,2,3;
    ['a', 'b', 'c'].toString(); // 'a,b,c';
    // 和无参数的 join 方法相同.
     
     
    /* jsapi 新添方法:map, every, some, filter, forEach, indexOf, lastIndexOf, isArray */
     
     
    /* 类似数组的对象 */
     
    arguments
    document.getElementsByTagName();


  • 相关阅读:
    Mysql 主备原理
    Mysql-innodb日志写入时机
    Innodb 架构
    Reactor/Proactor
    select,poll,epoll,IO多路复用进化史
    从硬件+操作系统的角度解释为什么操作系统的IO单位是磁盘块
    Dubbo 核心功能在业务架构中的体现
    Mysql-Innodb 锁总结
    第一阶段冲刺三
    第一阶段冲刺二
  • 原文地址:https://www.cnblogs.com/wangfengderizi/p/2862378.html
Copyright © 2011-2022 走看看