diff --git "a/53 \345\276\220\345\205\210\351\221\253/2023.12.14 JavaScript \347\254\224\350\256\260.md" "b/53 \345\276\220\345\205\210\351\221\253/2023.12.14 JavaScript \347\254\224\350\256\260.md"
new file mode 100644
index 0000000000000000000000000000000000000000..720b58cb96183ec9e86e0d32f895cd1999b3a484
--- /dev/null
+++ "b/53 \345\276\220\345\205\210\351\221\253/2023.12.14 JavaScript \347\254\224\350\256\260.md"
@@ -0,0 +1,782 @@
+### 变量
+
+//声明变量
+let 变量名
+//变量赋值
+变量名 = 值
+let 变量名 = 值
+let不可多次声明同一个变量
+//声明多个变量
+let 变量名 = 值,变量2 = 值2...
+
+# 变量命名规则与规范
+
+规则:
+1.不能用关键字
+2.只能有字母,数字,下划线_,$ 组成,且数字不能作为开头
+3.字母严格区分大小写
+规范:
+1.见名知意
+2.小驼峰命名法
+
+# let与var的区别
+
+1.var可以先使用,再声明
+2.var可以重复声明一个变量
+
+### 不使用第三方变量完成交换
+
+n1 = n1 + n2; 300=100+200
+n2 = n1 - n2; 100=300-200
+n2 = n1 - n2; 200=300-100
+
+# 数据类型
+
+Number 数字类型
+JavaScript中的正数,负数,小数等统一称为数字类型
+let num = 10;
+let num2 = 10.12;
+infinity 无穷大,由 n/0 得出
+NaN 不是数字代表一个计算错误,例如"小明"-2,任何对NaN操作的数都得NaN
+Number.MAX_VALUE 范围的最大值
+Number.MIN_VALUE 范围的最小值
+isNaN(数
+String 字符串类型
+通过单引号,双引号或反引号包围的数据都叫字符串,单引号双引号无区别
+let uname = '闪电'
+let ename = "秀六根"
+无论引号还是双引号都必须成双成对
+单引号/双引号可以互相嵌套,但是不能自己嵌套自己(外双内单,外单内双)
+必要时使用转义符\,输出单引号或双引号
+转义符:\'',\,""\t 制表, \n 换行
+字符串拼接的+号,从左到右,+号左右两边只要有字符串就一定是拼接效果
+字符串拼接,除了用+号,还可以用反引号将所有字符串包围起来,然后用 ${} 来表示变量
+例: document.writr(`大家好我叫${name},今年${age}岁了`)
+boolean 布尔型
+两个固定的值,true和false
+undefined 未定义类型
+只有一个值,undefined
+只声明,不赋值的情况下,变量默认为undefined
+null 空类型
+只有一个值,仅仅是一个代表“无”,“空”或“值未知”的特殊值
+与undefined的区别:undifined表示没有值,而null表示赋值了,但内容是空
+使用场景:将来有个变量存放对象,但是对象还没创建好,可以先给个null
+object 引用类型或者复杂类型
+//js是弱数据类型,未赋值之前不知道是那种数据类型
+
+# 查看类型
+
+typeof 运算符可以返回被检测的数据类型,支持两种语法
+typeof x
+typeof(x)
+
+### 数据类型的转换
+
+隐式转换:
+某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换
++号两边只要有一个字符串,都会把另外一个转成字符串
+除了+号以外的算数运算符,比如-,*,/等都会把数据转成数字类型
+显式转换:
+类型(数据)
+Number(数据) //转成数字类型,如果字符串内容有非数字,转换失败时结果为NaN,即不是个数字
+parseInt(数据) //只保留整数
+parseFlost(数据) //可以保留小数
+补充
+--
+
+//documen中的输出语句,换行用
因为document执行区域为HTML,而在console中用换行符换行
+//``反引号,也称模板字符串,可以让字符换行,换行可以直接被保留,最重要的是反引号支持解析变量,用${变量}表示
+
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+### 常量
+
+const 常量名 = 值
+//不可二次赋值,所以在创建的时候不允许赋值与声明分开
+
+### 运算符
+
+'/'号中js会保留小数,而小数作为浮点数不精准
+3/0 Java会报错,而js不会,因为在js中0做除数是无穷大,Infinity
+
+### 赋值运算符
+
++=,-+,*=,/=,%=
+a +=b --> a = a+b
+
+### 自增(一元运算符)
+
+i++,++i,i--,--i
+先加和后加区别:
+++i:先自增在参与运算
+i++:先参与运算在自增
+两者单独使用没区别,i++用的多
+例:
+(i++ + ++i + i)=7
+
+### 比较运算符
+
+,< ,> = ,<= ,== ,=== ,!==
+
+== 为两边值是否相等
+=== 为两边的值与数据类型是否相等
+!== 为两边的值与类型都不等
+比较运算符会隐式转换为数字类型
+undefined==null,true
+undefined===null,false
+NaN 不等于任何值,包括他自己
+
+### 逻辑运算符
+
+&& 逻辑与,并且,两边都true才真
+|| 逻辑或,或者,两边都false才假
+! 逻辑非,取反
+优先级:!>&&>||
+
+### 运算符优先等级
+
+1.括号 ()
+2.一元运算符 ++ --
+3.算数运算符 先*/后+-
+4.关系运算符 > >= < <=
+5.相等运算符 == != === !==
+6.逻辑运算符 先&&后||
+7.赋值运算符 =
+8.逗号运算符 ,
+
+### 判断
+
+if 判断:
+if(条件1){
+ 满足条件执行的代码
+}else if(条件2){
+ 满足条件执行的代码
+}else{
+ 代码
+}
+三元运算符:
+条件?表达式1:表达式2
+Switch 判断:
+switch (数据){
+ case 值1:
+ 代码
+ break
+ case 值2:
+ 代码
+ break
+ ....
+ default:
+ 代码
+ break
+}
+// case 匹配的值必须值和类型全等于,所以用===
+
+### 断点调试
+
+F12,打开sources,选择代码文件
+
+### 循环
+
+循环三要素:变量起始值,终止条件(无终止条件会死循环),变量变化量(自增或自减)
+while 循环:不明确的次数时使用
+while(循环条件){
+ 循环体
+}
+for 循环:明确循环次数时使用
+for(let i = 0;i你是什么牛魔`
+
+
+
+### 操作元素常用属性
+
+常见属性如: href,title,src 等
+语法: 对象.属性 = 值
+例:
+const bon = document.querySelector('bon')
+bon.src = './imag001'
+bon.herf = 'www.baidu.com'
+
+
+
+### 操作元素样式属性
+
+1.通过style属性操作CSS
+2.操作类名(className)操作CSS
+3.通过classList操作CSS
+1.通过style属性操作CSS
+语法: 对象.style.样式属性 = '值'
+例如:
+const bon = document.querySelector('bon')
+bon.style.width = '300px'
+bon.style.backgroupColor = 'red'
+bon.style.border = '2px solid blue'
+// 修改样式通过style属性引出
+//如果有连接符-如:backgroup-color 需要转换成小驼峰命名法backgroupColor
+//赋值的时候记得CSS单位 如 px
+2.操作类名(className)操作CSS
+如果修改的样式比较多,直接用style修改比较繁琐,可以通过借助于CSS类名的形式,在CSS里写属性和值,再给某个标签赋予类名
+给元素赋予属性类名,相当于
+语法: 元素.className = '类名'
+例如:
+const bon = document.querySelector('bon')
+bon.className = 'box'
+//由于class是关键词,所以用className代替
+//className是使用新值换旧值(覆盖),所以如果需要添加一个类,需要保留之前的类名 bon.className = 'xxn box'
+3.通过classList操作CSS
+为了解决className容易覆盖以前的类名,我们可以通过classList方式追加和删除类名
+语法:
+元素.classList.add('类名') // 添加
+元素.classList.remove('类名') // 删除
+元素.classList.toggle('类名') // 切换,有就删掉,没有就添加
+例如:
+const bon = document.querySelector('bon')
+bon.classList.add('xxn') // 追加xxn类名
+bon.classList.remove('xxn') // 删除xxn类名
+bon.classList.toggle('xss') // 切换xss类名,有就删掉,没有就添加
+
+
+
+### 操作表单元素样式
+
+表单很多情况也需要修改熟悉,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框
+正常的有属性有取值的 跟其他的标签属性没有任何关系
+语法:
+获取: DOM对象.属性名
+设置: DOM对象.属性名 = 新值
+例如:
+
+const uname = document.querySelector('input')
+uname.value = '用户名'
+uname.type = 'password'
+//innerHTML得不到表单的值,所以才需要用表单.属性名
+表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示,如果为true代表添加了该属性,如果为false代表移除该属性
+例如: disabled,checked,selected
+const ipt = document.querySelector('input')
+ipt.checked = true // 勾选状态
+const button = document.querySelector('button')
+button.disabled = true //禁用按钮
+
+
+
+### 自定义属性
+
+标准属性:标签天生自带的属性,比如class,id,title等,或可以直接用.语法操作的属性,比如 disabled,checked,selected
+自定义属性:
+在HTML5中推出来专门的data-自定义属性
+在DOM对象上一律以dataset对象方式获取
+例如:
+
+1
+const one = document.querySelector('div')
+console.log(one.dataset.id) // 获取结果为1
+
+### 定时器
+
+能够使用定时器函数重复执行代码
+1.开启定时器
+setInterval(函数,间隔时间)
+setInterval(函数名,间隔时间)
+例如:
+setInterval(function(){console.log('牛魔倒计时')},1000)
+setInterval(getName,1000)
+//间隔时间单位是毫秒
+//函数名不需要加括号
+//定时器返回的是一个id数字
+2.关闭定时器
+let 变量名 = setInterval(函数,间隔时间) //定时器返回的是一个id数字
+clearInterval(变量名)
+
+
+
+
+
+### CSS选择器
+
+1.用标签做选择器,叫做标签选择器 对标签
+例如:
+h1{
+ color:red
+}
+
+这是标签
+2.用类名做选择器 对多个元素
+例如:
+.a1{
+ color:red
+}
+这是div
+这是正文
+3.用id做选择器 对单
+例如:
+#b2{
+ color:red
+}
+这是div
+
+### const常量
+
+const声明的值不能更改,而且const声明变量的时候里面需要初始化
+但是对于引用数据类型,const声明的变量,里面存的不是值,而是地址
+const指向栈地址,栈再指向堆
+所以 const a = [2]; a.push(3) 不报错
+而 a = [4] 会报错
+同样
+const b = document.querySelector('div')
+b.innerText = '321'
+指向的是'div'的位置,修改div的内容不报错
+
+可以从上往下找下级标签,中间用空格间隔,例如:
+const b = document.querySelector('.a li')
+
+
+
+
+
+### 伪类
+
+取第1个值
+例 取第一个li li:first-child
+const li = document.querySelector('.a1 li:first-child')
+取第n个值
+例 取第5个li li:nth-child(5)
+const li2 = document.querySelector('.a1 li:nth-child(5)')
+取第最后一个值
+例 取最后一个li li:last-child
+const li3 = document.querySelector('.a1 li:last-child')
+
+
+
+### 生成随机数函数
+
+function getRandom(n,m){
+ return Math.floor(Math.random() * m-n+1)+n
+}
+
+### 补充
+
+//获取元素时,建议从上级往下多级确认//innerHTML,innerText只能获取双标签,如xx
,,获取不到单标签如
+
+
+
+
+
+### 操作表单元素样式
+
+//innerHTML,innerText只能获取双标签,如xx
,,获取不到单标签如
+表单很多情况也需要修改熟悉,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框
+正常的有属性有取值的 跟其他的标签属性没有任何关系
+语法:
+获取: DOM对象.属性名
+设置: DOM对象.属性名 = 新值
+例如:
+
+const uname = document.querySelector('input')
+uname.value = '用户名'
+uname.type = 'password'
+//innerHTML得不到表单的值,所以才需要用表单.属性名
+//button比较特殊,他是双标签,可以用innerHTML,innerText
+表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示,如果为true代表添加了该属性,如果为false代表移除该属性
+例如: disabled 禁用表单元素,checked 单选框复选框打钩;下拉框选中,selected
+const ipt = document.querySelector('input')
+ipt.checked = true // 勾选状态
+const button = document.querySelector('button')
+button.disabled = true //禁用按钮
+
+
+
+### 自定义属性
+
+标准属性:标签天生自带的属性,比如class,id,title等,或可以直接用.语法操作的属性,比如 disabled,checked,selected
+自定义属性:
+在HTML5中推出来专门的data-自定义属性
+在DOM对象上一律以dataset对象方式获取
+例如:
+
+
+
+ 补充
+
+// 对象.style.display = 'none' 隐藏,用在删除广告等
+// 对象.style.display = 'block' 显示
+
+
+
+### 事件监听
+
+事件是在编程系统内发生的动作或发生的事情,比如在网页上单击一个按钮
+
+事件监听就是、让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出相应,也称为绑定事件或者注册事件,比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等
+
+语法:
+元素对象.addEventListener('事件类型',要执行的函数)
+例:
+const div = document.querySelector('div')
+div.addEventListener('click',function(){
+ document.write('打印的内容')
+})
+//相当于给div添加一个事件,这个事件可以直接调用,要加括号:
+div.click()
+事件监听三要素:
+1.事件源:那个dom元素被事件触发了,要获取dom元素
+2.事件类型:用什么方式触发,比如单击click,双击dblclick等
+3.事件调用的函数:要做什么事
+//事件监听要加引号
+//函数是点击之后再去执行,每次点击都会执行一次
+
+
+
+### 事件监听的类型
+
+鼠标事件:
+click 鼠标点击
+dblclick 鼠标双击
+mouseenter 鼠标经过
+mouseleave 鼠标离开
+键盘事件:
+keydown 键盘按下触发
+keyup 键盘抬起触发
+
+
+
+### 事件监听版本
+
+DOML0
+事件源.on事件 = function(){}
+DOML2
+事件源.addEventListener('事件',function(){})
+区别:on的方式是一个属性,可以被修改覆盖,多次定义相当于是一个变量重新赋值
+
+
diff --git "a/53 \345\276\220\345\205\210\351\221\253/2023.12.15 JavaScript \347\254\224\350\256\260 .md" "b/53 \345\276\220\345\205\210\351\221\253/2023.12.15 JavaScript \347\254\224\350\256\260 .md"
new file mode 100644
index 0000000000000000000000000000000000000000..720b58cb96183ec9e86e0d32f895cd1999b3a484
--- /dev/null
+++ "b/53 \345\276\220\345\205\210\351\221\253/2023.12.15 JavaScript \347\254\224\350\256\260 .md"
@@ -0,0 +1,782 @@
+### 变量
+
+//声明变量
+let 变量名
+//变量赋值
+变量名 = 值
+let 变量名 = 值
+let不可多次声明同一个变量
+//声明多个变量
+let 变量名 = 值,变量2 = 值2...
+
+# 变量命名规则与规范
+
+规则:
+1.不能用关键字
+2.只能有字母,数字,下划线_,$ 组成,且数字不能作为开头
+3.字母严格区分大小写
+规范:
+1.见名知意
+2.小驼峰命名法
+
+# let与var的区别
+
+1.var可以先使用,再声明
+2.var可以重复声明一个变量
+
+### 不使用第三方变量完成交换
+
+n1 = n1 + n2; 300=100+200
+n2 = n1 - n2; 100=300-200
+n2 = n1 - n2; 200=300-100
+
+# 数据类型
+
+Number 数字类型
+JavaScript中的正数,负数,小数等统一称为数字类型
+let num = 10;
+let num2 = 10.12;
+infinity 无穷大,由 n/0 得出
+NaN 不是数字代表一个计算错误,例如"小明"-2,任何对NaN操作的数都得NaN
+Number.MAX_VALUE 范围的最大值
+Number.MIN_VALUE 范围的最小值
+isNaN(数
+String 字符串类型
+通过单引号,双引号或反引号包围的数据都叫字符串,单引号双引号无区别
+let uname = '闪电'
+let ename = "秀六根"
+无论引号还是双引号都必须成双成对
+单引号/双引号可以互相嵌套,但是不能自己嵌套自己(外双内单,外单内双)
+必要时使用转义符\,输出单引号或双引号
+转义符:\'',\,""\t 制表, \n 换行
+字符串拼接的+号,从左到右,+号左右两边只要有字符串就一定是拼接效果
+字符串拼接,除了用+号,还可以用反引号将所有字符串包围起来,然后用 ${} 来表示变量
+例: document.writr(`大家好我叫${name},今年${age}岁了`)
+boolean 布尔型
+两个固定的值,true和false
+undefined 未定义类型
+只有一个值,undefined
+只声明,不赋值的情况下,变量默认为undefined
+null 空类型
+只有一个值,仅仅是一个代表“无”,“空”或“值未知”的特殊值
+与undefined的区别:undifined表示没有值,而null表示赋值了,但内容是空
+使用场景:将来有个变量存放对象,但是对象还没创建好,可以先给个null
+object 引用类型或者复杂类型
+//js是弱数据类型,未赋值之前不知道是那种数据类型
+
+# 查看类型
+
+typeof 运算符可以返回被检测的数据类型,支持两种语法
+typeof x
+typeof(x)
+
+### 数据类型的转换
+
+隐式转换:
+某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换
++号两边只要有一个字符串,都会把另外一个转成字符串
+除了+号以外的算数运算符,比如-,*,/等都会把数据转成数字类型
+显式转换:
+类型(数据)
+Number(数据) //转成数字类型,如果字符串内容有非数字,转换失败时结果为NaN,即不是个数字
+parseInt(数据) //只保留整数
+parseFlost(数据) //可以保留小数
+补充
+--
+
+//documen中的输出语句,换行用
因为document执行区域为HTML,而在console中用换行符换行
+//``反引号,也称模板字符串,可以让字符换行,换行可以直接被保留,最重要的是反引号支持解析变量,用${变量}表示
+
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+### 常量
+
+const 常量名 = 值
+//不可二次赋值,所以在创建的时候不允许赋值与声明分开
+
+### 运算符
+
+'/'号中js会保留小数,而小数作为浮点数不精准
+3/0 Java会报错,而js不会,因为在js中0做除数是无穷大,Infinity
+
+### 赋值运算符
+
++=,-+,*=,/=,%=
+a +=b --> a = a+b
+
+### 自增(一元运算符)
+
+i++,++i,i--,--i
+先加和后加区别:
+++i:先自增在参与运算
+i++:先参与运算在自增
+两者单独使用没区别,i++用的多
+例:
+(i++ + ++i + i)=7
+
+### 比较运算符
+
+,< ,> = ,<= ,== ,=== ,!==
+
+== 为两边值是否相等
+=== 为两边的值与数据类型是否相等
+!== 为两边的值与类型都不等
+比较运算符会隐式转换为数字类型
+undefined==null,true
+undefined===null,false
+NaN 不等于任何值,包括他自己
+
+### 逻辑运算符
+
+&& 逻辑与,并且,两边都true才真
+|| 逻辑或,或者,两边都false才假
+! 逻辑非,取反
+优先级:!>&&>||
+
+### 运算符优先等级
+
+1.括号 ()
+2.一元运算符 ++ --
+3.算数运算符 先*/后+-
+4.关系运算符 > >= < <=
+5.相等运算符 == != === !==
+6.逻辑运算符 先&&后||
+7.赋值运算符 =
+8.逗号运算符 ,
+
+### 判断
+
+if 判断:
+if(条件1){
+ 满足条件执行的代码
+}else if(条件2){
+ 满足条件执行的代码
+}else{
+ 代码
+}
+三元运算符:
+条件?表达式1:表达式2
+Switch 判断:
+switch (数据){
+ case 值1:
+ 代码
+ break
+ case 值2:
+ 代码
+ break
+ ....
+ default:
+ 代码
+ break
+}
+// case 匹配的值必须值和类型全等于,所以用===
+
+### 断点调试
+
+F12,打开sources,选择代码文件
+
+### 循环
+
+循环三要素:变量起始值,终止条件(无终止条件会死循环),变量变化量(自增或自减)
+while 循环:不明确的次数时使用
+while(循环条件){
+ 循环体
+}
+for 循环:明确循环次数时使用
+for(let i = 0;i你是什么牛魔`
+
+
+
+### 操作元素常用属性
+
+常见属性如: href,title,src 等
+语法: 对象.属性 = 值
+例:
+const bon = document.querySelector('bon')
+bon.src = './imag001'
+bon.herf = 'www.baidu.com'
+
+
+
+### 操作元素样式属性
+
+1.通过style属性操作CSS
+2.操作类名(className)操作CSS
+3.通过classList操作CSS
+1.通过style属性操作CSS
+语法: 对象.style.样式属性 = '值'
+例如:
+const bon = document.querySelector('bon')
+bon.style.width = '300px'
+bon.style.backgroupColor = 'red'
+bon.style.border = '2px solid blue'
+// 修改样式通过style属性引出
+//如果有连接符-如:backgroup-color 需要转换成小驼峰命名法backgroupColor
+//赋值的时候记得CSS单位 如 px
+2.操作类名(className)操作CSS
+如果修改的样式比较多,直接用style修改比较繁琐,可以通过借助于CSS类名的形式,在CSS里写属性和值,再给某个标签赋予类名
+给元素赋予属性类名,相当于
+语法: 元素.className = '类名'
+例如:
+const bon = document.querySelector('bon')
+bon.className = 'box'
+//由于class是关键词,所以用className代替
+//className是使用新值换旧值(覆盖),所以如果需要添加一个类,需要保留之前的类名 bon.className = 'xxn box'
+3.通过classList操作CSS
+为了解决className容易覆盖以前的类名,我们可以通过classList方式追加和删除类名
+语法:
+元素.classList.add('类名') // 添加
+元素.classList.remove('类名') // 删除
+元素.classList.toggle('类名') // 切换,有就删掉,没有就添加
+例如:
+const bon = document.querySelector('bon')
+bon.classList.add('xxn') // 追加xxn类名
+bon.classList.remove('xxn') // 删除xxn类名
+bon.classList.toggle('xss') // 切换xss类名,有就删掉,没有就添加
+
+
+
+### 操作表单元素样式
+
+表单很多情况也需要修改熟悉,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框
+正常的有属性有取值的 跟其他的标签属性没有任何关系
+语法:
+获取: DOM对象.属性名
+设置: DOM对象.属性名 = 新值
+例如:
+
+const uname = document.querySelector('input')
+uname.value = '用户名'
+uname.type = 'password'
+//innerHTML得不到表单的值,所以才需要用表单.属性名
+表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示,如果为true代表添加了该属性,如果为false代表移除该属性
+例如: disabled,checked,selected
+const ipt = document.querySelector('input')
+ipt.checked = true // 勾选状态
+const button = document.querySelector('button')
+button.disabled = true //禁用按钮
+
+
+
+### 自定义属性
+
+标准属性:标签天生自带的属性,比如class,id,title等,或可以直接用.语法操作的属性,比如 disabled,checked,selected
+自定义属性:
+在HTML5中推出来专门的data-自定义属性
+在DOM对象上一律以dataset对象方式获取
+例如:
+
+1
+const one = document.querySelector('div')
+console.log(one.dataset.id) // 获取结果为1
+
+### 定时器
+
+能够使用定时器函数重复执行代码
+1.开启定时器
+setInterval(函数,间隔时间)
+setInterval(函数名,间隔时间)
+例如:
+setInterval(function(){console.log('牛魔倒计时')},1000)
+setInterval(getName,1000)
+//间隔时间单位是毫秒
+//函数名不需要加括号
+//定时器返回的是一个id数字
+2.关闭定时器
+let 变量名 = setInterval(函数,间隔时间) //定时器返回的是一个id数字
+clearInterval(变量名)
+
+
+
+
+
+### CSS选择器
+
+1.用标签做选择器,叫做标签选择器 对标签
+例如:
+h1{
+ color:red
+}
+
+这是标签
+2.用类名做选择器 对多个元素
+例如:
+.a1{
+ color:red
+}
+这是div
+这是正文
+3.用id做选择器 对单
+例如:
+#b2{
+ color:red
+}
+这是div
+
+### const常量
+
+const声明的值不能更改,而且const声明变量的时候里面需要初始化
+但是对于引用数据类型,const声明的变量,里面存的不是值,而是地址
+const指向栈地址,栈再指向堆
+所以 const a = [2]; a.push(3) 不报错
+而 a = [4] 会报错
+同样
+const b = document.querySelector('div')
+b.innerText = '321'
+指向的是'div'的位置,修改div的内容不报错
+
+可以从上往下找下级标签,中间用空格间隔,例如:
+const b = document.querySelector('.a li')
+
+
+
+
+
+### 伪类
+
+取第1个值
+例 取第一个li li:first-child
+const li = document.querySelector('.a1 li:first-child')
+取第n个值
+例 取第5个li li:nth-child(5)
+const li2 = document.querySelector('.a1 li:nth-child(5)')
+取第最后一个值
+例 取最后一个li li:last-child
+const li3 = document.querySelector('.a1 li:last-child')
+
+
+
+### 生成随机数函数
+
+function getRandom(n,m){
+ return Math.floor(Math.random() * m-n+1)+n
+}
+
+### 补充
+
+//获取元素时,建议从上级往下多级确认//innerHTML,innerText只能获取双标签,如xx
,,获取不到单标签如
+
+
+
+
+
+### 操作表单元素样式
+
+//innerHTML,innerText只能获取双标签,如xx
,,获取不到单标签如
+表单很多情况也需要修改熟悉,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框
+正常的有属性有取值的 跟其他的标签属性没有任何关系
+语法:
+获取: DOM对象.属性名
+设置: DOM对象.属性名 = 新值
+例如:
+
+const uname = document.querySelector('input')
+uname.value = '用户名'
+uname.type = 'password'
+//innerHTML得不到表单的值,所以才需要用表单.属性名
+//button比较特殊,他是双标签,可以用innerHTML,innerText
+表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示,如果为true代表添加了该属性,如果为false代表移除该属性
+例如: disabled 禁用表单元素,checked 单选框复选框打钩;下拉框选中,selected
+const ipt = document.querySelector('input')
+ipt.checked = true // 勾选状态
+const button = document.querySelector('button')
+button.disabled = true //禁用按钮
+
+
+
+### 自定义属性
+
+标准属性:标签天生自带的属性,比如class,id,title等,或可以直接用.语法操作的属性,比如 disabled,checked,selected
+自定义属性:
+在HTML5中推出来专门的data-自定义属性
+在DOM对象上一律以dataset对象方式获取
+例如:
+
+
+
+ 补充
+
+// 对象.style.display = 'none' 隐藏,用在删除广告等
+// 对象.style.display = 'block' 显示
+
+
+
+### 事件监听
+
+事件是在编程系统内发生的动作或发生的事情,比如在网页上单击一个按钮
+
+事件监听就是、让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出相应,也称为绑定事件或者注册事件,比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等
+
+语法:
+元素对象.addEventListener('事件类型',要执行的函数)
+例:
+const div = document.querySelector('div')
+div.addEventListener('click',function(){
+ document.write('打印的内容')
+})
+//相当于给div添加一个事件,这个事件可以直接调用,要加括号:
+div.click()
+事件监听三要素:
+1.事件源:那个dom元素被事件触发了,要获取dom元素
+2.事件类型:用什么方式触发,比如单击click,双击dblclick等
+3.事件调用的函数:要做什么事
+//事件监听要加引号
+//函数是点击之后再去执行,每次点击都会执行一次
+
+
+
+### 事件监听的类型
+
+鼠标事件:
+click 鼠标点击
+dblclick 鼠标双击
+mouseenter 鼠标经过
+mouseleave 鼠标离开
+键盘事件:
+keydown 键盘按下触发
+keyup 键盘抬起触发
+
+
+
+### 事件监听版本
+
+DOML0
+事件源.on事件 = function(){}
+DOML2
+事件源.addEventListener('事件',function(){})
+区别:on的方式是一个属性,可以被修改覆盖,多次定义相当于是一个变量重新赋值
+
+