数组

***数组

1. 程序=数据结构+算法

     算法:描述一个程序的执行步骤:分支结构,循环结构

     数据结构:好的数据结构可以极大提高程序执行效率

2. 数组:批量管理多个数据的存储结构

   为什么使用数组:多个数据分组,连续存储,

                   提高程序执行效率

   程序中的数组:多个连续的存储空间,起一个统一的变量名

   如何使用数组:

       创建数组:4种

        1. 创建数组同时,初始化数组内容:

       var week=['日','一','二','三','四','五','六'];

        2不限制:1. 不限制元素的数据类型

                 2. 不限制元素的个数

        2. 创建空数组:

        var arr=[];

        何时使用?暂时无法初始化数组内容

        3. 使用new关键字,创建指定元素个数的数组

        var arr=new Array(元素个数);

        比如:var arr=new Array(7);

              var arr=[ , , , , , , ]

        4. 使用new关键字,在创建同时初始化

        var arr=new Array(值1,值2,...)

        相当于 =[值1,值2,...]

        3和4容易产生歧义——了解

       修改数组中的数据:

           数组中的元素都是通过下标访问:数组变量[i]

           下标:在数组中顺序唯一标识每个元素的序号

       var week=['日','一','二','三','四','五','六'];

                  0    1    2    3    4    5    6

          *下标从0开始,到元素个数-1结束*

          var week=[];

          week[0]="日"; ["日"]

          week[1]="一"; ["日","一"]

          week[3]="三"; ["日","一",  ,"三",100]

                          0    1       3   100

         week[100]=100;

*数组是引用类型的对象*

    引用类型:数据不存在变量本地,变量中仅保存数据的地址

         也称:变量“引用”了地址所在的对象

    对象:程序中同时保存*多个*相关数据的数据结构,

         描述现实中一个具体东西。

null和undefined:

undefined:任何仅声明未赋值的变量的默认值——不主动使用

null:用于主动清空一个引用类型变量的值,释放对象

何时使用null:2种:

   1. 一个变量暂时未引用任何对象时,用null占位

   2. 一个变量引用的对象,不再使用时,将对象中的地址替换为null——释放对象

   释放对象:如果一个对象不再被任何变量引用,

      被垃圾回收!——垃圾回收器——伴随程序运行的小程序

    读取数组中的数据:数组中的每个元素用法和变量完全相同

              数组变量[i]

对象:数据,对数据的操作(功能 API)

数组对象的API:

    1. arr.length属性:数组中的元素个数!

      强调:length包含中间跳过的不存在的元素

    固定套路:

    arr[arr.length-1]: 访问最后一个元素

    arr[arr.length]=值: 向数组末尾追加一个新元素

    arr.length=3; 将数组截断,仅保留前3个元素

                  被截断的元素,仍然存在,无法回收

                  只能随数组对象一起回收

***数组 API

1. 遍历数组:

       从第一个元素开始,依次取出每个元素,执行相同操作

   三要素:1. 循环条件:下标位置<arr.length

           2. 循环变量:下标,从0开始,每次增1

           3. 循环体:对每个元素要执行的操作

   for(var i=0; i<arr.length ;i++){

       arr[i]——取每个元素

       执行相同的操作

   }

2. 索引数组:以自动的顺序的序号,作为下标的数组

     var arr=['日','一','二','三','四','五','六'];

               0    1    2    3    4    5    6

   关联数组:以自定义的字符串为下标

     何时使用关联数组:数组中如果每个元素都有特殊的意义

                 key     value

                 键        值

     var fbb={"属性名1":属性值1,

              "属性名2":属性值2,

              ... ...

     };

   关联数组 vs 索引数组

       1. 关联数组,没有length属性!

       2. 关联数组的下标是自定义的属性名,没规律

   专门遍历关联数组的固定套路:

   for(var key in arr){//依次取出arr中每个元素的属性名

                     临时保存在变量key中

       arr[key]——获得当前key中保存的value

   }

***冒泡排序:从小到大

     规则:

依次比较相邻两个元素,如果前数>后数,交换前后两数位置。

                     否则不变,继续比较后两个数

API:

  1. 将数组转为字符串:

    var str=arr.toString():

        输出数组中的每个元素的内容,以","分割

    var str=arr.join('分割符')

    输出数组中的每个元素的内容,以自定义的"分隔符"连接

    固定套路:

    将字母拼成单词:

    var chars=['H','e','l','l','o'];

    var word=chars.join(""); //Hello

    将单词组成句子:

    var words=['no','zuo','no','die'];

    var stmt=words.join(" "); //no zuo no die

   

    var word='H'+'e'+'l'+'l'+'o';

    vs

    var chars=['H','e','l','l','o'];

    var word=chars.join(""); //Hello

    总结:当发现大量字符串拼接或+=操作时,更好的做法是

          将所有子字符串,先装入一个数组,再用数组的join

   乘法口诀表数组版:

   for (var n=1; n<=9 ; n++){

       /*打印第n行——公式*/

   }

   /*打印第n行公式*/

   for(var i=1,str=[]; i<=n; i++){

       var r=i+"x"+n+"="+(i*n);

       str[str.length]=r;

        //["1x9=9" , "2x9=18" , "3x9=27" , ]

   }

   console.log(str.join(" , "));

   2. 连接和截取:

      连接:

      var newarr=arr.concat(值1,值2,.....)

                           (数组1,数组2,......)

                           (值1,数组,值2,)

         将参数中的数据,打散成每个元素,追加到arr末尾!

         不改变原对象,返回一个新对象。

      截取:

      var newarr=arr.slice(starti,endi+1);

         获取原数组中从starti位置开始,到endi位置的元素

         组成新数组,返回。

      ***js中:含头不含尾***

         比如:获取第2个元素到第6个元素的子数组

                     1         5+1

   3. 删除,插入,替换:splice

         删除:arr.splice(开始下标,删除个数)

         插入:arr.splice(开始下标,0,新值1,新值2...)

           原位置及之后的内容,被先后顺移

         替换:

         arr.splice(开始下标,删除个数,新值1,新值2...)

           删除个数和补充个数,可以不一样!

   4. 颠倒数组中的元素顺序:arr.reverse();

1. 数组自定义排序: arr.sort();

       特点:1. 默认升序排列;

             2. 默认将所有元素转为字符串,再排列

   ***自定义排序:2步:

      1. 先定义比较器函数:专门比较任意两数大小的函数

               特点:1. 两个参数:a, b

                     2. 通过返回值的正负,决定两数大小

                       比如:a-b>0  说明a>b

                            a-b<0  说明a<b

                            a-b=0  说明a=b

         function compare(a,b){

             return a-b;

         }

         compare(3,5); <0 3<5

         compare(8,6); >0 8>6

      2. 将比较器函数对象,作为参数传递给sort方法:

         arr.sort(比较器函数名);

***一切皆对象:

//function compare(a,b){return a-b;}

/*js中"Everything is Object"*/

var compare=function(a,b){return a-b;};

/*1. 函数体本身也是一个对象!

  2. 函数名其实是一个引用函数对象的普通变量*/

何时使用(): 1. 当方法作为对象传递时,不加()

            2. 当调用方法执行时,加()

function声明方式创建的函数:在预读阶段被提前

vs

var 函数名=函数直接量:在预读阶段,*不提前*!

2. js中的栈和队列:本质就是普通数组

       栈:一段封闭,仅从另一端出入的序列

           FILO

       从数组末尾出入栈:

       入栈/压栈:arr.push(值1,值2...)

       出栈/弹栈:var elem=arr.pop();

       从数组头出入栈:

       入栈:arr.unshift(值1,值2...)

       出栈:var elem=arr.shift();

       队列:只能从一端进入,只能从另一端出

           FIFO

       何时用队列:顺序取出数组中的元素,做处理时

        (从尾)入队列:arr.push(值);

        (从头)出队列:var n=arr.shift();

1. 二维数组:数组中的元素,又引用了另一个子数组对象

   何时使用二维数组:2种:1. 要存储的数据有行,列结构特点

                         2. 数据存在上下级的包含关系

   创建二维数组:2种:

     //创建同时初始化

     var data=[

       [2 ,4 ,8,16],

        [0 ,4 ,2,0],

        [16,8 ,8,0],

        [4 ,16,0,8]

     ]; length=4

     //先创建空数组,再追加每个元素的子数组

     var data=[];

     data[0]=[2 ,4 ,8 ,16];

     data[1]=[4 ,4 ,2 , 4];

     data[2]=[16,8 ,8 , 8];

     data[3]=[4 ,16,32, 8];

   如何访问二维数组中的每个元素:

     data[父数组下标][子数组下标]

              行          列

   遍历二维数组:

   //外层循环遍历每一行

   for(var row=0;row<data.length;row++){

        //内层循环遍历行中的每个格

   for(var col=0;col<data[row].length;col++){

           data[row][col]——当前正在遍历的单元格

       }

   }

2. ***String:由多个字符组成一个字符序列(数组)

      *字符串一旦创建,内容不可改变!*

      字符串其实就是一串内容不可改变的字符数组

内置对象:ECMA标准中规定好的,由浏览器厂商已经实现的对象

          程序员不必关心内部实现机制,直接调用即可

11个:

String Number Boolean ——包装类型

Array  Date   Math    RegExp

Error(TypeError;ReferenceError...)

Function    Object

全局对象Global | Window

包装类型:专门封装原始类型数据,并提供对数据常用操作

为什么会有包装类型:原始类型不能调用函数!

            必须先用包装类型,包装成对象,再调用函数

包装类型的生命周期:

    当使用原始类型调用函数时,自动创建包装类型对象

    比如:var n=123.456;

          console.log(n.toFixed(2));

          //自动翻译成:

          console.log(new Number(n).toFixed(2));

          其中:new 表示创建一个对象

                Number表示要创建对象的类型

                (n)表示要放入对象中保存的数据

    当函数调用结束,包装类型对象,自动释放!

原文地址:https://www.cnblogs.com/baiyanfeng/p/5042806.html