wiki/开发/前端/JavaScript手册.md
2025-01-02 10:46:09 +08:00

673 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JS基础
## 输入输出语句
```
alert('页面弹出警示框')
document.write('页面打印输出')
console.log('控制台打印输出')
prompt('输入对话框') 默认取的字符串类型
```
## 声明变量
```
let name = 10
```
## 声明常量
```
const pi = 3.14
```
## 基本数据类型
```
number
string
boolean
undefined
null
```
## 引用数据类型
```
Object、Function、Arry
```
## 字符串拼接
```
`今年${age}岁了`
'今年' + age + "岁了"
```
## 逻辑运算符
```
&& 与
|| 或
```
## 类型转换
```
转换为数字
Number('12') 转换为数字型
parseInt('12') 转换为整数数字型
parseFloat('12.5') 转换为小数数字型
转换为字符串类型
String(12) 转换为字符串型
变量.toString) 转换为字符串行
转换为布尔型
Boolean()
```
## 隐式转换
```
转换为数字型
算数运算符
+号作为正号可以把字符串转换成数字型
转换为字符串型
+字符串拼接
转换为布尔型
!逻辑非
```
## 分支语句
```
if (条件) {
语句
}
else if (条件) {
语句
} else {
}
条件? 表达式1:表达式2
switch (变量) {
case 值:
语句
break
default
语句
}
```
## 循环语句
```
while (判断) {
语句
}
for (执行前语句;条件;执行后语句) {
语句
}
break 跳出
continue 跳过本次
```
## 数组
```
数组声明:
let 数组名 = [数据1,数据2]
数组长度:
arry.length
新增数组:
arry.push(元素...) 增加一个或者多个元素到 数组末尾,返回数组长度
arry.splice(开始位置删除个数数据1数据2)
arry.unshift(元素...) 增加一个或者多个元素到 数组开头,返回数组长度
删除数组:
arry.pop() 删除最后一个元素,返回被删除的元素
arry.splice(起始位置0开始,删除个数)
arry.shift() 删除第一个元素,返回被删除的元素
修改数组:
arry[i] = 值
查询数组:
arry[i] 不存在则为undefined
遍历数组: (遍历数组处理数据,并返回新数组)
const newarr = arr.map(function (ele,index) {
ele为数组元素
index 为数组索引号
return ...
})
排序数组:
arry.sort() 会直接修改原数组
升序:
arry.sort(function(a,b){
return a - b
})
降序:
arry.sort(function(b,a){
return a - b
})
数组转字符串:
arr.json('每个值之间插入的值')
筛选数组filter()方法创建一个新的数组,新数组中的元素是符合条件的所有元素
const newarr = arr.filter(function (element数组元素,index数组下标){
return 筛选条件
})
遍历数组:
arr.reduce(function(){}, 起始值)
arr.reduce(function(上一次值, 当前值){}, 初始值)
查找元素:
find
拷贝数组:
arr.prototype.cocat()
```
## 函数
```
定义函数:
function 函数名(参数1参数2...) {
函数体
return 变量
}
调用函数:
函数名(实参1实参2)
匿名函数:
函数表达式:将匿名函数赋值给一个变量,并通过变量名称进行调用
立即执行函数:
(function(){}) ()
剩余参数:
function(a,b,...other)
```
## 作用域
```
全局:
函数内部的变量,如果没有声明直接赋值,当全局变量用
局部:
函数形参为局部变量
```
## 对象
```
定义对象:
let people = {
name: 'lzc',
sex: 'man',
age: 18,
str: function(){
语句
}
}
访问对象:
对象.属性
对象['属性']
删除属性:
delete 对象.属性
新增属性:
对象.新属性
遍历对象:
for (let key in people) {
获取key
people[key] 只能通过此种方式获取值
}
获取对象所有属性值
const o = { name: 'lzc', age: 18}
const arr = Object.values(o) //数组里值为lzc 18
获取对象所有的键:
Object.key
拷贝对象:
const o = { name: 'lzc', age: 18}
const newo = {}
Object.assign(newo,o)
```
## 内置对象
```
Math数学运算方法
方法:
PI Math属性返回圆周率
max(1,2) 返回最大值
min() 返回最小值
abs()返回绝对值
ceil()向上取整
floor()向下取整
round()四舍五入取整
random()返回一个0-1之间包括0不包括1
```
## 数据类型存储
```
基本数据类型
存放在栈里,访问速度快
引用类型(数组、方法、对象)
地址存放在栈里数据存放在堆里导致let x = 10; y=x 的时候y随x变化而变化
```
# WEB API
## 获取DOM对象
```
document.querySelector('css选择器') 获取指定的第一个元素
document.querySelectorAll() 获取指定的所有元素
得到一个伪数组(无法使用数组方法,仅能使用下标及长度)
getElementsById 通过ID
getElementsByClassName 类名
getElementsByTagName 标签名
getElementsByName name属性
```
## 操作元素内容
```
元素.innerText 操作元素内容,不解析标签
增:
元素.innerText = '新值'
删:
元素.innerText = ''
改:
元素.innerText = '新值'
查:
元素.innerText
元素.innerHTML 操作元素内容,解析标签
```
## 操作元素属性
```
元素.src .title .href
表单.value .type
```
## 操作元素样式
```
元素.style.width 通过style操作样式(如果有-采用小驼峰命名比如marginTop)
元素.className 通过类名操作样式
元素.classList.add() 增加类名
元素.classList.remove() 删除类名
元素.classList.toggle() 切换类名
```
## 间隔函数
```
setInterval(函数,间隔时间单位ms)
关闭定时器
let 变量 = setInterval(函数,间隔时间)
clearInterval变量
```
## 延迟函数
```
setTimeout回调函数等待的毫秒数 只执行一次
关闭延迟函数
clearTimeout()
```
## 自定义属性
```
可以在标签上加 data-自定义属性名
在dom上通过dataset获取
元素.dataset.自定义属性名
```
## 事件
```
元素对象.addEventListener('事件类型',事件处理函数)
事件类型:
鼠标事件:
click 点击
mouseenter 鼠标进入(没有冒泡)
mouseleave 鼠标离开(没有冒泡)
焦点事件:
focus 获取脚垫
blur 失去焦点
键盘事件:
keydown 键盘按下
keyup 键盘
文本事件:
input 当表单value 被修改时触发
页面加载事件:
load 等待所有的外部资源加载完后触发包括图片、外部CSS对象为window
window.addEventLinstener()
DOMContentLoaded 等待html加载完就触发对象为document
页面滚动事件:
scroll 监听用户把页面滚动到某个区域做一些处理比如固定导航栏监听在window上
获取被卷去的左侧scrollLeft和头部scrollTop
获取当前滚动的长度 document.documentElement.scrollTop
页面尺寸事件:
resize 监听在window上
获取当前元素的宽度clientWidth
获取当前元素的高度clientHeight
M端事件移动端触屏事件
touchstart 手指触屏开始事件
touchmove 手指触屏滑动事件
touchend 手指触屏结束事件
事件对象:
e.key 判断用户按下哪个键
环境对象:
this 谁调用,指向谁
```
## 事件对象
```
回调函数中的第一个参数即为事件对象
元素对象.addEventListener('事件类型',事件处理函数e{
e.key #按下了哪个键
})
```
## 环境对象
```
函数内部的特殊对象 this ,收当前环境影响(通常指向调用方)
全局环境/普通函数下:
this 指向window 对象
对象方法:
this 指向对象
事件 谁调用 指向谁
```
## 事件流
```
事件完整执行过程中的流动路径,两个阶段,捕获阶段、冒泡阶段
事件捕获当一个元素的事件被触发时会从DOM的跟元素开始依次调用同名事件从外到里
事件冒泡:当一个元素触发事件时,会依次向上调用父级元素的同名事件
阻止冒泡:
事件对象.stopPropagation()
```
## 事件委托
```
原本需要注册在子元素的事件委托给父元素,让父元素监听
获取事件对象目标元素
事件.target.tagName
```
## 阻止默认行为
```
当点击提交的时候阻止对表单的提交
阻止链接的跳转
```
## 移除事件监听
```
removeEventListener(事件类型, 事件处理函数(匿名函数无法移除)), 获取捕获或者冒泡阶段)
```
## 元素尺寸与位置
```
元素尺寸:
clientWidth/clientHeight 不带边框
offsetWidth/offsetHeight 带边框的大小
元素位置:
offsetLeft/offsetTop 元素距离页面的左上距离
```
## 日期对象
```
获取当前时间
const date = new Date()
得到指定的日期和事件
const date = new Data('yyyy-mm-dd hh-mm-ss')
方法:
getFullYear获取年份
getMonth获取月份
getDate获取月份中的每一天
getDay() 获取星期
getHours() 获取小时
getMinutes获取分钟
getSeconds 获取秒
其他方法:
toLocaleString() 返回该日期对象的字符串(包含日期和时间)
toLocaleDateString() 返回日期对象日期部分的字符串
toLocaleTimeString() 返回日期对象时间部分的字符串
```
## 时间戳
```
获取时间戳
+new Date() 获取当前时间,()里加时间格式就会自动转换
```
## DOM节点
```
可以利用节点关系查找节点
父节点查找: parentNode 返回最近一级的父节点对象找不到返回为null
子节点查找: children 返回最近一级的子节点对象
兄弟节点查找nextElementSibling/previousElementSibling
```
## 节点操作
```
创建节点:
document.createElement('标签名')
追加节点:
element.append() 放到父元素的最后面
element.prepend 放到第一个子元素前面
删除节点:
element.remove() 把对象从他所属的DOM树中删除
```
## BOM浏览器对象模型
```
window全局对象、顶级对象
navigator记录了浏览器自身的相关信息ua
location拆分保存了URL地址的各个组成部分
document
history管理历史记录前进后退
screen
```
## location对象
```
href属性得到完整的地址赋值则是跳转到新地址
search属性得到 后面的地址
hash属性得到#后面的地址
reload方法 刷新页面
```
## history对象
```
管理历史记录,做前进、后退功能
back() 后退
forward() 前进
go() 前进后退功能1为前进-1为后退
```
## 本地存储
```
localStorage 长久存储在浏览器中,刷新或者关闭页面也不丢失,无法存储复杂类型,直接存字符串
setItem(key,value):存储数据
getItem(key):读取数据
removeItem(key):删除数据
sessionStorage 当浏览器被关闭时,存储在这里的数据会被清除
方法和上面一致
```
## 复杂数据类型转JSON字符串
```
JSON.stringify(复杂数据)
JSON.parse(字符串)
```
## 正则表达式
```
const reg = 定义规则
reg.test(字符串) 匹配则为真
表达式:
^:匹配行首
$:匹配行尾
*重复0次或多次
+重复1次或多次
?重复0次或1次
{n}重复n次
{n,}重复n次或者更多次
{n,m}重复n到m次
[abc]:匹配其中一个
[a-z]匹配a-z中的一个
[^abc]排除abc
\d匹配数字
\D匹配0-9以外的字符
\w匹配任意字母、数字和下划线
\W与w相反
\s匹配空格换行符、制表符
\S取反
```
## 替换
```
字符串.replace/正则/'替换的文本'
```
## 展开运算符
```
... 将一个数组/对象进行展开
...arr
```
## 箭头函数
```
用于替代匿名函数
const fn = function() {
console.log('匿名函数'
}
fn()
const fn = () => {
console.log('箭头函数')
}
fn()
如果只有一个形参可以省略小括号
const fn = x => {
语句
}
如果函数只用一句代码,则可以省略大括号,这句代码就是返回值
const fn = x => 1+1
如果返回的是一个对象,则需要用小括号把对象包裹起来
const fn = () => ({ name: 'lzc' })
```
## 对象属性和方法简写
```
在对象中,如果属性名和属性值一致,可以简写只写属性名
对象中,方法可以简写
```
## 解构
```
数组解构:
const [max,min,avg] = [1,2,3]
max = 1
对象解构:
const { max, min, avg } = user
重命名:
const { 原名:新名 } = user
对象数组解构:
```
## 构造函数
```
命名以大写字谜开头用new构造
function 名字(参数1参数2) {
this.实参1=形参1 #实例成员
this.实参2=形参2
}
名字.参数 = 值 静态成员
const People = new 名字('实参1','实参2')
实例成员:
实力对象的属性和方法即为实例成员
实力对象互相独立
静态成员:
构造函数的属性和方法被称为静态成员
```
## 异常处理
```
throw 抛出异常,程序终止运行
throw new Error('错误描述')
try试试/catch拦住/finally 最后 捕获错误信息
try {
可能出错的语句
} catch (error) {
出现错误才执行
} finally {
不管如何都执行
}
```
## 改变this
```
bind()
fun.bind(在fun函数运行指定的this值arg1arg2)
```
## 防抖
```
单位时间内,频繁触发事件,只执行最后一次
```
## 节流
```
单位时间内,频繁触发事件,只执行一次
```