# 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值,arg1,arg2) ``` ## 防抖 ``` 单位时间内,频繁触发事件,只执行最后一次 ``` ## 节流 ``` 单位时间内,频繁触发事件,只执行一次 ```