Web APIs:
DOM文档对象模型 文档对象模型(DOM)是一个网络文档的编程接口。它代表页面,以便程序可以改变文档的结构、风格和内容。 DOM 将文档表示为节点和对象;这样,编程语言就可以与页面交互。
BOM浏览器对象模型 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。
JS执行机制: 优先执行栈,后任务队列 事件循环 (even loop)
JS进阶:
作用域:{ 局部作用域,全局作用域
作用域链——> 本质是底层的变量查找机制:1.优先查找当前作用域 2.依次逐级查找父级作用域
垃圾回收机制GC: 内存生命周期:1.分配 2.使用 3.回收 全局变量一般不回收,页面关闭时回收 局部变量的值不用了会被自动回收 内存泄漏:程序中分配的内存由于某种原因导致程序未释放或无法释放 垃圾回收机制-算法说明: 引用计数法(简单有效,但使用嵌套引用无法回收,导致内存泄漏) 标记清除法 }
闭包:{
闭包 = 内层函数 + 外层变量
闭包不一定有return,不一定会内存泄漏
使用场景:
1.从外部访问函数内部的变量
2.实现数据私有
}
var变量提升:{ 只有var有变量提升 提升当前作用域的变量到当前作用域的最前面,但只提升声明不提升赋值 }
函数提升:{ 提升当前作用域的函数到当前作用域的最前面 eq:
<script>
//先调用后声明
fn()
function fn(){
console.log(1)
}
</script>
(函数表达式(var fun =function (){})必须先声明后调用) }
函数参数:{ 动态参数arguments:返回伪数组,只存在与函数当中 *剩余参数:...arr:返回真数组,只存在与函数当中(实际开发提倡用剩余参数) }
*展开运算符:{ ...arr 展开数组arr
不会修改原数组
eq:
//求数组元素最大值
const arr = [1,2,3]
console.log(Math.max(...arr))
}
*箭头函数:{
替代匿名函数,运用到函数表达式 原来的函数表达式:const fn = function(){ } 使用箭头函数:const fn = () =>{ }
箭头函数没有this DOM事件回调函数不推荐使用箭头函数,因为this会指向全局window eq: btn.addEventListener('click',()=>{ console.log(this) }) }
解构赋值:{ 数组解构:将数组的单元值快速批量赋值给一系列变量的简介语法 *对象解构:将对象属性和方法快速批量赋值给一系列变量的简介语法 }如此
对象:{ 创建对象的方法: 1.利用对象字面量创建对象 2.利用 new Object创建对象 3.利用构造函数创建对象 (构造函数是用来初始化对象的函数)
function fn(a,b){
this.a(这个a是属性) = a(这个a是形参);
this.b = b;
}
const fn1 = new fn(1,2)//实例化 //实例属性和实例方法(fn1是实例化后的新对象):
fn1.name = 'c'
fn1.sayHi = () =>{
console.log('Hi!')
}
//静态属性和静态方法:
fn.name = 'c'
fn.sayHi = () =>{
console.log('Hi!')
}
}
数组reduce方法:{ 返回累计处理的结果 //数组求和,把上一次循环返回值当作这次循环的上一次值,如果有起始值则起始值为第一次循环的上一次值,反之数组第一个值为第一次循环的上一次值。
const arr = [1,2,3]
//无初始值
const sum = arr.reduce((prev,current) => return prev + current)
//有初始值
const sum = arr.reduce((prev,current) => return prev + current, 10)
console.log(sum)
}
forEach:{ 适合遍历数组对象 就是便利 加强版的for循环 无返回值(map会返回数组) }
map:{
}
filter:{ 筛选方法(只能比较大于或小于):
const arr = [10,20,30]
const newARR = arr.filter(function(item,index){
return item >= 20
})
console.log(newARR)
} find筛选符合条件的第一个值 filter筛选符合条件的所有对象
面向对象编程:{ JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象 可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法 构造函数和原型对象中的this 都指向 实例化的对象
- constructor属性在哪里?作用干啥的? prototype原型和对象原型proto里面都有 都指向创建实例对象/原型的构造函数
- proto属性在哪里?指向谁? 在实例对象里面 指向原型对象 prototype 所有对象里面都有proto对象原型 指向原型对象 所有的原型对象里面有constructure,指向 创造该原型对象的函数
每一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是 原型。 当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型 (原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回undefined。 这条由对象及其原型组成的链就叫做原型链。 }
深拷贝:{ 深拷贝 有三种方式 1. 通过递归实现深拷贝 先数组后对象 2. lodash/cloneDeep 引入lodash,使用外部方法cloneDeep实现 3. 通过JSON.stringify()实现 JSON.parse(JSON.stringify())进行转换后不再是原来的对象 }
this: { 普通函数:谁调用指向谁,严格模式下指向undefinded 箭头函数:指向最近作用域中的this
改变this指向 call() apply() bind() }