JavaScript第5天(函数+作用域+预解析+对象)

1、2、arguments的使用

    // 伪数组 并不是真正意义上的数组
    // 1. 具有数组的 length 属性
    // 2. 按照索引的方式进行存储的
    // 3. 它没有真正数组的一些方法 pop()  push() 等等
     // arguments 的使用  只有函数才有 arguments对象  而且是每个函数都内置好了这个arguments

eg1:求任意个数的和

       
        function fn() {
            // 我们可以按照数组的方式遍历arguments
            for (var i = 0; i < arguments.length; i++) {
                console.log(arguments[i]);
            }
        }
        fn(1, 2, 3);
        fn(1, 2, 3, 4, 5);

eg2:求任意个数的最大值

        // 利用函数求任意个数的最大值
        function getMax() { // arguments = [1,2,3]
            var max = arguments[0];
            for (var i = 1; i < arguments.length; i++) {
                if (arguments[i] > max) {
                    max = arguments[i];
                }
            }
            return max;
        }
        console.log(getMax(1, 2, 3));
        console.log(getMax(1, 2, 3, 4, 5));
        console.log(getMax(11, 2, 34, 444, 5, 100));

JavaScript第5天(函数+作用域+预解析+对象)_第1张图片

03、利用函数翻转数组

        // 利用函数翻转任意数组 reverse 翻转
        function reverse(arr) {
            var newArr = [];
            for (var i = arr.length - 1; i >= 0; i--) {
                newArr[newArr.length] = arr[i];
            }
            return newArr;
        }
        var arr1 = reverse([1, 3, 4, 6, 9]);
        console.log(arr1);
        var arr2 = reverse(['red', 'pink', 'blue']);
        console.log(arr2);

04、函数封装冒泡排序

        // 利用函数冒泡排序 sort 排序
        function sort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                for (var j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        var temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        var arr1 = sort([1, 4, 2, 9]);
        console.log(arr1);
        var arr2 = sort([11, 7, 22, 999]);
        console.log(arr2);

05、利用函数判断闰年

        // 利用函数判断闰年
        function isRunYear(year) {
            // 如果是闰年我们返回 true  否则 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }
        console.log(isRunYear(2000));
        console.log(isRunYear(1999));

06、函数可以调用另外一个函数

eg:判断某一年的2月有多少天

        // 用户输入年份,输出当前年份2月份的天数
        function backDay() {
            var year = prompt('请您输入年份:');
            if (isRunYear(year)) { // 调用函数需要加小括号
                alert('当前年份是闰年2月份有29天');
            } else {
                alert('当前年份是平年2月份有28天');
            }
        }
        backDay();


        // 判断是否为闰年的函数
        function isRunYear(year) {
            // 如果是闰年我们返回 true  否则 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }

07-14、函数的2种声明方式

JavaScript第5天(函数+作用域+预解析+对象)_第2张图片
eg:

        // 1. 利用函数关键字自定义函数(命名函数)
        function fn() {

        }
        fn();

JavaScript第5天(函数+作用域+预解析+对象)_第3张图片
eg:

        // 2. 函数表达式(匿名函数) 
        // var 变量名 = function() {};
        var fun = function(aru) {
            console.log('我是函数表达式');
            console.log(aru);

        }
        fun('pink老师');
    // (1) fun是变量名 不是函数名  
    // (2) 函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值 而 函数表达式里面存的是函数
    // (3) 函数表达式也可以进行传递参数

10、作用域

JavaScript第5天(函数+作用域+预解析+对象)_第4张图片
在这里插入图片描述
JavaScript第5天(函数+作用域+预解析+对象)_第5张图片
JavaScript第5天(函数+作用域+预解析+对象)_第6张图片
JavaScript第5天(函数+作用域+预解析+对象)_第7张图片
JavaScript第5天(函数+作用域+预解析+对象)_第8张图片
JavaScript第5天(函数+作用域+预解析+对象)_第9张图片
JavaScript第5天(函数+作用域+预解析+对象)_第10张图片
JavaScript第5天(函数+作用域+预解析+对象)_第11张图片
eg:
JavaScript第5天(函数+作用域+预解析+对象)_第12张图片
JavaScript第5天(函数+作用域+预解析+对象)_第13张图片
在这里插入图片描述
输出离console.log(num)最近的那个,所以这里输出123

15、预解析导读

16、17、预解析

几个eg:
1、
JavaScript第5天(函数+作用域+预解析+对象)_第14张图片
出错

2、
JavaScript第5天(函数+作用域+预解析+对象)_第15张图片
undefined
3、
JavaScript第5天(函数+作用域+预解析+对象)_第16张图片
打印

4、
JavaScript第5天(函数+作用域+预解析+对象)_第17张图片
出错

原因:
JavaScript第5天(函数+作用域+预解析+对象)_第18张图片
// 1. 我们js引擎运行js 分为两步: 预解析 代码执行
// (1). 预解析 js引擎会把js 里面所有的 var 还有 function 提升到当前作用域的最前面
// (2). 代码执行 按照代码书写的顺序从上往下执行
// 2. 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
// (1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
// (2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
因此:

        // 2问
        console.log(num); // undefined  坑 1
        var num = 10;
        // 相当于执行了以下代码
        // var num;
        // console.log(num);
        // num = 10;
        // 4问
        fun(); // 报错  坑2 
        var fun = function() {
                console.log(22);

            }
            // 函数表达式 调用必须写在函数表达式的下面
            // 相当于执行了以下代码
            // var fun;
            // fun();
            // fun = function() {
            //         console.log(22);

        //     }

下面分析几个案例:
JavaScript第5天(函数+作用域+预解析+对象)_第19张图片
undefined
原因:

        // 案例1
        var num = 10;
        fun();

        function fun() {
            console.log(num);
            var num = 20;
        }
        // 相当于执行了以下操作
        // var num;

        // function fun() {
        //     var num;
        //     console.log(num);
        //     num = 20;
        // }
        // num = 10;
        // fun();

JavaScript第5天(函数+作用域+预解析+对象)_第20张图片
20

// 案例2
        var num = 10;

        function fn() {
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fn();
        // 相当于以下代码
        // var num;

        // function fn() {
        //     var num;
        //     console.log(num);
        //     num = 20;
        //     console.log(num);
        // }
        // num = 10;
        // fn();

JavaScript第5天(函数+作用域+预解析+对象)_第21张图片
undefined 9

        // 案例3
        var a = 18;
        f1();

        function f1() {
            var b = 9;
            console.log(a);
            console.log(b);
            var a = '123';
        }
        // 相当于以下代码
        // var a;

        // function f1() {
        //     var b;
        //     var a;
        //     b = 9;
        //     console.log(a);
        //     console.log(b);
        //     a = '123';
        // }
        // a = 18;
        // f1();

重点掌握案例4!!!!
JavaScript第5天(函数+作用域+预解析+对象)_第22张图片
9 9 9 9 9 出错

        // 案例4
        f1();
        console.log(c);
        console.log(b);
        console.log(a);

        function f1() {
            var a = b = c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        // 相当于以下代码
        // function f1() {
        //     var a;
        //     a = b = c = 9;
        //     // 相当于 var  a  = 9; b = 9; c = 9; b 和 c 直接赋值 没有var 声明 当 全局变量看
        //     // 集体声明  var a = 9, b = 9, c = 9;
        //     console.log(a);
        //     console.log(b);
        //     console.log(c);
        // }
        // f1();
        // console.log(c);
        // console.log(b);
        // console.log(a);

18、对象导读

19-26、为什么是对象以及为什么需要对象+对象创建

JavaScript第5天(函数+作用域+预解析+对象)_第23张图片
JavaScript第5天(函数+作用域+预解析+对象)_第24张图片
JavaScript第5天(函数+作用域+预解析+对象)_第25张图片
JavaScript第5天(函数+作用域+预解析+对象)_第26张图片
JavaScript第5天(函数+作用域+预解析+对象)_第27张图片

eg:

        // 1.利用对象字面量创建对象 {}
        // var obj = {};  // 创建了一个空的对象 
        var obj = {
                uname: '张三疯',
                age: 18,
                sex: '男',
                sayHi: function() {
                    console.log('hi~');

                }
            }
            // (1) 里面的属性或者方法我们采取键值对的形式  键 属性名 : 值  属性值 
            // (2) 多个属性或者方法中间用逗号隔开的
            // (3) 方法冒号后面跟的是一个匿名函数
            // 2. 使用对象
            // (1). 调用对象的属性 我们采取 对象名.属性名 . 我们理解为 的
        console.log(obj.uname);
        // (2). 调用属性还有一种方法 对象名['属性名']
        console.log(obj['age']);
        // (3) 调用对象的方法 sayHi   对象名.方法名() 千万别忘记添加小括号
        obj.sayHi();

JavaScript第5天(函数+作用域+预解析+对象)_第28张图片

JavaScript第5天(函数+作用域+预解析+对象)_第29张图片
JavaScript第5天(函数+作用域+预解析+对象)_第30张图片
JavaScript第5天(函数+作用域+预解析+对象)_第31张图片
JavaScript第5天(函数+作用域+预解析+对象)_第32张图片
JavaScript第5天(函数+作用域+预解析+对象)_第33张图片

23、为什么需要构造函数?

        // 我们为什么需要使用构造函数
        // 就是因我们前面两种创建对象的方式一次只能创建一个对象
        var ldh = {
            uname: '刘德华',
            age: 55,
            sing: function() {
                console.log('冰雨');

            }
        }
        var zxy = {
                uname: '张学友',
                age: 58,
                sing: function() {
                    console.log('李香兰');

                }
            }
            // 因为我们一次创建一个对象,里面很多的属性和方法是大量相同的 我们只能复制 
            // 因此我们可以利用函数的方法 重复这些相同的代码 我们就把这个函数称为 构造函数
            // 又因为这个函数不一样,里面封装的不是普通代码,而是 对象  
            // 构造函数 就是把我们对象里面一些相同的属性和方法抽象出来封装到函数里面

构造函数举例:

        // 构造函数和对象
        // 1. 构造函数  明星 泛指的某一大类  它类似于 java 语言里面的  类(class)
        function Star(uname, age, sex) {
            this.name = uname;
            this.age = age;
            this.sex = sex;
            this.sing = function(sang) {
                console.log(sang);

            }
        }
        // 2. 对象 特指 是一个具体的事物 刘德华 ==  {name: "刘德华", age: 18, sex: "男", sing: ƒ}
        var ldh = new Star('刘德华', 18, '男'); // 调用函数返回的是一个对象
        console.log(ldh);
        // 3. 我们利用构造函数创建对象的过程我们也称为对象的实例化

27、new关键字执行过程

JavaScript第5天(函数+作用域+预解析+对象)_第34张图片

28、遍历对象

        // 遍历对象 
        var obj = {
                name: 'pink老师',
                age: 18,
                sex: '男',
                fn: function() {}
            }
            // console.log(obj.name);
            // console.log(obj.age);
            // console.log(obj.sex);
            // for in 遍历我们的对象
            // for (变量 in 对象) {

        // }
        for (var k in obj) {
            console.log(k); // k 变量 输出  得到的是 属性名
            console.log(obj[k]); // obj[k] 得到是 属性值

        }
        // 我们使用 for in 里面的变量 我们喜欢写 k  或者  key

结果为:
JavaScript第5天(函数+作用域+预解析+对象)_第35张图片

29、小结和作业

eg:

        function Computer(color, wigth, band, type) {
            this.color = color;
            this.wigth = wigth;
            this.band = band;
            this.type = type;
            this.seeMovie = function (num) {
                alert('you can see ' + num + ' movies!')
            }
        }
        var myComputer = new Computer('red', 18, 'apple', 'wudi')
        alert(myComputer.color)
        alert(myComputer.band)
        var num = prompt('input num')
        myComputer.seeMovie(num)
        var buttom = {
            width: 10,
            height: 11,
            action: function (num) {
                alert('there have ' + num + ' buttoms!')
            }
        }
        alert(buttom.width);
        alert(buttom.height);
        buttom.action(3)

总结:
对象:
①用变量赋值的方法构造
②属性和函数都用:来赋值,用,分隔

构造函数:
①用function 对象名() {}的方法构造
②要用this指针来赋值
③具体化为对象时要使用new

你可能感兴趣的:(JS初学,javascript,js)