临近年关,开始学习JavaScript的基础,说实话,因为马上要过春节的原因,心思有点沉不下来,而且学习H5一个月了,感觉自己有点进入疲惫期,对于自己来说,静态页面效果,写起来还算比较轻松,可一接触JavaScript这一类的时候,整个人懵懵的,很多东西老师讲的时候,或者看视频的时候,我基本都能跟上,也能明白每一条代码什么意思,它的逻辑是怎样的,可是一但开始自己动手的时候,往往开头就不知道该怎么开始了,老是写着写着就忘记它的逻辑了,然后就又去看视频,看完再自己写,可最后当自己成功写下来一个样式后,发现并不是自己吃透了,而是我好像形成肌肉记忆了。。。这就很尴尬了啊。

接下来说说,我这一周所学吧:

JavaScript概述
    简称JS,是运行在【javascript解释器 或者 特定引擎中】的【解释型】【弱类型】【面向对象】脚本语言,对我来说这么复杂的东西,居然是一个人用短短7天时间就研发出来的,我跪了啊。

javascript使用

1、在HTML页面写上一个标签:
            <script>js代码 </script>

 2、创建一个xx.js文件,在里面书写js代码,最后在HTML页面引入
            <script src="xx.js文件路径"></script> 这个还没教,不过我感觉应该跟CSS是一样的。

JS的调试语句:代码运行期间,如果碰到错误,会报错,但是后续代码就不会执行了,然后就需要一个方式找到错误何在
        在控制台输出日志:console.log(XXX);老师说这个叫打桩机,目前我还没怎么发挥它的作用,估计一会我也会用来打桩吧。
       
变量:值是可以改变的
         这个东西呢,相当于就是把你经常使用的一大段代码,给它取个类名,以后用的时候就直接写类名就行了,也可以用来改变,前期用这个呢,都是用于改变给它重新赋值,然后达到想要的结果
         语法:var 变量名=值;
        同时创建多个变量可以直接把;变成,号继续写,但我老觉得会出错,我还是老实挨着写var吧。还有个常量,目前没用过,估计也不咋用。

算术运算符:+ - * / %

这个其实没啥好说的,小学都学过,除了%模这个可能突然有点不记得以为,都还好,取余多算几个数就懂了,然后就是这个+号,只要碰上一个字符串,则都变为字符串,+运算也不再+运算,变成了拼接字符串操作,*/%运算,有字符串也可以转为数字,但是必须是纯数字组成的字符串才可以,只要包含了非数字字符,结果则为NaN(NaN:Not a Number)

数据类型

1、原始/基本/值类型:5个
            1、String - 字符串,取值有无数个,必须写"" 或者 ''
            2、Number - 数字,取值有无数个,直接写个数字就行
            3、Boolean - 布尔,取值只有两个,true 或 false,多半都是用于判断比较
            4、Undefined - 取值只有一个默认值undefined,没有任何用处 - 祖师爷犯的一个错误
            5、Null - 空,取值只有一个null,作用:释放变量、内存,节约内存空间
        2、引用/对象类型:11个,每个对象都有很多的属性和方法等待我们去学习,这个还没教哦,我也不清楚啥东西。

数据转换:里面包括隐式转换和强制转换

隐式转换,就是程序自己转的,强制转换就是我可以转的

转为字符串:
        语法:var str=x.toString();//x不能是undefined和null,因为undefined和null不能使用.操作

转数字:
        var num=parseInt(str/num);  parse->解析 Int->整型/整数
           原理:从左向右依次读取每个字符,进行转换,碰到非数字字符就停止,而且不认识小数点,如果一开始就碰到了不认识的字符,结果为NaN

        var num=parseFloat(str);  parse->解析 Float->浮点数/小数
           原理:几乎和parseInt一模一样,认识小数点

以后用就用第二个float

函数:

这玩意是个关键啊

函数:也称为方法,需要【预定义】(提前创建好)后,可以【反复使用】的【代码段】(里面可以放若干代码)

创建函数并且调用函数
        第一步: 创建:function 函数名(){ 代码段 }

       第二步:
        调用:2种方式
        1、直接在js里面写 函数名(); 写几次就会执行几次

        2、绑定在页面的元素上,让用户来触发,用户触发一次就会执行一次 提升用户体验感/多了交互感
            <elem οnclick="函数名();"></elem>

带有参数的函数

创建带参数的函数:
            形参:就是一个变量名,只不过这里的变量名不需要var,并没有保存真正的值,形式参数,简称形参
            function 函数名(形参,...){函数体;}

调用带参数的函数:
            实参:实际参数,这个变量名所保存的值
            函数名(实参,...)

        一个函数可以执行相似的操作

分支结构

分支/选择结构:
       根据条件,选择一部分代码去执行

if结构:
    1、一个条件一件事,满足就做不满足就不做
        if(条件){ 操作}

    2、一个条件2件事,满足就做1不满足2
        if(条件){1}else{ 2 }

    3、多个条件多件事,满足谁就做谁
        if(条件1){1 }else if(条件2){ 2 }else{ 3 }

循环结构

循环:反复执行 【相同 或 相似】 的操作,几乎是一瞬间就完成了很多次

循环三要素:
        1、循环条件:开始、结束,重复执行的次数
        2、循环体:循环操作,干什么事
        3、循环变量:创建,并且要让他不断的改变(自增、自减),往往向着不满足循环条件在变化

while循环:
    语法:
    var 循环变量=几;
    while(循环条件){
        循环体;
        循环变量的变化;
    }
    原理:先判断循环条件,如果条件为真,则执行一次循环体中的语句,然后再一次判断循环条件,如果为真,则再执行一次循环体中的语句
     直到循环条件为假,才会退出循环
死循环:停不下来的循环,多半用于不确定循环次数的时候
        while(true){
            循环体;
        }     

循环流程控制语句:死循环多半都要搭配上一个:退出循环:break;可以出现在任何一个循环之中

一般用于 循环次数不明确的情况,死循环

for循环:和while能做的事是一模一样的,只不过语法比while更简单,看上去也更加的舒服
    语法:
    for(var 循环变量=几;循环条件;循环变量的变化){
        循环体;
    }

    特殊:1、死循环:for(;;){循环体}
          2、创建循环变量部分,也可以,隔开创建多个变量

一般用于 已经确定了循环次数的情况 - 个人推荐,语法更加的简便

就是这个东西开始让我头大了,循环过去循环过来的,头疼!!

数组:

创建数组:var arr=[];//空数组
                   var arr=[元素,元素,...];

访问数组中的元素
        数组名[下标];

添加/修改数组中元素
        数组名[下标]=新元素;

数组唯一的一个属性:length长度
        语法:数组名.length;三个固定套路:
            1、想末尾添加元素:arr[arr.length]=新值;
            2、获取倒数第n个:arr[arr.length-n];
            3、删除数组的倒数n个:arr.length-=n

遍历数组:把数组中的每一个元素都取出来执行相同 或 相似的操作
        公式:
        for(var i=0;i<数组名.length;i++){
            数组名[i];//当前次拿到的数据
        }
DOM树:

DOM将HTML看做了是一个倒挂的树状结构,树根:是一个document对象,document对象不需要我们程序员创建,由浏览器的JS解释器创建,一个页面只有一个document

 作用:提供了一些属性和方法,可以让我们程序员去操作整个DOM树(增删改查每一个DOM节点)
       DOM节点:一个标签、文本、属性、元素

查找元素
   1、通过HTML的特点去查找元素
    1、id查找:var elem=document.getElementById("id值");
       在当前DOM树中,根据元素的id,获取具体的DOM节点
       返回:找到了,返回对应的元素
         没找到,null
       特殊:1、如果页面上有多个重复的id,只会返回第一个
         2、此方法找到的是单个元素 - DOM节点是可直接用于做操作的
         2、此方法你不能使用 - 以后留给后端工程师使用

       *2、标签名查找:var elems=document/已经找到的父元素.getElementsByTagName("标签名");
       在当前DOM树中,根据标签名获取元素们
       返回:找到了,返回一个DOM集合
         没找到,空数组
       特殊:1、返回的不是一个DOM节点,而是一个DOM集合,是不能直接用来做操作的,要么使用下标拿到某一个,要么使用遍历拿到全部
         2、不一定非要从树根开始查找元素,也可以写一个你已经找到的某个父元素

       *3、class查找:var elems=document/已经找到的父元素.getElementsByClassName("标签名");
       在当前DOM树中,根据标签名获取元素们
       返回:找到了,返回一个DOM集合
         没找到,空数组
       特殊:1、返回的不是一个DOM节点,而是一个DOM集合,是不能直接用来做操作的,要么使用下标拿到某一个,要么使用遍历拿到全部
         2、不一定非要从树根开始查找元素,也可以写一个你已经找到的某个父元素

   2、节点之间的关系进行查找:前提:必须先要找到一个人,才能使用关系
    父:elem.parentNode;//单个元素
    子:elem.children;//集合
    第一个儿子:elem.firstElementChild;//单个元素
    最后一个儿子:elem.lastElementChild;//单个元素
    前一个兄弟:elem.previousElementSibling;//单个元素
    后一个兄弟:elem.nextElementSibling;//单个元素

操作元素

<标签名 属性名="属性值" style="样式">内容</标签名>
    1、内容:
      *1、innerHTML属性:获取 或 设置 某个元素的内容,并且可以识别标签
        获取内容:elem.innerHTML;
        设置内容:elem.innerHTML="新内容";

       2、innerText属性:获取 或 设置 某个元素的文本,不能可以识别标签
        获取内容:elem.innerText;
        设置内容:elem.innerText="新内容";

       以上两个属性,是为双标签准备的
    
       3、value属性:专门为单标签(input)操作内容准备的
        获取内容:input.value;
        设置内容:input.value="新内容";

    2、属性:什么是属性:HTML属性:id、class、title、alt、style、type、href...只要是放在HTML标签上的都是一个属性
        1、获取属性值:elem.getAttribute("属性名");
        2、设置属性值:elem.setAttribute("属性名","属性值");

        以上两个方法有点繁琐 - 但是无敌的
        能够简化:
            1、获取:elem.属性名;
            2、设置:elem.属性名="属性值";

            缺陷:1、不能操作自定义属性,只能操作标准属性
                  2、class在ES6升级为了一个关键字,所以想要写class换为了className

    3、样式:
       1、css定义的方式:3种
        1、内联样式 - 二阶段
        2、内部样式表
        3、外部样式表 - 最适合写样式的时候使用此方法

       2、JS操作内联样式的好处:
        1、优先级最高,写的JS样式必定生效
        2、一次只会操作一个元素,不会牵一发动全身

       3、语法:
        获取:elem.style.css属性名;
        设置:elem.style.css属性名="css属性值";

        特殊:1、css属性名,要把有横线地方,换成小驼峰命名法
              2、获取的时候,代老湿只交了大家获取内联样式,不能获取样式表中的样式

元素绑定事件
    单个元素:elem.οnclick=function(){
            操作;
            this->单个元素绑定事件,this->elem绑定事件的这个元素
          }

    多个元素:for(var i=0;i<elems.length;i++){
            elems[i].οnclick=function(){
                    操作
                    this->多个元素绑定事件,this->当前触发事件的元素
            }
          }

总结:
   1、一切的获取都是为了判断
   2、一切的设置都是为了修改
   3、千万不要对着一个集合做操作,要么遍历拿全部,要么下标拿一个

上面这个太难写了,我直接复制的笔记,但这个相对于循环来说还比较好理解,只要死记住这些单词就行了