002 Javascript(025 - 044)

[A] 认识函数

 1. 函数声明:

        function 函数名(形参1,形参2,......){
            函数体;
       return 表达式; }   

  【注】函数名最好要见名思意

  整个函数在运行时,遇到return会终止函数运行,跳出函数

 

  2. arguments讲解

    【注】每一个函数内都有一个arguments,这是系统内置的

       arguments是用来存储实际传入的参数

    属性:

      arguments.length  输出当前里面存储的参数的个数

                【注】下标从0开始

  

  3. 函数作用域

    任何程序在执行的是偶都要占用内存空间的,函数调用的时候也是要占用内存空间的

    函数调用时,系统会分配对应的空间给整个函数使用

    【注】在函数外声明的变量,为全局变量,作用域是全局

       在函数体内声明的变量,为局部变量,作用域为函数体内部

 

  4. 递归

      函数递归:在面试中,若面试官问及函数递归方面的知识,则对你的要求较高

        大部分公司会明文禁止使用递归的

 

    递归需满足以下三个特点:

        1. 函数自己调用自己

        2. 一般情况下是有参数的

        3. 一般情况下有 return

    【注】递归可以解决循环所能解决的所有的事

       递归都可以被写出来,但是不知道为什么是对的

    【注】递归会大量占用内存,尽量少用

 

[B] 认识数组

    数组:用一个变量存储一堆数据的数据结构

    数据类型:

        基本数据类型

        特殊数据类型

        复合 / 引用数据类型

    数组是符合 / 引用数据类型的一种

    1. 数组声明:

        a. 通过new创建数组  

             格式:var 数组名 = new Array(元素1,元素2,......)

              var a = new Array(1,"true","hello");

        b. 省略new创建数组

             格式:var 数组名 = Array(元素1,元素2,......)

                var a = Array(1,"true","hello");                

        c. 数组常量进行赋值(JS中一般用中括号[ ];)

             格式:var a = [元素1,元素2,......]

              var a = [1,"true","hello"];

   【注】前两种方法中,当元素只有一个且为数字(如10)时,它表示创建了一个长度为定值(如5)的空数组。

 

    2. 数组的属性

        数组.length    返回数组元素的个数

                 数组元素:将存储在数组中的内一个元素叫做数组元素

    3. 数组元素的访问

        数组[下标]    下标从0开始,如:a[2]

 

    4. 数组的遍历

        a.  for循环

            // 依次输出数组中的元素
         var a = [1,"true","hello",4,6,"29s"];     for(var k = 0; k < a.length; k++){      document.write(a[k],"<br>");     }

        b.  for...in   快速遍历 

            var a = [1,"true","hello",4,6,"29s"];
            for(var k in a){
                document.write(a[k],"<br>");
            }

 

[C] 数组的方法

   1. 栈结构:

       结构:从一头进,从同一头出

       特点:先进后出

    数组的两个方法形成栈结构:

       push()

         格式:  数组.push(参数1,参数2,.......);

         功能:  从数组尾部添加元素

         返回值: 添加完元素之后的数组长度,标量

       pop()

         格式:  数组.pop()  无参数

         功能:  去掉数组元素的最后一个元素

         返回值: 取下的这个元素

 

   2. 队列结构:

         结构:从尾部进,从头部出

         特点:先进先出

        

     数组的两个方法形成队列结构:  

       push()

         格式:  数组.push(参数1,参数2,.......);

         功能:  从数组尾部添加元素

         返回值: 添加完元素之后的数组长度,标量

       shift()

         格式:  数组.shift()  无参数

         功能:  从数组头部取下一个元素

         返回值: 取下的这个元素

       unshift()

         格式:  数组.unshift(参数1,参数2,......)

         功能:  从数组头部插入元素

         返回值: 插入元素后的数组

    3. 数组的其他方法

      concat()

        功能:合并数组

        语法: 数组.concat(数组1,数组2,.....)   

        返回值:合并后的新数组,原数组1,数组2不变

       【注】被合并的数组是被当成一个数组进行合并,即将数组中的每个元素分别拆出来再合并,而不是将这个数组当成一个元素连接到原数组中

     slice()

        功能:获取数组中指定区域 [ start, end) 的元素

        语法:数组.slice(start, end)  包含start,不包含end

        返回值:提取出的新数组,原数组不变

     splice()

        功能:获取数组中指定区域 [ start, end) 的元素

        语法:数组.splice(start, length, 数据1,数据2,.......)      

           start: 开始截取的位置

           length:截取元素的长度

           数据1,数据2,......:插入的数据

        【含义】在数组中的start位置起截取length个长度的元素,若后面还有数据1,数据2....等多个数据,则是将start开始的length个长度的元素,替换为数组1,数组2,......

        返回值:截取的数组,原数组不变

     join()

        功能:将字符串中的元素按照指定的连接符拼接起来

        语法:数组.join(连接符)

        返回值:返回拼接好的字符串

     reverse()

        功能:将数组元素进行逆序

        语法:数组.reverse()

        返回值:返回已经逆序的新数组,原数组已变为逆序后的数组

     sort()

        功能:将数组元素进行排序

        语法:数组.sort()

        返回值:已经排序好的新数组

        【注】该默认的排序是将数组元素看做字符串,然后进行比较的,古对于纯数字把数组的比较会出错

        解决办法:通过自定义函数来解决

        var a = [2,95,62,34,6,42,15,83];
        a.sort(function(value1, value2){
            return value1 - value2;  //若想从小到大排序,则为value2 - value1
        })
        var c = a.reverse();
        document.write(c);

 

[D] 数组的引用

    复合数据类型中,名与值的连接关系就是引用。即数据名中存储的是数据的引用

        var a = [2,5,7];
        var b = a;
        b = [7,4];
        document.write(a,"<br>")
        document.write(b);

    输出结果:

        2,5,7

        7,4

 [E] 声明提升和省略var

  1. 声明提升:所谓声明提升,是指在当前作用域,声明的变量和函数,会直接提升整个代码的最前面运行。

 

     JavaScript中,一段程序在分配内存的时候会一次性全部分配配好,这一过程在代码的预编译阶段完成。

     代码的预编译:在所有代码运行之前,计算机会将代码从头到尾看一遍

            将这个程序运行所需要的空间一次性分配好。

 

  2. 省略 var 声明变量

    在声明变量时的常规语法是: var 变量名 = 变量值;

    而当省略var声明变量时,变量会被系统强制认定为全局变量,不会报错

    【注】不建议这样写

 

[F] 二维数组

  数组存储数据是在同一个变量中存储多个元素,而这每些元素可以为任意的数据类型

  故二维数据实际上也是一种维位数组,只不过该数组中的每一个元素都是一个一维数组

  

[G] 冒泡排序

  规则:前后两个数,凉凉进行比较,若符合交换条件,则两个数交换位置,第一轮结束之后,第二轮从第二个数开始,以此类推

[H] 选择排序

  规则:从现有的数中选择出最小(或最大)的一个元素,放在第一位,再从剩下的数中选择出最小(或最大)的一个元素,放在第二位,以此类推。

[ I ] 数组练习

  1. 随机给出一个五位以内的数,然后输出这个数有多少位,每位是多少

  2. 编写一个函数has(arr, 60),判断数组中是否存在60这个元素,返回布尔值

  3. 条形码验证

 

[J] ECMAScrit5的严格模式

  在正常运行模式下,某些不规范的写法会被系统自动矫正。

  在ECMAScript5中增加了第二种运行模式:严格模式(Scrict mode),这就是让JavaScript在更严格的条件下运行。

  严格模式的目的:

    1. 消除JavaScript语法的一些不合理,不严谨之处,减少一些怪异行为;

    2. 消除代码运行的不安全之处,保证代码运行的安全性;

    3. 提高编译器效率,提高运行速度;

    4. 为未来新版本的JavaScript做好铺垫。

  【注】严格模式体现了JavaScript更合理,更安全,更严谨的发展方向,包括IE在内的主流浏览器,都已经支持它。

  

  【使用】:在所需要的进行严格模式的作用域下,单独一行书写:"use strict"

      【注】在当前作用域下,若使用了严格模式,则该作用域下运用的外部文件,也必须遵守严格模式,故尽量不要在全局使用严格模式

  【严格模式的严格之处】

      1. 变量使用前必须声明;

      2. 函数的形参名不能重复(非严格模式下,形参名可以重复,不会报错,只不过后面的同名形参会覆盖掉前面的)

      3. 非严格模式下,在函数内部修改形参值会同时改变arguments的值,反过来在函数内部修改arguments的值也会同时改变形参的值;

       而在严格模式下,函数内部形参值的修改不会改变arguments的值,反过来在函数内部修改arguments的值也不会同时改变形参的值;

      4. 新增了很多保留字

          implements,interface,let,package,private,protected,static,yield

 

[K] ECMA5 新增数组的方法

    1. indexOf()

        格式:数组.indexof(item, start); 

        参数:item  任意数据

           start  下标,可以不传入,默认为0

        功能:在数组中查找第一次 item 出现的下标,从 start 开始去查找

        返回值:-1  表示没查找到

            >=0 表示查找到的元素首次出现的下标

    2.  forEach 数组遍历

        forEach无返回值

        使用方法:

        // var arr = [10,20,30,40,50,60,70,80];
        // arr.forEach(function(item, index, arr) {
        //     item: 当前遍历到的元素
        //     index: 当前遍历到的元素的下标
        //     arr数组本身
        // });
        【注】若数组arr为二维数组,则只会将其认定为一位数组进行操作

    3. map()  映射

      功能:实现映射,根据一段固定的运算公式,把原来的数组的每一个元素根据这个运算公式进行映射,然后放在新数组的同一个位置,而原数组不变。

      返回值:映射后的新数组

      使用方法:

        var arr = [10,20,30,40,[2,5,8],50,60,70,80];
        var qw = arr.map(function(item, index, arr) {
            //     item: 当前遍历到的元素
            //     index: 当前遍历到的元素的下标
            //     arr数组本身
        
       // 遍历要做的事情,也就是映射关系 return item * 2; }); document.write(arr,"<br>"); document.write(qw);

      结果:
        

 

 

       【注】可看出,map方法只能处理一维数组

    4. filter()  过滤

        var arr = [10,20,30,40, 50,60,70,80];
        var qw = arr.map(function(item, index, arr) {
            //     item: 当前遍历到的元素
            //     index: 当前遍历到的元素的下标
            //     arr数组本身
        
       // 过滤的条件
            return item > 20;
        });
        document.write(arr,"<br>");
        document.write(qw);

      结果:

        

 

 

     5. some()  查找是否有符合条件的元素

          功能:查找数组中是否有符合条件的元素,若有,返回true,若无返回false

          【注】该方法存在短路操作,即只要查找到一个存在的元素,后面的元素将不再被查找

        var arr = [10,20,30,40, 50,60,70,80];
        var qw = arr.some(function(item, index, arr) {
            //     item: 当前遍历到的元素
            //     index: 当前遍历到的元素的下标
            //     arr数组本身
        
       // 过滤的条件
            return item > 20;
        });
        document.write(arr,"<br>");
        document.write(qw);

        结果:

          

 

 

     6.  every()  查找每一个

        功能:在数组中查找每一个元素是否符合条件,全部符合返回true,有一个不符合就返回false。

        【注】该方法存在短路操作,即只要发现有一个不符合条件,则后面的元素将不再被遍历。

        var arr = [10,20,30,40, 50,60,70,80];
        var qw = arr.every(function(item, index, arr) {
            //     item: 当前遍历到的元素
            //     index: 当前遍历到的元素的下标
            //     arr数组本身
        
       // 过滤的条件
            return item > 20;
        });
        document.write(arr,"<br>");
        document.write(qw);

        结果:

          

 

 

      7. reduce()  归并

newarr = arr.reduce(funcetion(pre, next, index, array){
   // pre:上一次return后面的值
   // next:从下表1开始,当前遍历到的元素
   // index:当前遍历到的下标;
   // arr:当前数组;
})
                       

 

posted @ 2020-06-04 17:54  CarreyB  阅读(325)  评论(0编辑  收藏  举报