目录
局部 this 严格模式调用是 undefined
基本数据类型和复杂数据类型
基本数据类型 String Number Bollean Null Undefine Symbol(ES6) BigInt(ES10)
复杂数据类型 Object 类型及其子类,如 Array、Date、Class 等[引用数据类型]
这些数据类型的存储差别是什么?
原始数据直接存储在栈(stack)中 简单数据段、占据空间小、大小固定,属于频繁使用数据所以放在栈中存储
引用数据类型存储在堆中的对象,占据空间大,大小不固定
判断数据类型
typeof xx 判断基础类型
a instanceof b a 是否属于 b
xx.isArray 是否数组
Object.prototype.tostring 对象原型查看
xx.constructor 构造函数查看
转化字符串
变量.toString()
String(变量)
'+'
数字类型转换
parseInt(string)
parseFloat(string)
Number(string)
-*/
转化为布尔值
Boolean()
!!
常见转义字符
\n \t \\ \' \"
运算符的优先级
基本输入输出
alert 警告框
console.log 控制台
prompt 输入框
docunment.write 输出至网页
console.dir 深层次处理 深度打印
冒泡排序
递归函数
模板字符串``
可以接收三元运算符[三目运算符]
解析变量${}
展开运算符...
展开数组对象
对象不能直接展开运算符输出
查找 API
输出数据类型,点击下拉箭头查看所有预定方法
判断
if
switch
三元
循环
for
while
for in
for(k in 对象) 使用 k 作每次使用较多
str.repeat(6); 相当于把 str 循环输出 6 次
数组[] (array)
函数 function()
arguments
函数的相互调用
对象{} (boject)
创建方式 构造函数
总与 new 运算符一起使用在创建对象语句,可以理解构造函数为创建变量的一种方法
BOM DOM event
鼠标事件
.onclick 鼠标左键单击
.ondblclick 双击鼠标左键
.onwheel 滚轮滚动
.oncontextmenu 鼠标右键单击
e.preventDefault(); 阻止默认事件
.onmouseover/.onmouseout 鼠标移入移出(子元素)
.onmouseenter/.onmouseleave 鼠标移入移出
.onmousedown 左键 按下
.onmouseup 左键 抬起
.onmousemove 鼠标移动
键盘类事件
onkeyup 键盘抬起
onkeydown 键盘按下
onkeypress 键盘按下抬起(不是所有功能键都会触发)
e.key 按下哪个键,e.key 就等于哪个值
e.altKey / e.shiftKey / e.ctrlKey 默认 false 按下后变 true 组合键
表单类事件
onchange 内容改变 且失去焦点 触发
oninput 改变的时候 触发
onblur 失去焦点 触发
onfocus 获得焦点
浏览器事件
onload 等待 dom 和资源加载完毕执行
onresize 浏览器大小改变时触发
onscroll 页面滚动时触发
兼容 被卷去的高度 文档声明<!DOCTYPE>
scrollTop 可以设置高度
document.documentElment.scrollTop 有声明
document.body.scrollTop 没有文档声明
事件里的内置对象(重要的事件对象) e
offsetX 和 offsetY 相对于自身的 x 和 y
clientX 和 clientY 相对于浏览器的 x 和 y 坐标
pageX 和 pageY 相对于页面的 x 和 y
x 和 y 都是和事件对象有关 left 和 top 等都是和元素有关
其他事件
.ontransitionend 过渡结束的时候触发
.onmanimationend 动画结束的时候触发
移动端事件
.ontouchstart 触摸开始的时候触发
.ontouchmove 移动的时候触发
.ontouchend 触摸结束时触发
尺寸
.offset:自身、padding、border
offsetWidth 获取元素的宽
offsetHeight 获取元素的高
.client: 自身+padding
clientWidth clientHeight
偏移量(即子元素到父元素的距离)
offsetLeft offsetTop
边框(元素边框的宽度)
clientLeft clientTop
窗口的宽高(包含滚动条宽高)
innerWidth innerHeight
不包含滚动条页面宽
document.documentElement.clientWidth
event 1.事件源 2.事件类型 3.事件函数 4.修饰符
使用事件里的内置对象
box.οnclick=function(e){ console.long(e.offsetX) }
.addEventListener('事件函数',函数)
onclick 就是 click 无 on
ie8 及以下 attchEvent()注意 加 on
默认是冒泡机制: 和 addEventListener 第三个参数有关系
默认 false 冒泡机制; true 捕获触发事件
阻止事件冒泡
1.e.cancelBubble = true;
2.e.stopPropagation(); [推荐使用]
获取点击目标
e.target
IE8 以下使用 e.srcElement
阻止默认事件(优先执行默认事件,所以阻止)
e.preventDefault() 任何位置[常用]
兼容(IE8 下) e.return
内置对象的兼容性
var e= e || window.event
事件监听兼容性
如果是 ie8 及以下的浏览器 attchEvent() :注意需要加 on
直接通过 id 名绑定[不推荐]
id 名.事件名
1.可设置和获取会覆盖之前类名
元素.className
2.添加类名
元素.classList.add('类名')
3.移除某个类名
元素.classList.remove('类名')
4.判断类名(是否存在)
元素.classList.contains('类名')
var 定义变量自动提升,只提升定义不提升赋值
function 自定义函数自动提升,不是匿名函数(匿名相当于赋值),先提升 var,提升在 var 下面
全局作用域、函数作用域和局部作用域(ES6)
多个作用域组合在一起像链条一样,于是就叫作用域链【由里至外】
var 全局作用 除定义在函数内
let 块级作用生效 不能重新定义
const 块级作用 不能重新赋值,必须初始化
setInterval(函数,时间); 开启计时器
clearInterval(计时器名); 关闭计时器
计时器累加效果的解决
setTimeout(函数,时间) 打开延时器
clearTimeout(延时器名) 关闭延时器
异步
Math.PI 圆周率
Math.max(-1,2) 最大值
Math.max(...[2,8,-1]) 转换数组需要加...
...展开运算符
不可转换返回 NaN,会做隐式类型转换
Math.min 最小值(与最大值一样)
Math.floor 取整(向下)
Math.ceil 取整(向上)
Math.abs 绝对值
Math.around 四舍五入
Math.random 0-1 的随机值
.style.left=(left 值) 改变元素的 left 值
.offsetLeft 盒子左边的距离
.innerText 获取标签或改变标签的值(Value)
.innerHTML 替换超文本内容(包含标签)
push(参数 1,参数 2...) 末尾添加 n 个参数 并返回新的长度
unshift(参数...) 开头添加 n 个参数 并返回新长度
concat() 连接两个数组
array.concat(arr2);
pop() 删除数组最后一个元素 返回删除的元素的值
shift() 删除数组第一个元素 返回第一个元素值
splice 修改[更多用作替换]
splice(修改位置[索引],删除的数据个数,添加的内容,添加的内容)
slice() 截取从某某下标开始到某某下标结束,返回新数组(可为负数)
array.slice(start, end)
数组 排序
reverse() 反转数组 改变原数组
sort() 对数组排序【超出两位排序的问题】
indexOf('数组元素') 获取数组下标(从前往后,没有返-1)
lastIndexOf('数组元素') 获取元素下标(从后,没有返-1)
includes('数组元素') 有返回 true,没有返回 false
toString() 数组转换字符串(以逗号分割)
join('分割符') 数组转字符串
以'分隔符'分割,常用''输出字符串,无分割
var date=new Date()
数字 逗号隔开 2022,3,8,10,30,20
字符串 中间空格 '2022-3-8 10:30:20'
月份、星期从 0 开始
格式化日期
getFullYear() 获取当年
getMonth() 获取当月(0-11)
getDate() 为当月第几天
getDay() 星期
getHours() 小时
getMinutes() 分钟
getSeconds() 秒
getTime() 返回自1970年1月1日来的毫秒数
获取毫秒数【毫秒数固定的,从 1970 年】
+new Date()
var date =+new Date() 获取 1970 毫秒
Date.no w()
字符串的所有方法都不会修改字符串本身
.length 字符串长度方法
.indexOf('要查找的字符',开始的位置) 从前往后
返回字符返回的索引值,找不到返回-1
.lastIndexOf 从后往前查找
.charAt(index) 返回指定位置的字符
.charCodeAt(index) 获取指定位置处字符的 ASCII 码
.str[index] 获取指定位置的字符
.substr(index,lenth)[重点] 获取字符串中的值
从 index(索引)开始,length 获取个数,index 可设负值;负值从后往前截取
.concat(str1,str2...) 拼接字符
凭借两个或多个字符,相当于+号(没+好用)
.substring(start,end) 截取数组
从 start 开始,截取 end 位置,设负值从后往前截取
.replace(被替换的数据,要替换的数据) 替换数组
用来替换不文明语句为*等
.split(分割条件) 字符串转数组(通过条件转)
字符串大小写 元素.toLowerCase 小写 元素.toUpperCase 大写
str.repeat(6); 相当于把 str 循环输出 6
对象名中括号与点的区别
中括号[]里面可以是字符串或变量
.后面只能使用字符串
BOM 就是 window 全局对象 DOM 就是 document 是 window 的一部分
window.innerWidth 窗口宽度
window.innnerHeight 窗口高度
window.navigator 浏览器相关信息
window.open("网址") 打开页面
window.close() 关闭页面
location.href 获取设置当前页面地址
location.reload() 重载当前页面
location.hash 获取设置 hash 值 #
location.search 获取[接收]地址栏传参 ? (使用&连接)
浏览器历史记录,前提是必须有历史记录
history.back() 回退到上一个历史记录
history.forward() 前进下一个历史记录
history.go(num) 0 当前页面 1 下一个 2 下两个 -1 上一个 依此类推
var 预解析 可重复定义 可重复赋值
let 不进行预解析 不可重复定义 可重复赋值
const 不会预解析 不可重复定义 不可重复赋值
document 全局文档对象
直接通过 ID 操作(野路子,不建议) console.log(id)
document.getElementById("") id 名获取元素
document.getELementByClassName("") 类名获取元素
document.getElementByTagName("") 标签名获取元素
document.querySelector(". # div") 获取第一个[id 类 标签名]
document.querySelectorAll(. div) 获取多个
变量.getAttribute("属性名") 获取元素属性值
.setAttribute("属性名","属性值")
.removeAttribute("属性名")
基础删改
innerHTML 操作内部超文本
innerText 操作内部文本
增
document.createElement('标签名')
增加其位置
父元素.appendChild 追加到子元素最后位置
父级.insertBefore("要添加的新元素","添加到哪个元素前")
修改
.replaceChild()
删除
元素.remove() 常用
父级.removeChild(要移除的子元素)
克隆节点
cloneNode()
默认 false 只克隆最外层标签
设为 true 克隆自身所用节点(自身和子元素内容)
1.元素节点(1)
.nodeType=1 .nodeName=大写标签名 .nodeValue=null
2.文本节点(3)空格换行也是文本节点的一种
.nodeType=3 .nodeName:text .nodeValue=文本内容
3.注释节点(8)【HTML 注释不要乱删】
.nodeType=8 .nodeName=comment .nodeValue=注释内容
4.属性节点(2)
.nodeType=2 .ndeName=属性名 .nodeValue=属性值
document 有节点构成 节点包含 元素标签 空格换行..
1.元素.childNodes 子节点
子节点包括换行(当作文本节点),元素节点
2.元素.children 获取所有子元素
3.firstElementChild 获取第一个子元素
4.firstChild 获取第一个子节点
5.lastElementChild 获取最后一个子元素
6.lastChild 获取最后一个子节点
.parentNode 父节点
.parentElement 父元素
父节点和父元素找到容器一样,应为文本节点不能包含
1.previousElementSibling 上一个兄弟元素
2.previousSibling 上一个兄弟节点
3.nextElementSibling 下一个兄弟元素
4.nextSibling 下一个兄弟节点
document.documentElement 获取 html 标签
document.head 获取 head 标签
document.title 获取 title 的文本内容
document.body 获取 body 标签
document.getElementsByName('') 通过 name 获取
获取行间样式 元素.style.样式属性名=
ele.style.background='blue';
获取非行间样式
getComputedStyle(获取样式的元素,伪类样式)[属性名称]
getComputedStyle(box2Ele)['background-color']
兼容 IE8 以下
元素.currentStyle[styleName] IE8 以下兼容
防抖(debounce)
n 秒后执行事件,在 n 秒内重新触发,则重新计时
分前置防抖和后置防抖
节流,类似技能的 cd
函数被外部环境引用,就不会被摧毁;这种变量不会被摧毁就叫做闭包
通过某些规则查找字符串是否存在某些字符
平时用不到,但有时会帮你解决些头疼的问题
创建
字面量创建
var reg=/ab/ 是否有 ab
内置构造函数创建
var reg = new RegExp(mayname); mayname 为变量
区别
内置构造函数可以存储变量
字面量不可存储变量
验证
正则对象.test(需验证字符串)
reg.test(str)
通过内置构造函数来写正则 所用\都要转义
\s -->\s
1.点(.):在正则里匹配非换行任意字符
2.\转义字符(匹配除自身的所有字符)
3.匹配空格 \s
4.匹配非空格 \S(大写 S)
5.匹配数字 \d
6.匹配非数字 \D
7.匹配 数字、字母、下划线 \w
8.匹配非数字、字母、下划线 \W
指上一个字符出现的次数
1.*:字符出现 0 次到多次
2.?: 字符出现 0 到 1 次
3.+:字符出现一次或多次
4.可以指定出现次数 {数量}
var reg = /ab{2}c/
就是指必须包含 abbc [b 出现两次的意思]
5.指定范围:{最少出现次数,最多出现的次数}
6.指定次数 至无限次 {最少出现次数,}
1.某某作为开头 ^
2.某某作为结尾 $
分组
1.() 正则里的是分组
2.RegExp.$1...$n
获取分组里的内容 $1 第一个分组
正则里的或(|) 和 且(&)
正则里的集合[]
1.自带或者关系 [abc]
2.可以设置区间 [a-z]
连续的大小写字母
连续的 Assci 码
连续的数字[0-9]
[0-25] 表 0-2 或 5
匹配中文[\u4e00-\u9fa5]
3.集合里^是非的意思
默认是惰性匹配(只匹配一个)
全局匹配,可执行多个匹配
正则相关方法
1.正则方法
2.字符串方法
1.reg.test(str) 匹配字符串是否匹配正则规则
2.reg.exec(str) 捕获符合匹配字符的规则
修饰符(可练写,例 gi)
1.全局匹配 g 背后加 g
2.i 忽略正则大小写
字符串正则方法
1.字符串.split(正则) 匹配 true 和 false
2.字符串.search(正则) 返还符合规则的索引值[0 开始]
3.字符串.replace(正则,'要替换的字符')
match 方法 获取正则匹配的字符 区分 全局和非全局
字符串.match(正则)
一种更方便提取数据的模式
数组的解构
对象的解构
const { name, age } = { name: '张三', age: 21 }
概念:
在js中,对象如果在自己的这里找不到对应的属性或者方法,就会查看构造函数的原型对象,如果上面有这个属性或方法,就会返回属性值或调用方法
原型对象【原型】
在js中,每一个函数类型的数据,都有一个叫做prototype的属性,这个属性指向的是一个对象,就是所谓的原型对象
最主要的作用就是用来存放实例对象的公有属性和公有方法
构造函数
对于原型对象来说,它有个constructor属性,指向它的构造函数
显示原型和隐式原型
显示原型:利用prototype属性查找原型,只是这个是函数类型数据的属性
隐式原型:利用proto属性查找原型,这个属性指向当前对象的构造函数的原型对象,这个属性是对象类型数据的属性,所以可以在实例对象上面使用
原型链【原型链】
就是原型对象也是一个对象,对应的也有其原型对象就是Object.prototype
不过其原型对象后就没有上一层原型对象,为null
顺着proto属性,一步一步往上查找,形成链条一样的结构就是原型链
总结
构造函数是使用了new关键字的函数,用来创建对象,所有函数都是Function()的实例
原型对象是用来存放实例对象的公有属性和公有方法的一个公共对象,所有原型对象都是Object()的实例
原型链又叫隐式原型链,是由proto属性串联起来,原型链的尽头是Object.prototype
所用元素满足返回True 有一个不满足就返回False 注意:不对空数组进行检测 不会改变原有数组
(x, y) => x * x + y * y 相当于 function (x,y) { return x * x+y * y; }
箭头函数是ES6新推出的一种写法;
(1)箭头函数没有prototype为undefind
(2)箭头函数没有自己的this指向,它的this指向外层
(3)没有外层函数使用argument会报错,有则继承外层
1.git add . 2. git commit -m '注释' 3.git push
养成习惯使用服务器打开代码
有得注释是功能性的注释 JS 的注释没关系 HTML 注释是可以拿到些功能的 到公司不要随便删掉注释
属性(名词)没有括号 方法(动词)需要括号
ES6: ECMA 2015 , 标准 js 版本
ECMA: 欧洲的计算机协会
hositing(声明前置和预解析)