js第一周学习

196 阅读9分钟

day1

   # JavaScript概述
        什么是:简称js,是一个运行在【js解释器】中的一个【解释型】【弱类型】【面向对象】的脚本语言。
        1.js解释器:
            1.浏览器自带js解释器
            2.以后我们确实也会自己安装一个js解释器-node.js
        2.编译型:在运行程序前,需要先检查程序是否报错,如果有报错直接不运行,比如:Java,C#,c++ --较为严格
          解释型:在运行程序之前,不需要检查程序是否报错,直接运行,碰到错误了才停止,比如:JavaScript,PHP--较为自由
        3.弱类型:变量想保存什么数据类型就保存什么数据类型,由数据决定了数据类型是什么,比如:JavaScript,PHP--自由
          强类型:变量能保存什么数据类型,需要提前声明出来,由数据类型来决定能保存什么的数据是什么,比如:Java,c--严格


    # JavaScript特点:
        1.用任何文本编辑器编写代码:HBuilder,VSCode,记事本开发都可以
        2.解释型
        3.弱类型
        4.面向对象:以后我们会经常见到带有一种写法:万物皆对象
                对象名.属性名;
                对象名.方法名();
    # JavaScript如何使用:
        1.js的引入方式有两种:
                1.在HTML中书写一个script标签: -仅用于测试使用

                                ```<script>
                                    js代码
                            </script>
                                ```
                 2.创建一个xx.js文件,再在HTML进行引入---正式开发
                             如何引入:<script src="xx.js">不能在这里面书写js代码</script>
          2.打桩输出:疯狂打桩:非常重要的一种找错方式:31.在控制台输出日志:console.log();
                  2.在页面输出:document.write();
                  3.在弹出框输出:alert();
          3.变量和常量:
              变量:简单来说就是一个值能变化的数据/量
                  何时:如果以后某个数据我们要反复使用,最好把它先保存成一个变量,以后只需要使用变量名相当于就是在使用变量里对的数据/量
                  语法:var 变量名=值;
                  特殊:
                      1.面试题:内存和变量有区别么?
                          硬盘:保存数据/文件,机械盘和固态盘
                          CPU:中央处理器--用于计算的
                          内存:是程序在运行过程中【临时】用到的数据空间
                              内存空间:时机保存数据的地方
                              内存地址:内存空间的门牌号
                      2.变量名其实不是随便的
                          1.不能以数字开头
                          2.建议:尽量的要见名知意
                          3.使用驼峰命名
                          4.name是一个关键字,不管你保存的数据类型是什么,都会转为字符串
                          5.千万不要把关键字当做变量名
                      3.如果你想要创建多个变量,没有必要每个都写var 可以用逗号隔开,最后分号结尾
              常量:一旦创建,直就不允许修改了
                  语法:const 常量名=值;
          4.算术运算符:+,-,*,/,%:前四个用法和数学差不多,
                  %:取余,俗称模,两数相除,不取商,而取除不尽的余数
                      作用:
                          1.判断奇偶性
                          2.取出一个数字想要的后n位
                              1234%10-->4
                              1234%100-->34
                              1234%1000-->234
                  特殊:
                      1.算数运算符具有隐式转换,默认:都是转为数字在运算
                          特殊在+运算,如果碰到了一个字符串,两边都会变成字符串进行拼接
                         2.-*/%:其实字符串也能转为数字,但是前提是一个纯数字,但凡包含一个非数字字符,则为NaN:纯粹的垃圾:Not aNumber :直译:不是一个数字,但是确实是一个数字类型,但不在三界之中
                         NaN:全是缺点:1.NaN参与任何算数运算结果认为NaN
                                         2.NaN参与任何比较运算结果都为false
        5.数据类型:
            原始/基本/值类型:51.String---字符串,取值有无数个,但是必须用“”包裹
                2.Number---数字,取值有无数个,直接书写
                3.Boolean---布尔,取值只有两个(true或false)
                4.Undefined ---变量如果声明了,但是没有赋值的话,默认值就为underline,只有这一个取值(没有什么用处)
                5.Null---空,取值只有一个null ,释放内存/变量
             引用/对象类型:11个对象(属性和方

day2

# 数据类型的转换:[一切的页面上获取的数据类型都是字符串]
    JavaScript是一个弱类型的语言
    由数据决定了我们的数据类型是什么
        1		number
        "1"		string

        number + number = number
        string + number = string
    查看数据类型:typeof();
    1.隐式转换:程序内部的转换
        算术运算符具有隐式转换
           作用:我们如果精通了隐式转换,跟本不需要console.log()就能知道结果
                默认:都是转为数字,再运算
                特殊:1.不管是什么运算,只要没碰上字符串,都会隐式转换为数字进行运算
                    true->1
			false->0
			undefined->NaN
			null->0
                    2.+运算并且碰上字符串,则为拼接,最后结果为字符串
                    3.-*/%,就算是字符串1也会隐式转换为数字,前提是纯数字字符串,否则最后的结果为NaN
                    NaN:不是一个数字 ,但是确实是数字类型,只不过不在三界之中
                        全是缺点:1.不大于,不小于,不等于任何值,包括自己
                        2.参与任何算数运算+-*/%,结果仍为NaN
                      问题:正是因为NaN参与任何比较运算结果都为false,甚至自己都不等于所以我们没办法用一个普通的比较运算来判断X是不是NaN
                      解决:!isNaN(x):此方法不管你放的X是什么,都会隐式转换为数字
                          true->说明是一个有效数字
                          false->说明是一个NaN
                       目的:防止用户恶意输入,但是目前为止,只能防止数字
     2.显式转换:也叫作强制转换:
         何时使用:隐式转换出来的结果不是我们想要的,先强制转换为需要的,再计算
         如何使用:
             1.转为字符串:
                 var str=xx.toString();//xx不能是undefined和null,undefined和null不能使用,操作
                 因为页面上获取的数据都是字符串,所以几乎用不上此方法
              2.转为数字类型:
                  1.parseInt(x);-parse 解析 int 整型
                      执行原理:从左向右依次读取每个字符,直到遇到不认识的字符停止
                      去掉单位
                   2.parseFloat(x);
                       执行原理:几乎和parseInt一致,但是认识第一个小数点
                   3.Number(x);隐式转换的底层原理


   # 函数
       function:自定义函数:也称之为方法:需要【预定义好】的,可以反复使用的一个代码段
       rotate()-完成了一个根据角度制顺时针旋转45度的功能
       js中的函数---完成了一个。。。的功能
       1.创建函数:
           function 函数名(){
                   代码段;//若干操作
               }
        2.调用函数:
            1.直接在js中程序员写几次调用,就会执行几次操作 ----函数名();
            2.让用户来自己触发:
                <elem onclick="函数名()"></elem>
        3.以后何时使用函数:
            1.每次写完代码段都要封装成一个函数,因为函数的js优先性最高,属于第一等公民
            2.不希望一打开页面就执行
            3.能够反复执行
            4.他是独立的功能体
            5.不用自己释放内存,哈数调用完会自动释放内存
         4.带参函数:
             语法:形参:其实就是一个变量名,不需要var
                 function 函数名(形参,...){
			函数体;
		}
              调用:实参:实际参数
                       函数名(实参,...);

		function zwjs(name,age,hobby){
			console.log("我的名字叫"+name+",今年"+age+"岁,喜欢"+hobby);
		}
		zwjs("张三丰",128,"打太极");
		zwjs("张无忌",18,"撩妹");
		zwjs("张三",28,"说法");	
                特殊:实参的个数以及顺序 和 形参的个数以及顺序一致
           5.普通函数:操作永远是固定的
               带参函数:根据传入的实参,执行略微不同的操作
               
               
# 3.分支结构
    1、代码流程控制语句:
	1、顺序结构:默认的,代码从上向下

	2、分支结构:根据条件不同,选择部分代码执行

	3、循环结构:根据条件满不满足,考虑要不要再执行一次相同 或 相似代码

2、关系/比较运算符:> < >= <= == !=
	结果:一定都是一个布尔值

	注意:==才叫比较		=叫赋值:右边的东西放到了左边保存起来

3、逻辑运算符:
	&&:与(并且):全部条件都满足,结果为true
			只要有一个条件不满足,结果为false

	||:或:全部条件都不满足,结果为false
		只要有一个条件满足,结果为true

	 !:颠倒布尔值

4、分支的语法:
	1、一个条件一件事,满足就做,不满足就不做
		if(条件){
			操作
		}

	2、一个条件两件事,满足就做第一件,不满足就做第二件
		if(条件){
			操作;
		}else{
			默认操作;
		}

	3、多个条件多件事:满足谁就做谁
		if(条件1){
			操作1;
		}else if(条件2){
			操作2;
		}else if(条件3){
			操作3;
		}else{
			默认操作;
		}

	else可以省略,但是不推荐
            
            

day3

# 1.循环结构:
    反复执行相同 或相似的代码
        循环三要素:
            1.循环条件:从哪里开始,到哪里结束
            2.循环体:操作-要做什么事
            3.循环变量,变量要变化
      1.while循环:其实循环从宏观上看是一起执行的,但是微观上是一次次执行的
      语法:
          var 循环变量=几;
             while(循环条件){
                 循环体;
                 循环变量变化
                 }
        执行原理:先判断循环条件满足与否,如果为true,则执行,如果为false 则停止
        特殊:死循环:永远不会结束的循环,但是真有用:往往不确定循环次数的时候就会用到死循环
        while(true){
		循环体;
	}
             往往死循环还要搭配上退出语句break;只能写在循环最后
        2.for循环:执行原理和while一样,只是语法更加简洁
            for(循环变量的创建;循环条件;变量的变化){
	循环体;
}
        特殊:1.循环变量的创建和循环变量的变化,其实可以写多个
            2.死循环:for(;;){}
    总结:1.while:语法更加繁琐,建议只用于不确定循环次数的时候---死循环
            2.for:语法更为简洁,建议只用于确定循环次数的时候---大部分情况
    问题:函数 和 循环都是可以反复执行的,区别在哪里
            函数:要么程序员调用几次,执行几次,或者用户触发几次执行几次
            循环:程序员写好的,而且几乎是一瞬间执行完毕
# 2.数组
    1.创建数组:
        1.直接创建:var arr=[];//空数组
            var arr=[元素,。。。。];
        2.构造函数方式:var arr=new Array();//空数组--个人不推荐使用
    2.访问/获取:获取出数组中某个元素
            数组名[下标]
    3.添加/覆盖:数组名[下标]=新元素;
            特殊:1.下标处没有元素,则为添加
               2.下标处有元素,则为覆盖/替换
     4.数组的三大不限制:
         1.不限制元素类型
         2.不限制元素个数
         3.不限制下标越界--算是一个缺点
             获取时--下标越界,返回undefined
             添加时 - 下标越界,会变成稀疏数组,导致下标不连接
     5.数组有一个唯一的属性:数组名.length; - 获取数组的长度
             三个固定套路:
                 1.向末尾添加元素:arr[arr.length]=新元素;
                 2.获取倒数第N个元素:arr[arr.length-n];
                 3.缩容:删除末尾n个元素:arr.length-=n;
      6.其实经常我们不会拿出数组中的某一个来做操作,往往是拿出所有元素来做操作
          遍历数组:将数组中的每一个元素取出来执行 相同 或 相似的操作
          公式:
              for(var i=0;i<arr.length;i++){
                  arr[i];//当前次元素
                      }

day4

# 1.JavaScript其实是由三部分组成:
    1.ECMAScript(3/5/6)-核心语法:经常性做算法题,语法很关键-内功心法
    2.DOM--Dociment Object Model:文档对象模型
    3.BOM - Browser Object Model:浏览器对象模型
    
# 2.DOM概述:Document Object Model:文档对象模型 - 操作文档(html/css)
    DOM树:DOM将HTML看做了一个倒挂的树状结构:树根其实是一个document对象
            document对象:不需要我们创建,一个页面自带一个document 
            作用:只要是对象一定有两个东西(属性和方法):提供了我们找到&操作元素的方法
            
    
# 3.查找元素:
    1.通过HTML特性去查找元素
        1.通过id查找元素:
            var elem=document.getElementById("id值");
               特殊:1.如果有多个相同id,只会找到返回第一个 - id是唯一不重复的
                   2.返回的结果:<li id="li">油条</li> - 这个才能称之为叫做一个DOM元素/节点/对象。
                   3.前端一般不能用id - id一般是留给后端使用,而且id也不好用
         2.通过class名查找元素:
             var elems=ducoment/parent.getElementsByTagName("class名");
             特殊:1.返回的结果:不是一个DOM元素/节点/对象,是一个DOM集合,是不能直接用于任何操作的
                     解决:要么用下标拿到某一个,要么遍历拿到每一个
                  2.parent:代表的是你已经找到的某个父元素
     2.通过关系 获取元素:前提:至少要先找到一个元素:
         父元素:elem.parentNode; - 单个元素
         子元素:elem.children; - 集合:集合不能直接操作
         第一个子元素:elem.firstElementChild;
         最后一个子元素:elem.lastElementChild;
         前一个兄弟元素:elem.previousElementSibling;
         后一个兄弟元素:elem.nextElementSibling;
      *****注意:单个元素找到的就是单个元素,没找到的是null
              多个元素找到了是一个集合,没找到是[];**


# 4.操作元素:<div class id title href style="样式">内容</div>
    1.内容:
        1.innerHTML:获取 或 设置元素的内容部分,并且能够识别标签
                获取:elem.innerHTML;
                设置:elem.innerHTML="新内容";
        2.innerText:获取 或 设置元素的文本部分,不能识别标签
                获取:elem.innerText;
                设置:elem.innerText="新文本";
        以上两个是对双标签使用
        
        3.value:获取 或 设置 input的内容部分
                 获取:input.value;
                 设置:input.value="新文本";
                 
     2.属性:
         1.获取属性值:elem.getAttribute("属性名");
             简化版:elem.属性名;
         2.设置属性值:elem.setAttribute("属性名","属性值");
             简化版:elem.属性名=“新属性值”;
      简化版虽然简单,但是有缺陷
          1.class必须写为className
          2.只能操作标准属性,不能操作自定义属性
        个人建议:优先使用简化版,简化版满足不了,再用标准版做补充
      3.样式:
          样式有三种使用方式:
              1.内联
              2.内部
              3.外部 - 符合内容HTML和样式JS的分离原则
            更喜欢操作内联样式:
                1.内联样式的优先级最高 - 保证我们js写的样式必然生效
                2.只会操作当前元素 - 不会牵一发而动全身
            如何:
                获取:elem.style.css属性名;
                设置:elem.style.css属性名=“css属性值”;
                    特殊:1.设置css属性名如果有横线要去掉横线,变为小驼峰命名
                    2.获取只能获取到内联样式 - 忍忍就过去了
            ** 获取:往往用于判断
             设置:其实就是修改**
    
# 5.绑定事件:
    符合内容HTML与央视css与行为JS的分离原则
     单个元素:
         elem.onclick=function(){
                 this - >就是绑定事件的这个元素
                         }
     多个元素:
         for(i=0;i<elems.length;i++){
                 elems[i].onclick=function(){
                     this - >是当前触发事件的元素
                             }
                                 }
                                 
                                 
                                 

1个小练习

// 开关门效果 `
...

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. </p>
</div>

	<script>
  //找到按钮

var btn=document.getElementsByTagName("button")[0]; //找到div var div=document.getElementsByTagName("div")[0]; //给按钮绑定点击事件 btn.onclick=function(){ //判断按钮上的颜色,如果是白色 if(btn.style.background=="rgb(255,255,255)"){ //div显示出来 div.style.display="block"; //按钮颜色变为灰色 this.style.background="#ccc"; }else{//如果不是白色 //div隐藏起来 div.style.display="none"; //按钮颜色变为白色 btn.style.background="#fff";

} }

</script>   `