javaScript第一周

101 阅读6分钟

JavaScript:

      简称JS,是一门运行在浏览器、客户端的解释型、解释型、弱类型、面向对象型的脚本语言。

运行环境:

     1、浏览器自带js解释器
     2、node.js需要安装环境

编译型:

    会在运行之前检查有没有报错,如果有报错直接不执行。如:Java、c++c#等
    

解释型:

   在运行之前不会检查有没有报错,直接运行,遇到有报错的地方停止。如:JavaScript、node.js等

弱类型:

  在创建变量时,想放入什么数据就放入什么数据,非常自由。
  

强类型:

  在创建变量时,要先规定好要放入的数据类型,才能往里面方式数据。

js的运行方式:

        1、在html页面找一个位置,创建一个<script></script>,在里面编写你的js代码。
        2、在外部创建js文件,在文件里面写入你的js代码,在html中引入
        

打桩输出的三种方式:

            1、在控制台输出:console.log();
            2、在页面输出:document.write();
            3、警告框弹出:alert();

js注释:

  作用:方便以后的日常维护
  单行注释://
  多行注释/**/
  

变量和常量:

   硬盘:外部存储器:外存,保存文件/数据
   CPU:中央处理器,计算机速度
   内存:内部存储器,保存的是应用程序在执行过程中,所需要的用到的数据,变量其实就是一个内存,变量名就是内存地址。
   
变量:可以保存数据,如数据繁琐可以使用变量名,就相当于是在使用变量的值,变量的值是可以改变的。
何时使用:只要反复出现反复使用的,都要先保存在变量之中。
语法:var 变量名=变量值
注意:
  1、变量名不是随意的,不能是数字开头,可以数字结尾。起名最好能见名思意,不能使用关键字名。
  2、可以简写,后面的值用逗号隔开
常量:一但创建,值不可以修改
语法:const=常量值

数据类型:

1、原始、基础、值类型:51number:数字类型,取值有无数个
   2string:字符串类型,取值有无数个
   3Boolean:布尔类型,取值有两个true、flase,一半做判断时出现
   4null:空类型,释放你不要的内存、变量
   5、undefiend:没什么实际意义

运算符:

赋值运算:=
算数运算:+ - * / %
   特殊:% 取余,俗称模,两个数相除,不去商,除不尽的余数
   作用:最大的作用就是用来判断奇偶数
   算术运算都有隐式转换:都是转换成数字在运算
   特殊:+运算,只要碰到一个字符串,两边都会转换成字符串,+运算不在是+运算而是变成了拼接

数据类型的转换:

     隐式转换:将两边的转换为数字类型在进行运算
     特殊:+运算会将两边的转换为字符串进行拼接
  - * /%都可以转换为数字前提是两边的为纯数字,但凡包括了一个非数字类型结果都为NAN
NAN:not a number,不是一个数字但又是数字类型,不是一个有效数字
  有两个缺点:1、NAN参与任何计算结果都为NAN
              2、NAN参与任何比较运算结果都为flase,带来一个问题:我们没有办法用普通的比较运算来判断x是否为flase。
              解决方法:!NAN():
    显示强制转换:隐式转换出来不是我们想要的,我们可以手动调用一些方法,强制转换为我们想要的数据
           1、字符串:var str=x.string();//x不能是undefined和null,undefined和null不能使用点.去访问任何东西......页面上一切东西都是字符串
           2、转数字:31parenInt(ste/num);parse:解析    Int:整数
                 原理:专门为字符串小数转换为整数数字准备的,从左往右依次读取每个字符,碰到非数字字符就停止转换,一开始就碰到非数字字符,则无NAN,不认识小数点
                 2、parseFlase(str);parse:解析    flase:浮点型,小数
                 原理:和parseInt差不多,但是只认识第一个小数点
                 3、Number(any);任何类型都可以转化为数字类型,完全等效于隐式转换
                 
                 

function()函数:

        function:函数也称之为方法,要提前预定义好的,以后就可以重复使用的代码段
        
   如何使用:1、创建函数:
                  function 函数名(){
                       若干操作/代码段;
                  }
            2、调用函数:
                  函数名();
                  
            注意:1、程序员在js里面写死的,调用几次就会执行几次
                 2、交给用户来触发,只需要在某个元素上绑定点击事件
                   <elem.onclick="函数名()">内容</elem>
      带参数的函数:
              创建:形参:形式参数,其实就是一个变量,但不用写var,而且默认保存的是unedfined
              function 函数名(形参,....){
                          若干操作/代码段;
              }
              调用:实参:实际参数,真正的值,需要在你调用的时候从外部传入进去
                   函数名(实参,....);
              注意:传参的顺序要一一对应,并且数量也要对应上,不是所有的函数都要带参数,而是根据我们的需求来考虑的
              
              

分支结构:

 1、程序的控制语句:31、顺序执行:默认从上往下依次执行
               2、分支结构:通过判断条件,选择部分代码执行
               3、循环结构:通过判断条件,要不要重复执行某一块代码
 2、比较运算符:> < >= <= != ==  用于做判断用的
             结果:一定是一个布尔值
 3、逻辑运算符:
              &&:与、并且,要求条件都满足,结果才为true
                            只要有一个不满足结果为flase
              ||:或者,要求条件都不满足,结果才为flase
                            只要有一个条件满足结果为true
              !:颠倒布尔值
 分支语法:
          一个条件一件事,满足就做不满足就不做
            if(条件){操作}
          一个条件两件是,满足就做第一件,不满足就做第二件
            if(条件){操作1}else{默认操作}
          一个条件多件事,满足谁就做谁
            if(条件1){操作1}else if(条件2){操作2}else{默认操作}
            
            
            

循环:

循环结构:反复执行相似或者相同的操作
 循环三要素:
     1、循环条件:开始到结束,循环的次数
     2、记录每一次的变化,而且它一定时在不断变化的
     3、循环体:做的什么操作

1、while循环:

     语法:
        var 循环变量=  ;
        while(循环条件)
             循环体;
             循环变量,变化起来
             }
     执行原理:首先创建循环变量,判断循环条件,如果条件满足就执行一次循环,并不会结束,会回头继续判断循环,条件满足的话继续执行.........直到循环条件不满足flase时,才会退出循环。
     宏观上是一瞬间就结束了,但微观上是一次次执行的
     
     特殊:有时候需要用到死循环
           何时使用:不确定循环次数的时候
           while(true){
                 循环体;
                 }
           退出循环语句:break   只能在循环中使用,多半是搭配死循环使用
           

2、for循环:和while循环原理是一样的,但是它比while循环看上去更加整洁、简单、舒服

      语法:
      
      for(var 循环变量=几;循环条件;循环变量变化起来){
                     循环体;
                     }
      死循环:
            for(;;){
                 循环体;
                 }
      while循环和for循环有什么区别?
                 一般来说我们不确定循环次数的时候使用while循环--死循环
                 一般来说我们确定循环次数的时候使用for循环---大部分情况
                 
                 
                 

数组的基础:

       数组:创建一个变量可以保存多个数据
            数组都是线性排列的,除了第一个元素,每个元素都有唯一的前驱元素
                               除了最后一个元素,每个元素都有唯一的后继元素
            每个元素都有自己的唯一位置,称之为下标,下标从0开始到最大长度-1结束

创建数组:2种

       直接量方式:var arr=[]//空数组
                  var arr=[数据,....]
       构造函数方式:var arr=new Array();//空数组
                    var arr=new Array(数据,。。。。)

获取数组中的数据:

        数组名[i];
        

后继添加、替换元素:

        数组名[i]=数据;
        具体要看i有没有位置
        

数组有三大不限制:

        1、不限制元素的个数
        2、不限制元素的类型
        3、不限制下标越界
                   如果获取元素下标越界就会得到unedfinde
                   如果添加元素是下标越界就会得到一个稀疏数组
                   

数组有一个唯一的属性:length:长度

          语法:数组名.length;
               三个固定套路:
                                  1、向末尾添加元素:arr[arr.length]=数据;
                                  2、获取数组中的倒数第n个元素:arr[arr.length-n];
                                  3、缩容:删除数组中倒数第n个元素arr.length-=n;
                                 

往往很多情况下,我们不会把某个元素拿出来使用,而是把所有元素拿出来进行相同或相似的操作

 遍历数组:把数组中的每个元素取出来进行相同或相似的操作
           for(var i=o;i<arr.length;i++){
                          arr[i]//当前元素
                          }
                          

DOM:

Document Object Model:文档对象模型,专门用于操作html文档的,提供了一些方法

DOM树概念:

    DOMHTML看作了是一个倒挂的树状结构,但是树根不是html标签,而是document对象

      document对象:不需要程序员创建,有浏览器的js解释器自动创建,一个页面只有一个document对象
      作用:只要是对象就提供了属性和方法,找到想要的任何DOM元素、对象、节点,甚至进行操作
      DOM会将页面上的每个元素、属性、文本、注释都当作一个DOM元素、对象、节点。
      

查找元素:

   通过ID查找元素:
              var elem=document.getElementById("id名");
    特殊:
          1、如果页面有多个重复的ID,只会返回第一个
          2、没有找到,返回null
          3、ID不用找,可以直接使用
          4、最好不要使用ID,把ID留给后端使用
          
   通过标签名查找元素:
             var elems=document/parent.getElementsByTagName("标签名");
   特殊:
         1、返回值,返回了一个类数组对象,没有找到,返回空空类数组
         2、js不能直接操作DOM集合,解决:要么使用下标得到某一个元素,要么使用遍历得到每一个元素
         3、parent   代表你已经找到的某个父元素
         
   通过class名查找元素:
             var elems=document/parent.getElementsByClassName("class名");
   特殊:
         1、返回值,返回了一个类数组对象,没有找到,返回空空类数组
         2、js不能直接操作DOM集合,解决:要么使用下标得到某一个元素,要么使用遍历得到每一个元素
         3、parent   代表你已经找到的某个父元素
         
  通过关系找元素:
           前提:必须先找到一个元素才可以调用关系
           父元素:elem.parent.Node;
           子元素:elem.children;->集合
           第一个子元素:elem.firstElemetChild;
           最后一个子元素:elem.lastElementChild;
           前一个兄弟:elem.previousElementSibling;
           好一个兄弟:elem.nextElementSibling;
           

操作元素:

前提:找到元素才能进行操作
1、内容:
       
       1、innerHTML:获取和设置开始标签到结束标签之间的内容,支持识别标签
               获取:elem.innerHTML;
               设置:elem.innerHTML="新内容";
               
      2、innerText:获取和设置开始标签到结束标签之间的文本,不支持识别标签
              获取:elem.innerText;
              设置:elem.innerText="新内容";
              
     3、value:专门为input准备的
              获取:input.value;
              设置:input.vlaue="新内容";
              

2、属性:

      获取属性值:elem.getAttribute("属性名");
      设置属性值:elem.setAttribute("属性名""属性值")
      
      简化版:
             获取属性值:elem.属性名;
             设置属性值:elem.属性名="属性值";
             

3、样式:

     使用样式表的方式:
                    
                    获取:elem.style.css属性名;
                    设置:elem.style.css属性名="css属性值";
                    特殊:
                        1、css属性名,有-的地方要去除掉-,变为小驼峰命名法
                                  border-radius -> borderRadius
                        2、获取样式时,也只能获取到内联样式

4、绑定事件:

       elem.on事件名=function(){
                操作;
                this关键字:这个
                      如果单个元素绑定事件。this -> 这个元素
                      如果多个元素绑定事件,this -> 当前触发事件的元素
             }
       //一切的获取,都是为了做判断
       //一切的设置,都是在修改|添加