数组

数组的长度可变,元素类型可变。数组本身依旧是 Object 类型,对一个数组变量进行 typeof ,得到的字符串是 object。

定义

new Array 形式

有如下三种定义方式:

var a1 = new Array()
var a2 = new Array(3);
var a3 = new Array('fd',
                    function (arg) {
                        return 'run is array'
                    },
                    3,
                    { name:'array element' }
                ); // 元素类型各不相同
alert(a1);
alert(a2); // 会输出两个逗号,表示一共有三个元素——各个元素通过逗号分隔
alert(a3);
  1. 虽然在第二种定义方式中指定了数组长度是 3 ,但数组的长度依旧可变。

    var a = new Array(3);
    a[4]=function (arg) {
        return "run is a4";
    }// 虽然数组在定义时指定了长度为 3 ,但这里依旧操作了下标为 4 的元素
    alert(a[4]());
    
  2. 第三种方式不但创建了一个数组,而且向数组中存储了 4 个元素。

[] 形式

如下:

var a = []; // 创建一个空数组
a[1] = {}; // 通过下标形式为元素指定值
alert(a);

var a2 = ['name',10] // 创建一个数组,同时指定两个元素值 
alert(a2);

length 属性

获取数组的长度。数组本身也是一个对象,所以对对象的任何操作方法都可以用于数组。由于 length 是数组中的一个属性,所以length 也可被赋值

var a2 = ['name',10] 
var a2 = ['name',10] 
alert(a2.length);
a2[10] = 10;
alert(a2.length); // 11,因为上句为下标为 10 的元素赋值

var a3 =[];
a3.length = 20; // 为数组的 length 属性强制赋值。
alert(a3);

常用方法

push pop

使数组具备栈的功能。push 将元素添加到数组的末尾,pop 弹出末尾元素。push 返回修改后的数组长度,pop 返回末尾元素。

shift 与 unshift

  1. shift:移除数组中第一个元素,返回的是移除的元素值。与 push 结合,可以使数组具备队列功能
    2.unshift:向数组的最前端添加一个元素,返回的是修改后数组的长度。

排序

  1. reverse() :将原数组逆序。

  2. sort(function):根据指定的方法对数组中的元素进行排序。该方法结束后,原数组会变化。

连接与截取

  1. concat():返回一个新数组,该数组中的元素为与 push 时一样。如果不传参数,相当于对原数组进行复制

  2. join:以参数为连接符,连接数组中各个元素,该方法并不会影响数组本身。默认是逗号。

    var o = ['a','b'];
    alert(o); // a,b
    alert(o.join('-')); // a-b
    alert(o); ////输出的依旧 a,b
    
  3. slice() : 截取数组的子串,并形成一个新数组返回。如果指定了两个参数,则含头不含尾。

    var o = [];
    for(x = 0;x<10;x++){
        o[x] = x;
    }
    alert(o.slice(2,5)); //2,3,4。参数中的2,5指的是截取原数组的起始、结束的下标。
    alert(o); // 0 到 9
    
  4. splice() :替换数组中指定位置的元素。根据参数的不同,它敢具备删除、添加功能。

    var o = [1,2,3,4,5];
    
    o.splice(2,1,'aa');  // 第二个参数指的是要操作的元素的长度,它不是结束下标。
    alert(o);// 1,2,aa,4,5
    

    上述代码,会从下标为 2 的元素开始(含),取出长度为 1 的元素,将这些元素替换 成 aa 。

    因此,如果第二个参数为 0,就相当于向原数组中插入第三个元素;如果没有第三个元素,就相当于从原数组中删除前两个元素指定的块。

    var o = [1,2,3,4,5];
    o.splice(2,1); // 相当于删除了从下标 2 开始,长度为 1 的一块元素
    alert(o);//1,2,4,5
    
    o = [1,2,3,4,5];
    o.splice(2,0,'a','b'); // 相当于从下标 2 开始,今次插入后面的元素。
    alert(o);//1,2,a,b,3,4,5
    

元素操作

  1. every():对数组中的每一个元素进行指定的函数操作。如果每一个元素都返回true,那么every方法返回true;否则返回false。

  2. some():类似于every(),但只要有一个元素返回true,该方法就会返回true,否则返回false。

  3. filter():过滤。遍历数组,对每一个元素执行指定的方法,并将函数返回为true的元素保留到新数组中,最后将新数组返回。

  4. forEach():遍历。遍历数组,并对每一元素执行指定方法。无返回值,且不操作数组本身。

  5. map():映射。遍历数组,并对每一个元素执行指定的方法,将方法返回值存储到新数组中,并且将新数组返回。

    window.onload=function(){
        var a =[4,5,66];  
        var result = a.map(function(value,index,array){  
            return value * 2;  
        });  
        alert(result);
    }
    

    map的参数便是指定的方法,它的参数是固定的。第一个指当前元素,第二个指元素的下标,第三个指元素所在的数组。

  6. reduce()与reduceRight():遍历数组,只不过后面一个是从右往左遍历。其返回值为最后一个元素时方法的返回值。如:

    window.onload=function(){
        var a =[4,5,66];  
        var result = a.reduce(function(pre,cur,index,array){  
            log(pre+","+cur)
            return pre*2+cur;  
        });  
        alert(result);//result = 92
    
        result = a.reduceRight(function(pre,cur,index,array){  
            log(pre+","+cur)
            return pre*2+cur;  
        });  
        alert(result);//result = 278
    }
    

    reduce()参数的格式固定。第一个参数为当前元素的上一次方法的返回值,第二个参数为当前元素,第三个为下标,第四个为数组。

    • reduce(),第一次调用函数中 pre 为第一上元素。
    • reduceRight(),第一次调用函数时,pre 为最后一次元素。

补充

Array 也属于 Object

因为 Array 也是 Object,所以下面的赋值方法也是可以的:

var a =[];
a['name']='name';
a['age']=18;
alert(a['name']+"----"+a[0]);// 最后输出的是 undefined

因为数组本身也是对象,所以第二、三句赋值时,将变量 a 按照对象进行处理,即:为变量 a 定义 name 与 age 两个属性,并分别赋值为 name 与 18。此时并没有为数组 a 定义元素,所以 a[0] 输出 undefined。

如果添加上下述代码:

a[0] = 'array';
alert(a['name']+"----"+a[0]);// 分别输出 name 与 array
alert(a.length); // 1

第一句中为 a 定义了一个元素,这并不影响 a 作为一个对象中已具有的属性(即 name 与 age)。所以输出时,分别输出了 name 与 array 两个值。

数组的属性并不算作 length,所以通过 length 输出时,结果依旧是 1。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容