• 数组


    ***数组

    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)表示要放入对象中保存的数据

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

  • 相关阅读:
    双向链表

    一个简单makefile
    内存管理
    队列
    postgresql表结构查询sql
    postgresql 命令
    NSMutableDictionary 中使用setValueForKey 和 setObjectForKey有什么区别?
    ViewController 生命周期
    程序启动过程
  • 原文地址:https://www.cnblogs.com/baiyanfeng/p/5042806.html
Copyright © 2020-2023  润新知