JavaScript

JS
        JavaScript 是一种具有面向对象能力的、解释型的程序设计语言。

        使用方式:
            JS需要和HTML一起使用才有效果,我们可以通过直接或间接的方式将JS代码嵌入在HTML页面中。
            行内JS : 写在标签内部的js代码
            内部JS : 定义在script标签内部的js代码
            外部JS : 单独的js文件,在HTML中通过script标签引入

        js的定义位置:
            可以定义在html页面中的任意位置
            推荐使用在:
                head中 : 便于后期维护,一目了然,可能获取不到元素,因为从上到下默认加载
                body结束之前 : 肯定能够获取元素

 <script>
        console.log("拿来吧你!!!");
        /*当页面中所有的内容全部加载完成之后触发函数的执行*/
        window.onload = function(){
            console.log(document.getElementById("box"));
        }
    </script>

    <!--引入外部js文件-->
    <script src="js/first.js"></script>
</head>
<body>

   <button type="button" οnclick="alert('醒醒吧你!!!!')">按钮</button>

  <div id="box">box</div>

</body>

测试js中的调试:
         1.alert() 弹出框
         2.document.write("你好啊,中国队必胜!!!");
            内部可以识别html语法结构
            当原页面中的内容加载完毕之后触发document.write,会覆盖原页面
         3. console.log() 控制台输出打印 -> 推荐
            console.info()
            console.error()
            console.warn()
 

变量:   存储单个数据|表达式
      js是一个弱类型语言
      java是强类型语言

        定义:
            声明的同时赋值
                var 变量名 = 赋值;

            先声明后赋值
                var 变量名;
                变量名 = 赋值;

          注意:
            js中变量的数据类型有值决定
            js中的变量不赋值存在默认值 undefined未定义
            变量的作用域提升: 只提升变量的声明,不提升变量的赋值
            变量的定义可以省略var的声明,不能发生作用域的提升

 <script>
        /*
        *   var i = undefined;
        *   var username = undefined;
        * */
        console.log(username);
        //console.log(w);

        //声明的同时赋值
        var i = 1;

        i = "";

        //先声明后赋值
        var username;
        username = "zhangsan";

        //同时定义多个变量
        var x=1,y=2,z=false;
        console.log(x,y,z);

        var b;
        console.log(b);

        w = 1;
        console.log("w = " + w);

    </script>

 数据类型:
            简单|基础数据类型
                1.String 字符串  ->黑色
                    一对''|""表示字符串
                    包含0~n个字符
                    通过转义字符进行转义

                2.Number 数值型
                    整数  小数
                    NaN not a number 不是一个数字
                        1)直接赋值NaN
                        2)当运算无法得到一个正确结果

                3.Boolean 布尔型
                    true | false
                    常常用于对条件判定结果类型

                4.Undefined 未定义
                    1) 直接赋值undefined
                    2) 声明变量未赋值默认undefined

                5.Null 空
                    1) 直接赋值null
                    2) 获取不到元素

                   Null 与  Undefined之间的区别:
                    1.undefined : 存在,但是没有值
                    2.null : 元素不存在

                6.Function 函数型
                    function 函数名(参数列表){
                        函数体;
                    }
                    通过函数的调用使用

            复杂|复合数据类型
                对象类型
                {} 表示对象
                有键值对组合而成
                {
                    key:value,
                    key:value,
                    键值对
                }
                两个键值对之间使用,分隔,最后一个键值对的后面不加,
                KEY与VALUE之间使用:分隔
                key : 如果符合命名规范可以直接定义,不符合命名规范.需要前后加引号
                value : 可以为任意类型

 <script>
        var str1 = "abc";
        var str2 = 'it\'s';
        var str3 = '123';
        console.log(str1,str2,str3);

        var num1 = 123;
        var num2 = NaN;
        var num3 = 5/'A';
        var num4 = 1.234;
        console.log(num1,num2,num3,num4);

        var n1 = null;

        //函数
        function fun(){
            console.log("这是一个函数");
        }

        //fun();

        //对象
        var obj = {};  /*空对象*/
        var obj2 = {
            name : 'zhangsan',
            age : 18,
            "girl friend" : null,
            son : {
                name : 'haha'
            }
        };
        console.log(obj);
        console.log(obj2);
        console.log(obj2.name);
    </script>
typeof : 运算符 帮助判断数据的类型
            返回一个字符串形式的小写的数据类型
            Number  ->   number
            String  ->   string
            Null  -> object
            Undefined -> undefined
            Boolean -> boolean
            Function    -> function
            Object -> object
         语法:
            1.typeof(数据)
            2.typeof 数据

<script>
        console.log( typeof(123) );
        console.log( typeof("123") );
        console.log( typeof(typeof("123")));
        console.log( typeof(null));
        console.log( typeof(undefined));
        console.log( typeof(false));
        console.log( typeof(function(){}));
        console.log( typeof({}));

        console.log( typeof 123);
    </script>

数据类型转换

 对象类型(函数)不参与类型转换

        分类:
            显示类型转换|强制
                任意类型(String,Number,Boolean,Null,Undefined)都可以转为以下三种类型 :
                    String(数据)
                    Boolean(数据)
                        String :
                            空串->false
                            其他包含字符的字符串->true
                        Number
                            0,NaN -> false
                            其他 -> true
                        Null
                            false
                        Undefined
                            false

                    Number(数据)
                        String
                            空串,与空格字符串 -> 0
                            纯数字字符串 -> 数字
                            非纯数字字符串 -> NaN

                        Bollean
                            true -> 1
                            false-> 0
                        Null -> 0
                        Undefined -> NaN

            隐式类型转换|自动
                执行某些行为操作时候,目的不是为了转型,但是在执行的时候回默认自动转型->隐式类型转换
                + - * / ...


      String(数据) 把参数数据转为字符串类型
        在数据的前后+一对引号

 //隐式类型转换
        console.log('a'-1);  //NaN
        console.log(false-1);  //-1
        console.log(true+false);  //1

逻辑运算符
            java中要求逻辑运算符左右两边的表达式必须结果为boolean类型
            js中,两边的表达式可以为任意类型
                && : 当两边出现非boolean类型,第一个操作数转为boolean如果为false,最终的结果就是第一个操作数,如果为true,最终的结果为第二个操作数
                || : 当两边出现非boolean类型,第一个操作数转为boolean如果为false,最终的结果为第二个操作数,如果为true,就为第一个操作数
 

 数组[]: 存储多个数据
            长度可变,可以存储任意类型的数据

        创建方式:
            1.new Array()
                创建空数组
           2.new Array(值1,值2,值3...);
                创建数组并赋值
            3.[值1,值2,值3...] -> 推荐

数组的遍历:
            普通for
            for in
            foreach
        数组的常用方法:
    -->
        var arr = ["red","green","yellow","pink","black"];

        //for
        for(var i = 0;i<=arr.length-1;i++){
            console.log(arr[i]);
        }

        //for .. in
        for(var i in arr){
            console.log(arr[i]);
        }

        //foreach
        arr.forEach(function (value,index) {
            console.log(value+"--->"+index)
        });

js中的函数 : 封装功能
            1.函数声明
                function 函数名(参数列表){
                    函数体;
                }

                调用: 执行函中的代码
                    1.函数名(实参);
                    2.转为函数表达式然后通过最后添加(实参)的方式调用
                        在函数声明的前面添加+|-|~|!或者前后添加一对()

            2.函数表达式
                var 变量名 = function (参数列表){
                    函数体;
                };
                函数表达式中的函数名作用只有一个,在递归使用的时候有用,否则默认一般省略
                调用:
                    1.变量名(实参);
                    2.函数表达式后面直接添加(实参),在当前直接调用

            注意:
                1.参数个数可以不同,函数没有传递实参,默认undefined
                2.函数都存在返回值,没有显示定义return关键字返回结果,默认返回值为undefined

 <script>
        /*函数声明*/
        function fun1(name){
            console.log("我的名字是"+name);
            return name+"haha";
        }
        //输出函数的返回值
        console.log(fun1("马龙","张继科"));

        //函数表达式
        var f1 = function fun2(i){
            console.log("我是函数表达式1-->"+i);
            if(i==5){
                return;
            }
            fun2(++i);
        };
        //函数表达式调用1
        f1(1);

        //函数表达式调用2
        var f2 = function(x){
            console.log("函数表达式2");
        }(1);

        /*函数声明的其他调用方式*/
        ~function fun2(){
            console.log("函数声明2");
        }();
        +function fun3(){
            console.log("函数声明3");
        }();
        -function fun4(){
            console.log("函数声明4");
        }();
        !function fun5(){
            console.log("函数声明5");
        }();

        (function fun6(){
            console.log("函数声明6");
        })();
    </script>
  js是值传递 | 引用传递(地址值传递)
        js中的作用域 : 函数为单位
        js中的函数可以任意嵌套
        函数存在作用域的提升: 函数声明的方式会发生作用域的提升
        变量的作用域提升: 把当前的变量的声明提升到当前作用域的最上面
        当在函数中省略var关键字定义的变量,成为全局变量,但是事前要求这个函数至少被调用过一次
 

this绑定对象
            this的决策树:
                1.this所在的函数,是否是通过new关键字调用的,如果是this,绑定new的对象
                2.this所在的函数是否是通过对象.函数名()调用的,如果是函数中的this绑定.前面调用的对象
                3.没有显示的通过某一个对象调用,默认this指代全局window对象,默认通过window调用,window.可以省略

            注意:
                定义在全局位置的变量和函数,默认为window对象的属性和功能,调用的时候window.可以省略

<script>
        function fn(){
            console.log(123);
        }
        fn();
        window.fn();

        /*全局变量*/
        var str = "希望疫情立即结束!!!";
        console.log(str);
        console.log(window.str);

        //自定义的模板
        function Person(name,age){
            this.name = name;
            this.age = age;
        }

        var person = new Person("zhangsan",18);
        console.log(person);

        var a = 1;

        var obj = {
            a : 10,
            fn : function(b){
                console.log(this.a+"---->"+b);
            }
        };

        obj.fn(100); //10-->100
        var f = obj.fn;
        f(); //1-->undefined

        var obj2 = {
            a : 12
        };

        /*修改this的引用指向*/
        obj.fn.call(obj2,100);  //调用的方法多个实参作为call方法的第二个参数开始
        obj.fn.apply(obj2,[1000]); //调用的方法多个实参作为apply方法的第二个参数,以数组为单位
    </script>
内置对象:

Arguments 只在函数内部定义,保存了函数的实参

Array 数组对象

Date 日期对象,用来创建和获取日期

Math 数学对象

String 字符串对象,提供对字符串的一系列操作

 <script>
        function func(x,y,z){
            console.log(x,y,z);
            console.log(arguments);
            for(var i  in arguments){
                console.log(arguments[i]);
            }
        }

        func(1,2,3);

        //字符串对象
        var str = "abcb";
        console.log(str.length);
        console.log(str.indexOf('b'));

        /*随机数*/
        console.log(Math.random() );

        /*日期*/
        var date = new Date();
        date.setFullYear(2028);
        console.log(date.getFullYear());
        console.log(date.getMonth());
        console.log(date.getDay());
    </script>