day06 - JavaScript函数基础知识(2)

知识回顾:

js的作用:1.操作html + css ; 2.动态数据渲染
数据类型:number(数字)、string(字符串)、boolean(布尔值)、null空()、undefined(未定义)
判断数据类型:typeof
数据转换:
1.转字符串:String() +’’
2.转数字 Number() + / - / * / / / % 、 Math.round()、Math.floor() 、Math.ceil()、
parseInt() :把小数转为整数的时候 == Math.floor() ;还可以取出字符串里面的小数(字符串里面的第一位数字开始,到第一个非数字结束)
parseFloat() 取小数

函数分为系统函数、自定义函数
函数具有封装性、复用性、调用性

// 提取到第一个非数字为止的整数
        var m = parseInt('.24.5px2') ;
        console.log(m) ;   //NaN

        var n = parseInt('0.25px2') ;
        console.log(n) ;   //0

关于函数参数的问题

1.函数在调用的时候,必须按照要求传参
2.当实参和实参不对等的时候,不报错
3.实参多了或者少了,函数不报错
注:函数的说明书包括功能、参数、返回值

        function calc(a,b,c,d){
            switch(a){
                case '+' : return b + a ;
                case '-' : return b - c ;
            }
        }

        //实参和实参不对等时
        var res = calc('-',1,2,3) ;  
        console.log(res) ;  // -1

        var res2 = calc('+' ,1,2,3) ;
        console.log(res2) ;  // 1+

关于return返回值

return:1.给函数一个返回值 ;2.会提前结束整个函数
注意:return只能返回一个值

判断一个数是不是质数
参数:给我一个数
返回值:我告诉你是不是

        //判断一个数是不是质数
        function isZhi(n){
            for(var i = 2 ; i < n ; i++){
                //假设它不是一个质数所以
                if(n % i === 0){
                    return false ;
                }
            }
            return true ;
        }

        var res = isZhi(17) ;
        console.log(res) ;    //true 说明17是一个质数

训练:判断是否为闰年

    <input type="text" id="inp1">
    <button id="btn1">判断</button>

    <script>
        //判断是否为闰年
        function isRun(y){
            return y % 4 === 0 && y % 100 !== 0 || y % 400 ===0 ? true : false ;
        }

        //获取对象
        var oInp = document.getElementById('inp1') ;
        var oBtn = document.getElementById('btn1') ;

        //绑定点击事件
        oBtn.onclick = function (){
            var y = oInp.value ;
            var res = isRun(y) ;
            if(res){
                alert('是') ;
            }
            else{
                alert('不是') ;
            }
        }

        //随机生成1000 - 10000(取不到10000)之间的年份,判断是否为闰年
        var n = parseInt(Math.random() * (10000 - 1000)) + 1000 ;
        console.log(n);
        var res = isRun(n) ;
        console.log(res);
    </script>

训练:判断年月日
方法一

        function isRun(y) {  
            return y % 4 === 0 && y % 100 !== 0 || y % 400 === 0 ?  true : false ;
        }

        // 判断年月日是否合法
        // 思考:参数,返回值
        function isDate(y , m , d) {  
            // 判断年
            if(y >= 1000 && y <= 2000 && y % 1 === 0) {
                // 月
                if( m >= 1 && m <= 12 && m % 1 === 0) {
                    // 日期

                    var maxDay = 31 ;
                    if(m == 4 || m == 6 || m == 9 || m == 11) {
                        maxDay = 30
                    }
                    else if(m == 2) {
                        if(isRun(y)) {
                            maxDay = 29
                        } else {
                            maxDay = 28
                        }
                    }

                    if(d >= 1 && d <= maxDay && d % 1 === 0) {
                        return true
                    } 
                    return '日期必须在1-' + maxDay + '之间'

                }
                return '月必须在1-12之间'
            }
            return '年必须在1000-2000之间'
        }

        var res = isDate(2012,3,43) ;
        console.log(res) ;

方法二

        function isRun(y) {  
            return y % 4 === 0 && y % 100 !== 0 || y % 400 === 0 ?  true : false ;
        }

        function isDate(y , m , d) {  
            var res = '' ;
            // 判断年
            if(y >= 1000 && y <= 2000 && y % 1 === 0) {
               res += '年正确,'
            }
            else {
                res += '年不正确,'
            }

            // 月
            if( m >= 1 && m <= 12 && m % 1 === 0) {
                   
                res += '月正确,'
            }
            else {
                res += '月不正确,'
            }

            // 日期
            var maxDay = 31 ;
            if(m == 4 || m == 6 || m == 9 || m == 11) {
                maxDay = 30
            }
            else if(m == 2) {
                if(isRun(y)) {
                    maxDay = 29
                } else {
                    maxDay = 28
                }
            }

            if(d >= 1 && d <= maxDay && d % 1 === 0) {
                res += '日期正确'
            } 
            else {
                res += '日期不正确'
            }
            return res 
        }


        // 年对,月不对,日期对  字符串

        var res = isDate(2012,3,43) ;
        console.log(res) ;

方法三:

        function isRun(y) {  
            return y % 4 === 0 && y % 100 !== 0 || y % 400 === 0 ?  true : false ;
        }

        // return 的作用
        // 条件取反

        true / false 
        function isDate(y , m , d) {  
            // 年份不正确,结果就是不对
            if(y < 1000 || y > 2000 || y % 1 !== 0) {
                return false 
            }

            if(m < 1 || m > 12 || m % 1 !== 0) {
                return false 
            }

            // 日期
            var maxDay = 31 ;
            if(m == 4 || m == 6 || m == 9 || m == 11) {
                maxDay = 30
            }
            else if(m == 2) {
                if(isRun(y)) {
                    maxDay = 29
                } else {
                    maxDay = 28
                }
            }
            if(d < 1 || d > maxDay || d % 1 !== 0) {
                return false
            }

            return true
        }

        var res = isDate(2012,3,43) ;
        console.log(res) ;

训练:随机四位数字验证

   <input type="text" id="inp">
    <button id="btn">刷新</button>

    <script>
        //取不到最大值
        function rand(min , max){
            return parseInt(Math.random() * (max - min) + min)
        }

        //获取对象
        function get(id){
            return document.getElementById(id) ;
        }

        //随机四位数字验证码 
        //方法1:生成一个四位数 1000 - 10000  
        var n = rand(1000 , 10000) ;
        console.log(n) ;  // 缺点:第一个数不可能是0 (不影响功能的实现)

        // 方法二:
        // 随机从0-10之间取一个
        var n1 = rand(0,10) ;
        var n2 = rand(0,10) ;
        var n3 = rand(0,10) ;
        var n4 = rand(0,10) ;
        var res = '' + n1 + n2 + n3 + n4 ;
        console.log(res);

        // 方法三
        var res = '';
        for(var i = 0; i < 4 ; i++) {
            var n = rand(0,10) ;
            res += n ;
        }
        console.log(res);

        //参数,返回值。生成多位数字验证码时
        function randCode(x) {  
            x = x || 4 ;
            var res = '';
            for(var i = 0; i < x ; i++) {
                var n = rand(0,10) ;
                res += n ;
            }
            return res ;
        }

        // 页面打开的时候,就要显示验证码
        // var result = randCode(8);
        // get('inp').value = result;
        get('inp').value = randCode(8)

        get('btn').onclick = function () {  
            // var result = randCode(8);
            // get('inp').value = result;

        get('inp').value = randCode()
        }

    </script>

短路赋值

或 || 见真即真
与 && 见假即假

        //短路赋值
        var n = 1 || 2 ;   // n = (1 || 2)   // n = 1

        var n = 0 || 3 ;   // n = (0 || 3)   // n = 3

        var n = 1 && 2 ;   // n = (1 && 2)   // n = 2

        var n = 0 && 3 ;   // n = (0 && 3)   // n = 0

例子:

        function sum(a , b){
            //当a,b没有赋值时,a、b默认为0
            a = a || 0 ;
            b = b || 0 ;
            console.log(a , b) ;
            return a + b ;
        }

        var res = sum(1) ;
        console.log(res) ;  // 1 + 0 = 1

求和赋值

编写一个函数sum(n)
当传入n为偶数时,调用函数求1/2 + 1/4 + … + 1/n
当传入n为奇数时,调用函数求1 + 1/3 + … + 1/n
分析发现:奇数或者偶数的求和就是初始值不一样

        function sum(n){
            //判断n为奇数还是偶数,确定初始值
            var k = 2 ;
            //n为奇数时 初始值为 1
            if(n % 2) k = 1 ;

            var res = 0 ;
            for(var i = k ; i <= n ; i += 2){
                res += 1 / i ;
            }
            return res ;
        }

        var r = sum(4) ;
        console.log(r) ;

求最大公约数

        // 方法一
        function gcd(x , y){
            var min = Math.min(x,y) ;
            for(var i = 1 ; i <= min ; i++){
                if(x % i === 0 && y % i === 0){
                    max = i ;
                }
            }
        }

        //方法二
        function gcd(x , y){
            var max = 0 ;
            for(var i = Math.min(x , y) ; i >= 1 ; i--){
                if(x % i === 0 && y % i === 0){
                    // return i ;
                    max = i ;
                    break ;
                }
            }
            return max ;
        }

        var res = gcd(8 , 12) ;
        document.write(res) ;  //4

作用域

变量有作用域
全局作用域:也叫全局变量,在函数外面声明的变量,没有var的变量
局部作用域:也叫局部变量,在函数内部声明的变量。形参本质上就是一个局部变量

变量可以重复的声明
变量可以不声明,直接赋值
当函数内部的变量名和外部的变量相同时,优先使用自己的 — 同名不同人
变量是在函数内部声明的,只能在函数内部使用

        function fn() {  
            // 变量是在函数内部声明的,只能在函数内部使用
            var c = 9 ;
            console.log(c);
            // 没有var,此变量默认为全局变量
            d = 10 ;
            var b = 20 ;
            console.log(b);  // 20
        }

        fn()

        console.log(c) ;  //报错  c是局部变量

如果变量只是声明了没有定义,输出结果为 undefined

        var a ;
        console.log(a);  
        // undefined  变量已经声明,但是没有赋值

函数嵌套函数

变量的作用域:优先找自己的,自己找不到就找向上一级查找,一直找到script为止,一直找不到就报错。

        var a = 20 ;

        function fn3(){
            console.log(a);
        }

        function fn(){
            // 属于fn的局部变量
            var a = 10 ;

            // fn2也属于fn的一部分 , 找到最近的变量
            function fn2() {  
                var a = 5 ;
                // fn2可以访问到fn的变量
                console.log(a);
            }
            
            fn2()
        }

        fn()

预编译

js代码的执行分两个阶段
1.预编译阶段:首先会找到所有的var声明的变量,找到所有的具名函数
2.代码执行阶段

函数的声明方式:
1.具名函数 ----有名字 存在预编译的问题
2.赋值式函数 :不存在预编译的问题

变量
数据类型:基本数据类型(5) + 引用数据类型()

fn()

        fn2()  // 报错

        function fn() {  
            console.log(666);
        }

        // 赋值式函数
        var fn2 = function () {  
            console.log(777);
        }
        fn2()
        console.log(typeof fn2);  // function

        var fn2 ;
        function fn() {  
            console.log(666);
        }
        fn()
        fn2()  // 报错了
        fn2 = function () {  
            console.log(777);
        }
        fn2()

匿名函数的自调用--------一次性的函数

~function (n) {  
            console.log(n);
        }(666)

系统函数

1.alert() :没有返回值
2.有输入框的弹框:
var res = prompt(‘请输入你的名字’);
3.确定弹窗
var res = confirm(‘确定要删除我吗’) ; //返回布尔值
4.eval():能计算的时候,就计算,不能计算时,直接报错

function calc(a , b , f) {  
            return eval(a + f + b)
        }

        var res = calc(1,2,'+');
        console.log(res);  //3

递归函数

递归:传递与回归,自己调用自己

function fn() {  
            fn()
        }
        fn()   // 死递归

1+2+3+4+…+100 ;
100 + (前面99个数的和)
99 + (前面98个数的和)
98 +

function sum(n) {  
            if(n == 1){
                return 1
            }
            return n + sum(n-1)
        }

训练:斐波拉且数列
斐波拉切数列 1 1 2 3 5 8 13 21 34 …
分析:求第n个数是多少 (n-1) + (n-2)

function fb(n) {  
            if(n == 1 || n == 2) {
                return 1
            }
            return fb(n - 1) + fb(n - 2)
        }

        console.log(fb(6));   //8

递归求和

编写一个函数sum(n)
当传入n为偶数时,调用函数求1/2 + 1/4 + … + 1/n
当传入n为奇数时,调用函数求1 + 1/3 + … + 1/n
分析:不管奇数偶数,计算都是1/n+第n-2个数的和,
1 / n + sum(n - 2)

function sum(n) {  
            if(n == 1) {
                return 1
            }
            if(n == 2) {
                return 1 / 2
            }
            return 1 / n + sum(n - 2)
        }

        console.log(sum(5));
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值