学习js的课堂笔记(二)----函数、数组

函数

1)函数的创建

a. 函数声明

  function 函数名(形参列表){
        //函数体
  }

例:
  function sayHello(name){
      console.log('hello',name);
  }

重点:函数整体提升为函数声明,函数的调用可以在函数声明前。
(//解析器先读取函数声明再加载数据)

b. 函数表达式
(//将一个匿名函数赋值给一个函数变量,匿名函数是没有函数名的函数)

  var 函数名=function 函数名(形参列表){
          //函数体
  }

例:
  var sayHello=function(name){
     console.log('hello',name);
  }

重点:变量名提升为undefined,函数表达式之前函数名为undefined。

2)函数调用(4种方法)

a.函数名(实参列表);  //sayHello('terry');
b.函数名.call(执行环境对象,实参列表);
c.函数名.apply(执行环境对象,实参列表数组);
d.new sayHello()  //一般用于构造函数   
   sayHello
     属性 name
     方法 sayHello.call() //让sayHello去执行
          sayHello.call(this,params1,params2,...) //调用当前方法
          sayHello.apply(this,params)  //params为(类)数组对象

3)函数的内部参数(//只有在函数内部才能访问的参数)
只有在函数运行的过程中才能被确定值的参数

 a.形式参数

 b.arguments 实参所在,类数组对象(索引、长度length)
   length  获取arguments中元素的个数
   arguments[0]  //通过索引访问
   arguments[1]
   callee  指向当前函数名

 c.this   当前的执行对象(环境对象)
     function test(a,b){
            arguments
            return a+b;
        }   

        test(1,2,3,4,5);

        var sayHello = function(){
            console.log('hello');
        }

        (function(){
            console.log('hello');
        })();

   this取值与函数的调用方式有关

///////////////////////////////////////////
重点: obj.sayHello(); //this指向obj
sayHello(); //this指向node
(function(){})() //this指向node,全局环境对象global/window

4)函数的应用
(//函数本质上是一种对象,可以将其当做普通对象来使用)

var a = function(){
     console.log("hello");
 }

a为变量,指向函数,函数是特殊的对象,a保存的是指向函数的指针。
a可以作为值,参数,返回值。

1.函数式编程(lamla表达式,回调函数)
  将函数作为参数进行传递
  (//函数名本身就是变量,所以函数可以当做值来使用)
function dealData(handler){
  var data={
     name:'terry',
     age:12
  }
  //处理data的代码
  handler(data);
}

dealData(function(data){
     console.log(data.name);
});

2.函数作为返回值()
 function foo(){
     return function(){
          return 1;
     }
 }
 var bar=foo();   
 //返回function(){
          return 1;
     }

var bar=foo()();
//返回1   
//函数必须调用才会执行。

数组
1.数组的定义
数组是有序列表,是存放多个值的集合。
特性:值可以为任意数据类型
var arr=[1,true,’hello’,null,undefined,{},[],function(){}];
数组长度可以动态变化。两大要素:length,元素。
length属性可读可写。
2.数组的创建
1)使用构造函数创建数组
var arr=new Arry(3);
a.单个值(3),数组长度为3
b.单个/多个字符/多个数值,初始化数组的元素
2)使用数组字面量创建数组
var arr=[‘terry’,’larry’]
3.数组的访问
a.访问数组的长度:arr.length
b.访问数组中的元素:arr[索引]
如果索引超过了数组的长度,那么这个值undefined
4.数组的应用
班级名称 string
班级人数 number
某个同学的信息 Object
全班同学的信息 Array

   **数组反转
   数组排序:
       **选择排序
         var arr=[5,3,1,2,4];

       插入排序
       希尔排序
       快速排序

5.数组方法
var obj=new Object();
Object 【构造函数,圆形(方法)】
obj 可以调用原型中的方法

   var arr = new Arry();
   var arr=[];
   arr 可以调用Array原型中的方法

 1)栈,队列方法:-----改变了原数组
   a.栈
     push()
       含义:入栈。可接受任意类型的数据,将它们逐个添加到数组的末尾,并返回数组的长度。
       参数:
          单个值,直接插入到数组末尾
          多个值,将多个值依次插入数组末尾
          数组,直接插入到数组末尾
       返回值:操作后数组的长度
     pop()
       含义:出栈。从数组的末尾移除最后一项,减少数组的length值,返回移除的项。
       参数:单个值/多个值/数组
       返回值:被移除的项

   b.队列-----改变了原数组
     shift()
        含义:移除数组中的第一个项,并返回该项,同时将数组的长度减一。
        参数:任意或者无

     unshift()
        含义:在数组的前端添加任意个项,并返回新数组的长度。
        参数:单个值/多个值

2)排序:-----改变了原数组
   a.反转
     reverse()
       含义:反转数组项的顺序
       参数:
         数组或者无
       返回值:
         反转后的数组

   b.排序
     sort()
        返回排序(升序)后的数组。

    参数:
        function(a,b){
           if(a > b){
             return 1;
          } else {
                   return -1;
                   }
                }

        如果返回值大于0,a的索引在后,b在前
            if(a>b){
                return 1;
               }

        升序,a在b后,a>b,所以大的在后

            if(a<b){
                 return 1;
                }
        降序,a在b后,a<b,所以小的在后

3)截取方法(子数组的提取):
   a.concat()-----不改变原数组
     含义:数组拼接
  例:   
     arr1=[1,2,3,4];
     arr2[5,6,7];
     arr1.concat(arr2);
     返回[1,2,3,4,5,6,7],
     此时数组arr1和arr2的值不变。

   b.slice()-----不改变原数组 
     含义:子数组的提取,可接收一个或两个参数(返回项的起始位置,结束位置)。
    1)当接受一个参数时,截取从该参数指定的位置开始,到当前数组末尾的所有项。
    2)当接收两个参数时,截取起始位置到结束位置之间的项,但是不包含结束位置的项。
  例:
     arr=[1,2,3,4,5,6,7];
     arr.slice(2);
     返回[3,4,5,6,7]
     arr.slice(2,5);
     返回[3,4,5]

   c.splice()-----改变原数组 
    splice(begin,len,item1,item2,...)
    begin   起始位置
        len     从起始位置开始删除项的个数
        item1,item2...  插入的项

    含义:向数组中插入数据,将始终返回一个数组,该数组中包含从原始数组中删除的项。
    1)删除:指定两个参数(删除的起始位置,要删除的项数)。返回被删除的项。
    2)插入:指定三个参数(起始位置,0,要插入的任意数量的项)。返回[](表示没有删除项)。
    3)替换:指定三个参数(起始位置,要删除的项数,要插入的任意数量的项)
    //要删除的项数是指从当前位置开始,包括当前位置的项。

  例:
    arr=[1,2,3,4,5,6,7];

   1)arr.splice(1,3);
    返回[2,3,4],此时arr=[1,5,6,7]

   2)arr.splice(1,0,8);//在起始位置前插入
    返回[],此时arr=[1,8,5,6,7]
    arr.splice(1,0,8,9,10);
    返回[],此时arr=[1,8,9,10,5,6,7]

   3)arr.splice(1,3,8,9);
    返回[2,3,4],此时arr=[1,8,9,5,6,7]

4)索引方法
  a.indexOf()-----不改变原数组
    从数组开头向后查找,使用全等操作符,找不到该元素则返回-1.第一个参数为要查找的项,第二个参数(可选)为索引开始位置。
     arr=['a','b','c','d','e']
     arr.indexOf('c');//返回2
     arr.indexOf('f');//返回-1
     arr.indexOf('d',0)//返回3

  b.lastIndexOf()-----不改变原数组
    从数组末尾向前查找,使用全等操作符,找不到该元素则返回-1.第一个参数为要查找的项,第二个参数(可选)为索引开始位置。
     arr=['a','b','c','d','e','c']
     arr.lastIndexOf('c');//返回5
     arr.lastIndexOf('d',4)//返回3

5)迭代方法
  需求:拓展Array中的函数,要求遍历数组中所有元素,但是不处理结果,结果的处理交给回调函数。

  a.every()---并且
    含义:每一个元素是否满足条件,如果满足返回true。
    参数:匿名函数(item,index,arr),必须返回boolean值。
  b.some()---或者
   只要有一个元素满足条件就返回true。
  c.filter()---过滤
    返回值:为每一个回调函数为true的元素的集合。(返回由满足条件的元素组成的数组)
  d.map()---映射或投影
    返回值:每一个回调函数的返回值组成的数组。
  e.forEach()
    含义:迭代。常用来遍历元素。没有返回值。
        参数:匿名函数(item,index,arr)

猜你喜欢

转载自blog.csdn.net/qq_37957971/article/details/82316819
今日推荐