二阶段week1

103 阅读13分钟

JavaScript

1.概念:简称Js是一个运行在客户端浏览器端的【解释型】【弱类型】【面向对象】脚本语言

1.Js的运行环境:
浏览器自带Js解释器,不需要安装任何环境
Node·js需要安装一个服务器的环境
2.编译型:
在程序执行之前,需要先检查语法是否正确,如果不正确,直接不运行(严格)例如:java c++
解释型
在程序执行之前,不需要检查语法是否正确,直接运行,碰到错误就会停止后续代码(更加自由)例:JavaScript  Node·js等
3.弱类型:
变量保存的数据可以是随意的,数据类型由数据来决定(更加自由)
1  =  Number     "1"  =  字符串
强类型
变量保持的数据,由数据的类型来决定了能保存什么数据(更难/严格)
4.面向对象
以后经常会遇到的写法,这种写法就是面向对象:
                            对象名.属性名;
                            对象名.方法名();
在Js中万物皆对象,除了某两个人
特点
可以用一切编辑工具编写Js代码
解释型
弱类型
面向对象
可以做Css完成不了的效果

2.如何使用

1. 使用方式:两种

直接在HTML写一个script标签,在里面书写代码(上课时用)
    例: `<script>代码</script>`
创建一个XX.Js文件,在其中写入代码,最后加在HTML引入(正式开发时使用)
    例: `<script>此处不能再书写代码</script>`  
2.输出方式/打桩输出/检查错误:3种-给程序员自己使用
*在控制台打印输入日志:console.log(想要输出的东西) console--控制台  log--日志
在页面上输出日志:document.write(想要输出的东西) document--此HTML文档  write--写入
在浏览器自带的警告框输出日志:alert(想要输出的东西) alert--警告
3.*变量和常量
*变量:创建后,值可以再次修改
何时使用:以后反复使用到的数据,都要先提前把他保存在一个变量之中,以后反复使用变量名就相当于就是在使用变量的值
为什么:为了方便
如何使用: var 变量名=值;
特殊:1.变量名其实不是随意的:
                          1.不能以数字开头
                          2.建议使用驼峰命名法和下划线命名法
                          3.命名要尽量见名知意
     2.如果你的变量名是name,不管你保存的数据类型是什么都会悄悄的给你转为一个字符串,-name这个变量名是一个关键字
     3.变量名不能是关键字
     4.变量可以只创建,不赋值,默认值为undefined,但是undefined是个垃圾,拿来做什么都要不得
     5.如果多个变量连续创建 简写:
                               var name="阳",age=18;    
                               (,号隔开;号结束)
常量:创建后,值不允许被再次修改-(生活中不多的东西,代码中也不多,因为代码源于生活)
           例: pi  一个小时60分钟   一天12个小时
           语法:
               const 常量名=值;

3.数据类型(两大类)

1.原始/基本/值类型
*Number--数字,取值有无数个,而且数字就是直接写,不用加任何东西(控制台输出的颜色是蓝色)
*String--字符串,取值有无数个,但是必须加上""或者''(控制台输出的颜色是黑色)
*Boolean--布尔,取值只有2个:ture(真/对)  false(假/错)---一般用于当作判断条件,需要搭配分支使用(控制台输出的颜色是蓝色)
 Null--空,取值只有一个就是Null,唯一作用就是用于释放变量释放内存,但是每次都需要自己释放--有更好办法(控制台输出的颜色是灰色)
undefiend翻译过来未定义,取值一个就是undefined(控制台输出的颜色是灰色)
引用/对象类型:有11个,暂时理解为有11(属性和方法)个对象

4.运算符

1.算术运算符:+ - * / %
特殊: 
    1.%取余,俗称模,两个数相除,不取商而是取除不尽的余数
    作用:(1)*任意数%2 -判断奇偶数
         (2)取某个数字的后n位:
                             console.log(1234%100);取值34
    2.*带有隐式转换:悄悄的会将数据类型转换发生变化,默认:将左右两边都悄悄的转为数字,再运算
                        默认转换:
                                true--1
                                false--0
                                undefiend--NaN
                                null--0
                                "100"--100
                                "100px"-NaN确实可以将字符串转为数字,但是前提必须是纯数字的字符串才可以,但凡包含了非数字字符 则为NaN
   NaN全称:Not A Number:不是一个数字但是他确实是数字类型,不在三界之中,不是一个有效的数字,没有任何优点但是有两个缺点:
                (1)参与任何算术运算结果仍为NaN
                (2)参与任何比较运算结果都为false
  3.+运算符:如果碰上一个字符串,左右两边都会悄悄的转为字符串,+运算符不再是+运算符而是拼接操作
*关系/比较运算符:> < >= <= == != === !==
    何时使用:一般都会出现在分支结构之中,我们可以通过条件满足不满足,走不同得的路线
    结果:一定是一个布尔值
    带有隐式转换:默认左右两边悄悄转为数字再比较大小
    特殊:
        1.如果参与比较的两边【都是】一个字符串!则会按位pk每个字符的十六进制unicode号
        2.NaN参与任何比较运算结果都为false,怎么判断是不是NaN:(!isNaN)专门判断NaN,结果一定是一个布尔值:true--是一个有效数字   false--是一个NaN
        3.undefined==unll:结果为true    解决:===--全等
*逻辑运算符:在比较运算的基础上,再进行综合比较。
    &&:与(并且)全部条件满足--true,只要一个不满足--false
    ||:或者 全部条件都不满足--false,只要一个满足--true
    !:颠倒(非)布尔值  !true--false     !false--ture
*赋值运算符:= += -= *= /= %=
    = :赋值符号,将=右边的东西,保存到=的左边的变量之中
    后面5个可以理解为是一种升级写法,一句话两个操作 运算后再保存回变量本身
            i=i+1 == i+=1
*自增自减运算符 ++ --
    例:i++ === i+=1 === i+i+1
    自增:固定每次只能+1
    自减:固定每次只能-1
    累加:+= 每次加几由程序员自己决定
位运算
    左移:m<<n,读作m左移了n位,翻译:m*2的几次方
    右移:m>>n,读作m右移了n位,翻译:m/2的几次方
    (垃圾:底数只能是2,不可以修改)

拓展:用户输入框: var user=prompt("提示文字")

***分支结构

1.程序的流程控制的语句:3种
    顺序结构--默认:从上向下依次执行每一句话
    分支结构--通过条件判断,选择部分代码执行
    循环结构--通过条件判断,要不要反复执行某一块代码
2.如何使用
        1.if分支:3种写法
                (1)一个条件,一件事,满足就做,不满足就不做
                    if(条件){
                             操作
                            }
                (2)一个条件,两件事,满足就做第一件事,不满足就做第二件事
                    if(条件){
                            操作
                        }slse{
                        默认操作
                        }
                (3)多个条件,多件事,满足谁就做谁
                    if(条件1){
                            操作1
                         }else if(条件2){
                                        操作2
                                    }else{
                                        默认操作
                                            }
         ***注意:
            (1)分支只要满足了一条路,就不会再走别的路了,有的时候书写的顺序很重要
            (2else if 这句话想写多少句,由程序员自己决定
            (3else这句话其实可以省略不写,不推荐,如果条件都不满足,则什么都不执行
            (4)分支结构可以嵌套
        2.switch....case分支:前提:只要知道最后的结果是什么才可以用
            语法:
                swicth(变量/表达式){
                                case1:
                                操作1;
                                break;
                                case2:
                                操作2;
                                break;
                                case3:
                                操作3;
                                break;
                                default:
                                默认操作;
                             }
          注意:
              (1case的比较是不带有隐式转换的
              (2)一个case满足过后,会将后续所有的操作做完,解决:给每个后面加上关键字:break;
               建议:每个case的操作后面都可以跟上一个break,有的地方也可以不加break1.最后一个操作default可以省略break  2.如果中间多个条件,做的操作一样可以省略。
              (3default可以省略不写,不推荐,如果条件都不满足,则什么都不执行
三目运算
语法:条件?操作1:默认操作;
页面上的一切东西都是字符串

强制(显示)数据类型转换

    转字符串:2种:
                var string=X.toString();
                var str=String(x);
    *转数字:3种
                *parseInt(str/num)
                *parseFloat(str)
                 Number(x)
     转布尔:
             boolean(x);
 ***只有6个会为false0 undefined null "" NaN false 
    其余都为ture
    

循环结构* * * * *:反复执行相同或相似的操作

while循环语法:
        var 循环变量=几;
        while(循环条件){
            循环体;
            循环变量变化起来;
        }
执行原理:首先创建出了循环变量,判断循环条件,如果条件满足则执行【一次】循环体操作,并且不会退出循环,而会回过头再次判断循环条件,如果条件满足,则执行【一次】循环体操作,直到循环条件不满足,才会退出循环
while死循环语法:
        while(true){
                死循环操作
                }
for循环语法:
            for(var 循环变量=几;循环条件;循环变量变化起来){
                                                    循环体
                                                    };
for死循环语法:
            for(;;){
                循环体
                }
 执行原理:执行原理同while循环 但是更简洁 更舒服
 随机整数的公式:
     var r=parseTnt(Math.random()*(max-min+1)+min)

function--函数的基础

     概念:function--函数,也称之为方法 先【预定义】好,以后才可以【反复使用】的代码段
     使用函数:2步
             1.定义/创建/声明:
                     function 函数名(){
                             函数体/代码段;
                             }
             2.调用函数:2种
                    (1)直接在就是内容里面写:函数名();程序员写几次调用几次
                    (2)在HTML页面上绑定点击事件:
                        <button  onclick="函数名()">文字</button>用户点几次就调用几次
                        
      何时使用:
              1.不希望打开页面立刻执行
              2.希望由用户来触发
              3.每个独立的功能都要封装为函数
              4.函数的地位很高,Js第一等公民地位
     带参数的函数:
             1.创建出带有形参的函数:其实就是一个变量,只不过不需要写var 而且不需要赋值,所以称之为形式参数,简称形参
                 function 函数名(形参,..){
                         函数体
                             }
             2.使用带参数的函数时,记得必须传入实参--实际参数,就是你传递过去的值
                 使用:函数名(实参,....)
                 注意:传参的时候顺序是不能乱的,必须和形参的顺序一一对应上,数量不要多,不要少
                 总结:
                     1.不带参数的函数,用于执行一些固定的操作
                     2.带参数的函数,可以根据我们传入的实参的不同,执行的操作略微不同
总结:循环也可以反复执行,函数也可以反复执行,他们的区别在于:
                         时机不同:
                                 循环:几乎是打开网页的一瞬间就完成了
                                 函数:需要调用后才会执行的

自定义函数:需要提前预定好的,以后反复使用的一个代码段

何时使用:不希望打开页面立刻执行,以后反复使用,由用户来触发
如何使用:
        ***创建:21.*【声明方式】创建函数:
                    function  函数名(形参){
                                函数体
                                return返回值
                                }
            2.【直接量方式】创建函数:
                    var 函数名=function(形参){
                                函数体;
                                return返回值;
                                }
感受到函数名就是一个变量名,函数名要尽量的不重复,否则后面的会把前面的覆盖.
        调用:var rutrun=函数名(实参);
具体要不要拿到函数结果取决自己,希望在全局拿着函数的结果去做别的操作,记得加上return

***作用域:2种
        全局作用域:全局变量和全局函数,在页面的任何一个位置都可以访问/使用
        函数作用域:局部变量和局部函数,只能在【函数调用时,内部可用】
        使用规则:优先使用局部的,局部没有就找全局,全局没有就报错
        特殊点:也是缺点
        (1)局部可以使用全局的,但是全局不能使用局部的。解决:加上return2)千万不要在函数中对着未声明的变量赋值--导致全局污染
***重载:相同的函数名,根据传入的实参的不同,自动选择对应的函数去执行但是Js不支持,如果函数名重复了后面的肯定会把前面的覆盖掉
   目的:减轻我们程序员的压力,记住一个方法就可以执行多个操作
   解决:在【函数内部】自带一个arguments(类数组对象),不需要我们创建
   作用:哪怕没有写过任何形参,他也可以接收住所有实参
       固定套路:
               通过下标:arguments[i]
               通过lengtharguments.length

数组Array

    数组:创建一个变量可以保存【多个数据】数组都是线性排列的:
                除了第一个元素--每个元素都有唯一的前驱元素
                除了最后一个元素--每个元素都有唯一的后继元素
    ***每个元素都有一个自己的位置,称之为下标,下标都是从0开始的,到最大长度-1
       *创建数组:2种:
               *直接量方式: var arr(数组名)=[];//空数组
                构造函数方式:var arr(数组名)=new Array();//空数组
       *获取数组之中的数据:
               数组名[i]
       *后续添加/替换元素:
               数组名[i]=新数据
               如果下标处没数据,则为添加数据,如果下标处有数据则替换数据
       *数组三大不限
               不限元素类型
               不限元素个数
               不限制下标越界
***三个固定套路:
            获取数组倒数第n个元素:arr[arr.length-n]
            向末尾添加元素:arr[arr.length]=新元素
            缩容:arr.length-=n
    *****遍历数组:往往很多情况,我们不会拿出数组的某个数据来使用,而是拿出数组中的所有数据来进行相同或相似的操作--搭配循环
        公式:
            for(var i=0;i<arr.length;i++){
                            arr[i];//当前次 元素
                            }

* * * * *DOM:Document Object Model:文档对象模型,专门用于操作HTML文档的

DOM数概念:DOM将我们的HTML看做了是一个倒挂的结构,但是树根不是HTML标签,而是document对象
document对象:不需要程序员创建,有浏览器的Js解释器的自动创建,一个页面只有一个document树根
DOM会将页面上的每一个元素,属性,文本,注释等等都会被视为一个DOM元素/DOM节点/DOM对象
   查找元素:两大方面
      1.直接通过HTML的特点去查找元素;
         (1)通过id:
                   var elem=document.getElementByid("id值")
                   特殊:
                       不使用,留给后端
         (2)通过标签:
                   var elems=document/已经找到的某个父元素.getElementsByTagName("标签名")
         (3)通过calss名:
                   var elems=document/已经找到的某个父元素.getElementsByClassName("calss名")
       *特殊;
            1.返回值:找到了返回的是一个类数组DOM集合,没找到则返回一个空数组
            2.*Js只能操作DOM元素,不能直接操作DOM集合!
                    解决:要么下标拿到某一个,要么遍历拿到所有人
            3.不一定非要从ducument开始查找,如果document去找,会找到所有的元素,可以换成我们已经找到的某个父元素
     2.通过元素之间的关系去查找元素:前提:至少要【先找到一个元素】才可以使用关系网
         父元素:elem.parentNode;//单个元素
         
         子元素:elem.children;//集合
         
         第一个子元素:elem.firstElementChinld;//单个元素
         
         最后一个子元素:elem.lastElementChinld;//单个元素
         
         前一个兄弟:elem.previousElementSibling;//单个元素
         
         后一个兄弟:elem.nextElementSibling;//单个元素
       
      操作元素:前提就要先找到元素
              内容:
                  (1)*innerHTML--获取或设置开始标签到结束标签之间的内容【支持识别标签的】
                          获取:elem.innerHTML;
                          设置:elem.innerHTML="新内容";
                  (2)innerText--获取或设置开始标签到结束标签之间纯文本【不支持识别标签的】
                          获取:elem.innerText;
                          设置:elem.innerText="新内容";
                  (3)value--专门获取或设置input的内容的
                          获取:inp.value
                          设置:input.vlaue="新内容"
               属性:
                   *获取属性值:elem.getAttribute("属性名")
                   *设置属性值:elem.serAttribute("属性名","属性值")
                            简化版:
                                elem.属性名;
                                elem.属性名="属性值";
                                缺点:
                                    1.calss必须写为calssName
                                    2.只能操作标准属性,不能操作自定义属性
                                     
               样式:
                   获取样式:elem.style.css属性名;
                   设置样式:elem.style.css属性名="css属性值";
                       特殊:
                           1.css属性名,有横线的地方,去掉横线,换为小驼峰命名法。
                           2.小缺陷:获取时,只能获取内联样式;
                *绑定事件:
                    elem.onclick=function(){
                                操作;
                                ***关键字:this这个关键字,目前只能在【事件】内部使用
                                如果单个元素绑定事件,this--这个元素
                                如果多个元素绑定事件,this--这个元素
                             }
                    
                    
                    一切的获取,都是为了判断
                    一切的设置,就是修改