JavaScript知识点总结(六)

数组去重

[1,2,3,4,1,2,3,5,6,7]

<script>
    var arr = [1, 2, 1];

    var newArr = [];

    for (var i = 0; i < arr.length; i++) {
        var flag = true;//默认的时候往里面放。
        for (var j = 0; j < newArr.length; j++) {
            if (newArr[j] == arr[i]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            newArr[newArr.length] = arr[i];
        }
    }

    console.log(newArr);
</script>

冒泡排序

[5,2,1,4]//开始进行比较第一个和第二比较,第二个和第三个比较....//如果比较的两个数大的放后面。
1-----------------------
5和2   交换   2 5 1 4
5和1   交换   2 1 5 4
5和4   交换   2 1 4 5

第一圈比较总共比较了3次,最后一个数是最大的。

2------------------------
2和1   交换  1 2 4 5
2和4   不交换 1 2 4 5
第三个数不用和第四个数比较,因为第四个数是最大的。
第二圈总共比较2次,最后一个最大,倒数第二个第二大。

3------------------------
1和2   不交换  1 2 4 5
第二个不用和第三个比较,因为第三个肯定比第二个大。
第三圈完成共计1次。
  1. 就是知道了要比较的下标怎么获得

    var arr = [5,2,1,4];
    //得知道每次比较的值的下标
    //4个数比较了3次,每次的下标我也知道了。
    /*
    i=0 0<3 true
    	0  1
    i=1 1<3 true
    	1  2
    i=2 2<3 true
    	2  3
    i=3 3<3 false
    */
    for (var i = 0; i < arr.length -1 ;i++){
    	console.log(i,i+1);
    }
    
  2. 根据获得到的下标,然后开始比较、换值。

    //4个数进行了3轮比较,得到了1个最大的数
    var arr = [5,2,1,4];
    /*
    i=0 0<3 true
    	5>2 true
    		tmp=5;
    		arr[0]=arr[1]//arr[0]=2
    		arr[1]=5//[2,5,1,4]
    i=1 1<3 true
    	arr[1]>arr[2]//5>1 true
    		tmp=5;
    		arr[1] = 1
    		arr[2] = 5;//[2,1,5,4]
    i=2 2<3 true
    	arr[2]>arr[3]//5>4//true
    		tmp=5;
    		arr[2] = 4
    		arr[3] = 5;//[2,1,4,5]
    i=3 3<3 false
    */
    for (var i = 0 ; i < arr.length -1 ; i++){
        if (arr[i] > arr[i+1]){
            //交换位置
            var tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp
        }
    }
    
  3. 就得每次都比较

    var arr = [5,2,1,4];
    //第一次比较获得了最大的数
    for (var i = 0 ; i < arr.length -1 ; i++){//[2,1,4,5]
        if (arr[i] > arr[i+1]){
            //交换位置
            var tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp
        }
    }
    //[2,1,4,5]进行比较
    //第二次比较
    /*
    i=0; 0<2 true
    	arr[0]>arr[1]//2>1 true
    		tmp = 2
    		arr[0] = 1
    		arr[1] = 2;//[1,2,4,5]
    i=1; 1<2 true
    	arr[1]>arr[2]//2>4 false
    i=2; 2<2 false
    */
    for (var i = 0; i < arr.length - 1 - 1;i++){
    	if (arr[i] > arr[i+1]){
            //交换位置
            var tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp
        }
    }
    //第三次比较  [1,2,4,5]
    /*
    i=0 0<1 true
    	arr[0]>arr[1]//1 > 2 false
    i=1 1<1 false
    */
    for (var i = 0; i < arr.length - 1 - 1-1;i++){
    	if (arr[i] > arr[i+1]){//[1,2,4,5]
            //交换位置
            var tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp
        }
    }
    

函数

什么是函数

函数:是完成任务并且已经命名的代码块,可以用来反复使用。

函数本质上也是一种数据,也是属于对象类型。

函数也是值,函数中包含的是可执行的代码。

函数的作用

  1. 解决代码冗余问题,形成代码复用。
  2. 封装代码,让函数内部的代码对外部不可见。
  3. 将整个代码、项目,通过函数模块化。

函数的种类

  • 系统函数,系统已经提供的一些函数,有很多。我们也学了很多parseInt()Number()String()
  • 自定义函数,如果系统中的函数不能满足我的需求,那我就自己写一个。

如果系统函数能够实现功能一定要用系统函数,不要自己写。

函数的定义和调用

步骤:

  1. 将你要实现代码写出来。
  2. 将这些代码用大括号包起来。
  3. 使用关键字 function 函数名()来声明函数。
  4. 将里面经常变的量提取出来作为参数。

__函数不调用不执行。__调用函数使用函数名()

function 函数名(){
	
}

注意:

  1. 函数名的定义要有意义。
  2. 函数名的定义规则和变量的定义规则相同。
  3. 函数声明有三种方式,这种方式声明的函数的名字可以重复(自定义函数、系统函数都可以)一旦发生重复后面的覆盖前面的。
  4. 函数有三种方式定义,这种函数的声明方式,在调用时,调用的代码可以放在函数定义之前也可以放在函数定义之后。

其他的声明方式

  • 函数表达式声明

    格式:

    变量名  = function(){
    	函数体
    };
    
    • 使用函数表达式声明的方式声明函数,函数末尾要有一个分号。

    • 这种方式是函数表达式声明,即外围的语句是表达式。

      函数表达式:它是表达式,不能以大括号开头,不能以function开头。

    • function后面可以有名字也可以没有名字。

    • 这种方式创建的函数调用必须在创建之后

  • 函数构造器声明

    var sayLiPeiHua = new Function("console.log('xxx真英俊?');");
    sayLiPeiHua();
    
    new Function('参数1','参数2'.......'语句')
    

    new Function()

    不这样用是因为该方法会导致代码解释两次(一次是解释常规的ES代码,第二次要将传入的字符串解析为可以执行的代码)

    函数定义的前两种方式区别

    ​ 如果用第一种方法去定义的函数,会被提前加载,因此调用语句可以写在函数的定义之前,因为那个时候函数已经被加载完毕了。而用第二种方式定义的函数,是不会被提前加载的。换句话说,必须要执行到函数定义的语句时,才会加载这个函数。因为在调用第二种函数的时候,该函数还没有加载啊,那么强行调用一个不存在的函数,自然是不被允许的咯!

函数的其他注意点

函数是数据,函数是对象。

函数名只不过是这个数据的标识。

  • 当你要访问这个函数的数据而不是执行这个函数的话,必须去掉后面的那对圆括号。

  • 函数是一个数据,函数名是标识,一个函数可以有多个标识。

        function say(){
            console.log('xx被我打了');
        }
    
        /* console.log(say);
        console.dir(say); */
    
        var test = say;
        var test1 = say;
    
        test();
        test1();
    

函数的参数

自定义函数的设计原则:用户可以参与控制自定义函数,可以对自定义函数进行微调。

<script>
    function printTable(row,col) {
        /* var row = 10;
        var col = 10; */

        document.write('<table border="1" width="500">');
        for (var i = 0; i < row; i++) {
            document.write('<tr>');
            for (var j = 1; j <= col; j++) {
                document.write('<td>&nbsp;</td>');
            }
            document.write('</tr>');
        }
        document.write('</table>');

    }


    printTable(10,10);
    printTable(5,5);
    printTable(100,10);
</script>
  • 形参:形式上的参数,声明函数的时候,提供的参数。
  • 实参:调用的时候在()里面实际使用的参数。

注意:

  1. 形参和实参传值是一一对应的。
  2. 多个形参和实参之间使用逗号进行分隔。
  3. 函数的形参只不过相当于在函数内部定义了一个变量。
  4. 函数也是数据,也是对象。其中就有属性和方法。其中有一个length属性用来表示有多少个形参。
  5. ES中的函数的形参、实参个数可以不相等。
    • 如果实参比形参少,那么多出来的形参将会自动被赋予undefined,并且假如进行加减运算的话就是:1+undefined+undefined = NaN。
    • 如果实参比形参多,多出来的参数将可以使用arguments对象来获得。

arguments对象

  • arguments对象只在函数内部才有。因为它是实参对象。

  • arguments对象它是一个类数组对象(array-like),因为它和数组相似的地方就是因为其中包含了索引和length属性,来访问这个类数组。这样你就可以获得传递进来的每一个实参。

    function a(){
        console.log(arguments);
        console.log(arguments.length);
        console.log(arguments[0]);
        console.log(arguments[1]);
        console.log(arguments[2]);
        console.log(arguments[3]);
    }
    
    a('a','b','c','d');
    
  • arguments对象适合在不确定传递多少实参的时候使用。

    // 需求:接收两个或两个以上的数进行相加得到和
    
        function sum(arg1, arg2) {
            //console.log(arg1 + arg2);
            var total = 0;
            for (var i = 0; i < arguments.length; i++) {
                total += arguments[i];
            }
            console.log(total);
        }
    
        sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    
  • 函数的形参我可以不写,都可以使用arguments对象来获得,但是使用形参会比较方便。

函数的返回值

return语句,格式:return [值],可以将return理解为整个函数最后计算的结果是什么。(返回的值是什么都无所谓,你看你想让它返回什么)。

return返回的值将会返回到函数调用处。

为什么要用return就是为了以后进行二次处理。

什么时候用return 什么时候不用return,完全看你的需求。

注意:

  1. 刚开始写的时候我们并没有说返回的值的事,没有return的时候函数的返回值是undefined。

    <script>
        function sum(arg1, arg2) {
            var res = arg1 + arg2;
        }
        var r = sum(1,2);
        console.log(r);
    </script>
    
  2. 函数会在执行完return语句之后立即退出。return之后的语句不会执行。

  3. return语句后面可以不带任何返回值,函数在执行之后将会返回undefined。

    function sum(arg1, arg2) {
        var res = arg1 + arg2;
        return;
    }
    
    console.log(sum(1,2));
    

    return的作用:

    1. 返回函数中要返回的值。
    2. 终止函数的执行。(如果return后面没有内容,只是单纯的终止函数的执行)

什么时候用return完全看你的需求。 它的作用返回函数的执行结果,终止函数的执行。

一个完整的函数有三大件:

  • 函数体(功能)
  • 参数
  • 返回值

返回值:

  • 没有参数、没有返回值
  • 有参数没有返回
  • 没有参数有返回值
  • 有参数有返回值(用的最多)

步骤:

  1. 将你要实现代码写出来。
  2. 将这些代码用大括号包起来。
  3. 使用关键字 function 函数名()来声明函数。
  4. 将里面经常变的量提取出来作为参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值