JavaScript令人焦灼的“数组”


0.前言

  最近看到有关数组方面的知识,我也真是醉了,特在此做一些总结,就当一个笔记,希望在往后的日子里,遇到相同的问题是能够及时解决。

  • 认识数组;
  • 创建数组;
  • 数组元素的访问(赋值与取值);
  • 数组的遍历;
  • 数组长度length、元素的更新、增加和删除;
  • 数组中常用的方法;
  • 数组排序;
  • 数组的数组(多维数组);

1.认识数组

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。

<strong>扩展:</strong>内置对象是JS语言自带对象,提供了一些基本的功能,供开发者来使用。浏览器上跑的内置对象Math,String,Array,Date等对象
对象:属性(变量)和方法(函数)的集合,数组就是对象,可以存储多个不同类型的数据

2.创建数组

  创建数组有常用的两种方法:
<strong>第一种方法:构造函数法</strong>
 1.1、使用构造函数创建空数组
var arr1(栈区) = new Array()(堆区)
注解:new的解释如下:

内存关系.png

(1)栈区:基本数据类型(变量)保存在栈区,会根据函数的结束而自动释放
(2)堆区:在堆区开辟出一片内存空间存放对象,需要程序员手动开辟,并且需要手动释放。
(3)返回堆区对象的引用(地址)
<strong>注意:</strong>arr1不是数组,是数组的引用,就是为了访问堆区的数组对象
1.2、使用构造函数创建确定容量的数组
var arr2 = new Array(10);
1.3、使用构造函数创建一个拥有一些数据的数组*
var arr3 = new Array(1,2,"Tome",true);
<strong>第二种方法:字面量法创建数组</strong>
2.1、使用字面量法创建空数组
var arr4 = [];
[]:表示数组。
2.2、使用字面量法创建一个拥有一些数据的数组
var arr5 = [1,2,3,4,"adh",true];
注:数据直接写在中括号里面,数据之间用逗号分开

3.数组元素的访问(赋值与取值)

数组的格式: 数组名[下标]
注意:下标是从“0”开始的,访问如下:

var arr = new Array(5);
        arr[0] = 18;
        arr[1] = 19;
        arr[2] = 20;
        arr[3] = 21;
        arr[4] = 22;
        console.log(arr);
        console.log(typeof arr);
        //取值(取某一个元素的值)
        console.log(typeof arr[0]);

4.数组的遍历

数组遍历的常用方法:
<strong>(1)for循环遍历</strong>

var arr = [1,2,3,4,5];
        var sum = 0;
        for (var i = 0; i < arr.length; i++) {
            var num = arr[i];
            sum += num;
            console.log(num);
        }
            console.log(sum);

<strong>(2)for-in 快速遍历</strong>

for(var j in arr){
     console.log(arr[j]);
}

注意:“in”的前面的“j”针对数组来说是我们的下标
(3)forEach();是MCMAScript5.0加入的,低版本IE不能用的。

arr.forEach(function(e){
            console.log(e);
        });

注意:e是数组里面的每一个元素。

5.数组长度length、元素的更新、增加和删除

什么是数组的长度?
  就是数组元素的个数。
用<strong>length</strong>表示数组的长度。

var arr = [1,2,3,4,5];
        arr["name"] = "sunck";
        console.log(arr.length);
        console.log(arr);

运行结果:

1.PNG

课件数组的长度还是为5,加了字符串元素,并没有将长度算进去,这是因为<strong>length不计算非正规(数字)下标</strong>。那么问题来了,在for-in里面length是否计算非数字的长度呢?

for (var i in arr) {
            console.log(i);
        }

1.PNG

综上所述:length在for-in中可以遍历


<strong>undefined的情况</strong>

arr.length = 10;
        console.log(arr.length);
        console.log(arr);
        console.log(arr[5]);
        console.log(arr[6]);
        console.log(arr[7]);
        console.log(arr[8]);
        console.log(arr[9]);

运行结果:

1.PNG

因为arr的原本数组长度为5,现在给他设置为10,但是剩余空出来的位置就会变成undefined。

<strong>数组长度的减少,多余的删除</strong>

arr.length = 3;
        console.log(arr.length);
        console.log(arr);

运行结果:

1.PNG

这是因为,本来给他设定的长度为10,现在又给他设置为3,就会装不下数据,所以多出来的数据就会删除掉。


<strong>添加的下表紧挨着以前最后的下标</strong>

arr[3] = 100;
        console.log(arr.length);
        console.log(arr);

运行的结果:

1.PNG

可以看到,所添加的元素,会紧跟着,最后一个正规数字元素的后面。


<strong>添加的下标距离最后的下标有一定的距离,那么中间的元素默认undefined</strong>

arr[6] = 600;
        console.log(arr.length);
        console.log(arr);
        console.log(arr[4]);
        console.log(arr[5]);

运行结果:

1.PNG

<strong>删除</strong>

delete arr[2];
        console.log(arr.length);
        console.log(arr);

运行结果:

1.PNG

注意:我们用delete操作符来删除指定的元素,数组的长度不会改变,只是对应的将值删除为undefined


6.数组中常用的方法

<strong>(1)push(item1,item2,...)</strong>
<strong>功能:</strong>在数组的末尾添加一个或者多个元素
<strong>参数:</strong>要添加的元素
<strong>返回值:</strong>添加数据后数组的长度

var arr1 = [1,2,3,4,5];
        var ret1 = arr1.push(9,10,23);
        console.log(arr1);
        console.log(arr1.length);
        console.log(ret1);

<strong>(2)unshift(item1,item2,...)</strong>
<strong>功能:</strong>在数组的头添加一个或者多个元素
<strong>参数:</strong>要添加的元素
<strong>返回值:</strong>添加数据后数组的长度

var arr2 = [1,2,3,4,5];
        var ret2 = arr2.unshift(0);
        console.log(arr2);
        console.log(arr2.length);
        console.log(ret2);

<strong>(3)pop()</strong>
<strong>功能:</strong>在数组的末尾删除一个元素
<strong>参数:</strong>无
<strong>返回值:</strong>被删除的元素

var arr3 = [1,2,3,4,9];
        var ret3 = arr3.pop();
        console.log(arr3);
        console.log(arr3.length);
        console.log(ret3);

<strong>(4)shift()</strong>
<strong>功能:</strong>在数组的头删除一个元素
<strong>参数:</strong>无
<strong>返回值:</strong>被删除的元素

var arr4 = [1,2,3,4,5];
        var ret4 = arr4.shift();
        console.log(arr4);
        console.log(arr4.length);
        console.log(ret4);

<strong>(5)join(str)</strong>
<strong>功能:</strong>将数组的元素用参数字符串拼接成一个新的字符串
<strong>参数:</strong>一个字符串
<strong>返回值:</strong>拼接的结果字符串

var arr5 = [1,2,3,4,5];
        var ret5 = arr5.join("good");
        console.log(arr5);
        console.log(arr5.length);
        console.log(ret5);
        console.log(typeof ret5);

<strong>(6)reverse()</strong>
<strong>功能:</strong>倒置数组
<strong>参数:</strong>无
<strong>返回值:</strong>倒置以后的数组

var arr6 = [1,2,3,4,5];
        var ret6 = arr6.reverse();
        console.log(arr6);
        console.log(arr6.length);
        console.log(ret6);
        console.log(typeof ret6);

<strong>(7)slice(startIndex,endIndex)</strong>
<strong>功能:</strong>在数组中从startIndex下标开始一直截取到endIndex下标之前
<strong>参数:</strong>开始与结束的下标
<strong>返回值:</strong>截取的数据数组

var arr7 = [1,2,3,4,5,6,7,8,9,10];
        var ret7 = arr7.slice(3,7);
        console.log(arr7);
        console.log(ret7);

<strong>(8)splice(下标,个数,item1,item2...)</strong>
<strong>功能:</strong>是在数组的中间添加或者删除一些元素
<strong>必选参数:</strong>下标、个数
<strong>可选参数:</strong>item1,item2...
<strong>返回值:</strong>
添加:个数为0,从下标处开始添加可选参数中的元素
注意:如果下标大于了原数组的最大的下标,都是在数组最后添加元素

var arr9 = [1,2,3,4,5];//1,2,8,9,3,4,5
        var ret9 = arr9.splice(7, 0, 8, 9);
        console.log(arr9);
        console.log(arr9.length);
        console.log(ret9);
        console.log(ret9.length);

删除:不需要可选参数,从下标开始删除对应个数个元素
返回值:删除的元素数组

var arr10 = [1,2,3,4,5,6,7,8,9,10];
        var ret10 = arr10.splice(2, 6);
        console.log(arr10);
        console.log(arr10.length);
        console.log(ret10);
        console.log(ret10.length);

<strong>(9)concat(arr1, arr2...)</strong>
<strong>功能:</strong>将多个数组拼接成一个数组
<strong>参数:</strong>一个或者多个数组
<strong>返回值:</strong>拼接之后新的数组,新的数组的元素是所有数组的元素

var arr8 = [1,2,3];
        var num8 = [4,5,6];
        var str8 = [7,8,9];
        var ret8 = num8.concat(arr8, str8);
        console.log(ret8);
        console.log(arr8);
        console.log(num8);
        console.log(str8);

<strong>(10)indexOf(item)</strong>
<strong>功能:</strong>从数组的左侧开始查找对应第一次出现的参数元素的下标
<strong>参数:</strong>元素值
<strong>返回值:</strong>如果找到了对应的元素则返回该元素的下标值,否则返回-1

var arr11 = [1,2,3,3,4,5,3,7,8];
        var ret11 = arr11.indexOf(9);
        console.log(ret11);
        console.log(arr11);

<strong>(11)lastIndexOf(item)</strong>
<strong>功能:</strong>从数组的右侧开始查找对应第一次出现的参数元素的下标
<strong>参数:</strong>元素值
<strong>返回值:</strong>如果找到了对应的元素则返回该元素的下标值,否则返回-1

var arr12 = [1,2,3,3,4,5,3,7,8];
        var ret12 = arr12.lastIndexOf(3);
        console.log(ret12);
        console.log(arr12);

7.数组排序

<strong>(1)冒泡排序</strong>
原理:

54321->45321->43521->43251->43215      4
                0 1    1 2    2 3    3 4
        43215->34215->32415->32145             3
                0 1    1 2    2 3    
        32145->23145->21345                    2
                0 1    1 2
        21345->12345                           1
                0 1
var arr = [4,5,3,1,2];

        //                   数组元素个数-1
        for (var i = 0; i < arr.length - 1; i++) {
            //                  数组元素个数-1-i
            for (var j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] <= arr[j + 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        console.log(arr);

<strong>(2)sort排序</strong>
注意:sort默认升序排序

var str = [4,5,3,1,2];
        str.sort();
        console.log(str);

如果要排降序,必须给出排序的标准,排序的标准是一个函数。

str.sort(compare);
        function compare(v1, v2) {
            if (v1 < v2) {
                return 1;
            }
            return -1;
        }
        console.log(str);

8.数组的数组(多维数组)

/**
         * 多维数组:数组的元素是数组
         */
        
        var a = [1,2,3];
        var b = [4,5,6];
        var c = [7,8,9];

        var arr = [a,b,c];

        console.log(arr);
        console.log(arr[1][2]);

9.总结

  数组的总结,就这么多了,如果有其他要补充的,欢迎来信。

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

推荐阅读更多精彩内容