zoukankan      html  css  js  c++  java
  • function 基础运用

    sort排序,此处列子为a-b为升序,b-a为降序
    let arr = [1,564,46,12,4,-455,];
    console.log(arr.sort(function(a,b){
        return b-a;
    }))

    同上,这是升序,-1和1替换一下则为降序
    let arr = [1,654,13,41,3,4,5]
    console.log(arr.sort(function(a,b){
        if(a<b){
            return -1;
        }else if (a>b){
            return 1 ;
        }else{
            return 0;
        }
    }))

    infex 用法
    let arr = ["h","e","l","l","o"];
    console.log(arr.indexOf("l"))//此处是2;则为正数下标为2的位置;
    console.log(arr.lastIndexOf("l"))//此处为3,为倒着找却正着数下标,在小标为3处;
    console.log(arr.indexOf("z"))//找不到,则为-1;

    let arr = ["1,","2","3"]
    console.log(arr.indexOf(1));//此处为-1;是使用全等比较

    // includes 用于查看数组是否包含某个元素,包含则返回true,否则返回false
    let arr = ["1","2","3"]
    console.log(arr.includes(2));//false
    console.log(arr.includes("2"));//true
    console.log(arr.includes(7));//false

    // indexof去重
    let str = [];
    let arr = [1,2,6,1,2,3,1,5,2,3,1]
    for(i=0;i<arr.length;i++){
        if(str.indexOf(arr[i])==-1){
            str.push(arr[i])
        }
    }console.log(str)

    includes去重
    let arr = [1,2,3,4,1,2,3,4,1,2,3]
    let str = [];
    for(i=0;i<arr.length;i++){
        if(str.includes(arr[i])==false){
            str.push(arr[i])
        }
    }
    console.log(str);


    集合
    let s1 = new Set();
    let s2 = new Set([1,2,3])
    console.log(s1);
    console.log(s2)


    let s1 = new Set();
    s1.add(1);
    console.log(s1);
    s1.add(2).add(3).add(4);
    console.log(s1)

    //也可直接传入数组
    let s1 = new Set();
    s1.add([1,2,3,4]);
    console.log(s1)

    // delete 删除某个元素,就算数组里面没有这个元素也不会报错
    // 不可删除数组
    let s1 = new Set([1,2,3]);
    s1.delete(2);
    console.log(s1);
    s1.delete(4);
    console.log(s1);

    // clear一次性删除所有元素
    let s1 = new Set([1,2,3,4])
    s1.clear();
    console.log(s1);

    // for-of可以对集合进行遍历
    let s = new Set([1,2,3,4,5,6]);
    for(let i of s){
        console.log(i);
    }

    //...元素,可以将集合转为数组
    let s1 = new Set([1,2,3]);
    console.log(s1);
    let arr = [...s1];
    console.log(arr);

    //集合转数组去重
    let arr = [1,2.,3,1,2,3,1,5,2,3,41,3,1];
    let str = new Set(arr);
    let s = [...str]
    console.log(s)

    //映射,先创建一个空的map对象,向里面添加元素用set,要从集合中获取信息用get
    let a = new Map();
    a.set("name","wangweijian");
    a.set("age",21);
    console.log(a)//Map { 'name' => 'wangweijian', 'age' => 21 }
    console.log (a.get("name"))//wangweijian

    // 在对象中,无法用对象作为对象属性的键名,但是在map映射中,却可以这样做,可以这么说
    // 在map映射里面可以使用任意数据类型来作为键;
    let a = new Map();
    a.set({},"wangweijian");
    a.set([1,2,3],21);
    a.set([3554],21);
    console.log(a);//Map { {} => 'wangweijian', [ 1, 2, 3 ] => 21, [ 3554 ] => 21 }

    //映射转为数组
    //map结构转为数组结构,比较快速的方法还是使用前面介绍过的扩展运算符...。
    let arr = [["name","wangweijian"],["age",21]];
    let w = new Map(arr);
    console.log([...w.keys()]);//[ 'name', 'age' ]只显示键
    console.log([...w.values()]);//[ 'wangweijian', 21 ]只显示值
    console.log([...w.entries()]);//[ [ 'name', 'wangweijian' ], [ 'age', 21 ] ]显示键和值
    console.log([...w])//[ [ 'name', 'wangweijian' ], [ 'age', 21 ] ]显示键和值


    函数
    function test(name){
        console.log("Hello," + name);
    }
    test("wangweijian");//Hello,wangweijian

    声明函数体
    let test = function(name){
        console.log("Hello,"+name);
    }
    test("wangweijian");//Hello,wangweijian

    // arguments主要用途是用于保护传入到函数的实际参数
    function text(x){
        for(let i = 0;i<arguments.length;i++){
            console.log(arguments[i])
        }
    }
    text(1,2,3);
    //1
    //2
    //3

    // 伪数组对象,就是长得像数组的对象而已,但是并不是真的数组,我们可以证明这一点
    function test (x){
        arguments.push(100);//针对伪数组对象使用数组的方法
    }
    test(1,2,3)//TypeError: arguments.push is not a function
    //它不是数组

    //不定参数是在最后一个参数前面添加三个点,如果不是放在最后会直接报错,
    // 如:function test(...a,b),会将所有实参放入到一个数组里面,如:
    function test(a,...b){
        console.log(a);//1
        console.log(b);//[2,3,4,5,6,7,8]
    }
    test(1,2,3,4,5,6,7,8)

    //这里的不定参数就是一个真正的数组,可以使用数组的相关方法
    function text(a,...b){
        console.log(a);//1
        console.log(b)//[ 2, 3, 4, 5, 6 ]
        b.push(122);
        console.log(b);//[ 2, 3, 4, 5, 6, 122 ]此处使用了数组的push加入了元素122
    }
    text(1,2,3,4,5,6)

    // 默认参数ES6新增
    function text(name="world"){
        console.log("Hello,"+name);
    }
    text("wangweijian");//Hello,wangweijian
    text()//Hello,world

    //如果参数是一个数组,腰围这个数组设置默认值的话,写法稍微有些不同:如:
    let fn = function([a=1,b=2]=[]){
        console.log(a,b);
    }
    fn()//1 2
    fn([3,4])//3 4

    //包括后面我们要介绍的对象,也是可以设动默认值的,但是写法和上面类似
    let fn = function({name="wangweijian",age=18}={}){
        console.log(name,age);
    }
    fn();//wangweijian 18
    fn({name:"song",age:20});//song 20

    //length属性
    let test = function(a,b,c){
        console.log(arguments.length);//5实际参数的个数
        console.log(arguments.callee.length);//3形式参数的个数
    }
    test(1,2,3,4,5)

     

    Caller属性并不是arguments对象的,而是函数对象本身的属性,它显示了函数的调用者,如果函数是在全局执行环境中(浏览器)被调用,那么它的值为null,如果在另一个函数中被调用,它的值就是那个函数。

    全局执行环境中被调用:

    浏览器中:

    <body>

       <script>        

    let test = function(){            

    console.log(test.caller);        }        

    test();//null   

      </script>

    </body>

    Node

    let test = function(){    

    console.log(test.caller);

    }

     test();//[Function]

    被一个函数所调用:

    let test = function(){    

    let test2 = function(){       

      console.log(test2.caller);

            //[Function: test]      

      // ฎ因为这个函数的调用者是text函数

    }    

    test2();

    }

    test();

     

    Calleearguments对象的一个属性,该属性是一个指针,指向拥有这个arguments对象的函数

    let test = function(){

    let test2 = function(){

    let test3 = function(){

    console.log(arguments.callee);

    //[Function: test3]

    }

    Test3();

    }

    Text2();

    }

    Test();

    callee的作用在于能够找到arguments对象所属的函数,不让函数的执行和函数名仅仅的关联在一起,我们来看下面这个例子

    //计算阶乘的递归函数

    let test = function(i){

    if(i == 1){

    return 1;

    }else{

    Return  i * test(i-1);//这里就和函数名紧紧的关联了起来

    }

    }

    console.log(test(3));

    如果我们把上面的写法稍作修改,就可以看到上面写法的缺陷

    //计算阶乘的递归函数

    let test = function(i){

    if(i == 1){

    return 1;

     }else{

    return i * test(i-1);//这里就和函数名紧紧的关联起来

    }

    }

    let test2 = test;//将阶乘函数赋值给text2

    //改变test这个阶乘函数的函数体

    test = function(){

      console.log(" 我已经改变”};

    }

    console.log(test2(3));

    //我已经改变了

    //NaN

     

    所以,这个时候就可以使用arguments对象的callee属性来降低这种关联

    //计算阶乘的递归函数

    let test = function(i){

    if(i == 1){

    return 1;

    }else{

    return i * arguments.callee(i-1)//callee指向拥有arguments对象的函数

    }

    }

    let test2 = test//j将阶乘函数赋值给test2

    //改变test这个阶乘函数的函数体

    test = function(){

     console.log(" 我已经改变了“);

    }

    console.log(test2(3))//6

  • 相关阅读:
    MVC WebApi的两种访问方法
    MVC CRUD 的两种方法
    MVC EF 导航属性
    MVC EF两种查询方法
    MVC WebApi
    POJ 1511 Invitation Cards ( 双向单源最短路 || 最小来回花费 )
    POJ 2502 Subway ( 最短路 && 最短路建图 )
    POJ 3660 Cow Contest ( 最短路松弛思想应用 && Floyd求传递闭包 )
    POJ 1502 MPI MaeIstrom ( 裸最短路 || atoi系统函数 )
    POJ 3259 Wormholes ( SPFA判断负环 && 思维 )
  • 原文地址:https://www.cnblogs.com/wwjljwx/p/11119180.html
Copyright © 2011-2022 走看看