深入什么是

198 阅读8分钟

JS声明方式var,let,const差别

var与let都是声明变量,const声明常量
var具有全局作用域和变量提升且存在全局污染
let和const是块级作用域
let和const存在暂时性死区(TDZ)
暂时性死区:在声明变量未赋值之前使用变量会报错此报错称之为叫暂时性死区,简称TDZ
词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能分析就能确定,因此词法作用域也叫做静态作用域
静态分析:不运行代码的方式下,通过词法分析,语法分析,数据流分析等技术对程序员代码扫描,进而验证代码的可靠性和安全性,特点:(1)速度快,效率高(2)不动态分析(3)错误高
动态分析:通过真实的模拟环境对代码进行分析
编译型语言:词法分析,语法分析,语义检查,代码优化和字节语言
解释型语言:通过词法分析和语法分析得到语法分析树,就可以开始解释执行,类似于高中翻译古文,读一行,翻译一行
语法分析树:变量集(只有变量定义,没有变量值全部为undefined),方法集,作用域
(深入)作用域链:首先作用域是一个变量的可用范围,而这个范围就是作用域链,这个范围是这样执行的,作用域链是一套按名称查找的机制,首先在当前执行环境中查找,如果没找到到父中寻找,直到查找完并调用
作用域建立规则(函数作用域):(构造函数和匿名函数):创建时的作用域,(有函数名参数):第一个是函数名自身(继承了Object.prototype),第二个定义的作用域

call,apply,bind替换this

只调用一次函数,临时替换this,用call
既要一次替换this,又要拆撒数组,用apply
创建一次函数,并永久绑定this,用bind

new四件事

创建一个新对象
让子对象继承构造函数的原形对象
调用构造函数,将this替换为新对象,通过强行赋值为新对象添加规定的属性
返回一个新对象地址

JS数据类型

原始类型(栈):数值(整型,浮点型),字符,布尔(true,false),未定义(undefined),空(null) 引用类型(堆):对象,数组,函数
传值方式:原始类型是按值传递,引用类型是引用传递
实参:常量,变量,表达式,函数等作为参数。
形参:实现主函数与被调用(实参)之间联系
堆栈===数据类型存储
栈:队列优先,先进先出,操作系统分配
堆:先进后出,由程序员分配
队列优先:像链表,二叉树,红黑树,指针,线性表等称为队列优先,而前端只有数组操作
备注:因此,程序员编程只是在堆里编程,栈内由操作系统分配即编程,所以:像return,break,countinue返回给计算机存到栈里,像console.log(),alert()等程序员能看到存在堆里。
typeof:判断数值类型,数值(number),字符(string),布尔(boolean),未定义(undefind),对象(Object)
注意:null===undefined(true)
显隐式转换:隐式:数字+字符串=字符串,数字+布尔值(true=1,false=0)=数值+1(数值+0),字符串+布尔值=字符串true(字符串false),数值+空字符串(字符串为0)+数值=数值+数值,数值+空字符串+布尔值=数值布尔值字符串,字符串+空字符串+字符串=字符串,字符串+空字符串-字符串=NAN,布尔值+空字符串+布尔值=布尔值字符串(truetrue/truefalse/falsefalse/falsetrue),布尔值+空字符串-布尔值=NAN
显示:Number(),prenseInt(),prenseFloat(),toString()
运算符表达式:以下
逻辑运算符:&&(与),||(或),!(非)
算术运算符:+,/,-,%,++,--,*
比较运算符:<,>,!=,==(等于:值相等),===(类型和值都相等),!===
“i++”与“++i”:i++:先传值后加加,++i:先加加后传值
“+”:连接字符串,数值相加
[]+[]:什么都没有,但有参数且相邻加号当字符串处理
{}+{}:[Object Object][Object Object]
{}+[]:[Object Object]

字符串相关

API:截取:字符串.length(),字符串.substring(),替换:字符串.replace(),分割:字符串.splite(),大写转换:字符串:tolowercase(),小写转换:字符串.touppercase(),获取:字符串.chatAt()

JS模块规范

CommonJS:同步方式加载模块。服务器端读取非常块,但在浏览器读写非常慢。四个重要的环境变量为模块实现:module,export,require,global
AMD:异步方式的加载模块
CMD:与AMD类似,区别在AMD推崇依赖前置,提前执行,CMD依赖就近,延迟执行
ES6 Module:在语言层面上实现了模块功能,浏览器和服务器通用模块解决方案,模块主要由export和import

javaScript解释器

Node.js(服务端)--V8引擎
浏览器(客户端)--Chrome解释器 javaScript特点:弱类型语言,基于对象,跨平台 Node.js特点:无锁的,并发的,异步的,单线程的

箭头函数省略

如果有一个参数,()可以省略
如果有一个return,{}可以省略

寄生式组合继承

function Parent(name){
    this.name=name
}
Parent.prototype.eat=function(){
    console.log(this.name+',这是1')
}
function Child(name,age){
    Parent.call(this.name)
    this.age=age
}
Child.prototype=Object.create(Parent.prototype)
Child.prototype.contructor=Child
Child.prototype.study=function(){
    console.log(this.name+',这是2')
}
let child=new Child('干啥',16)
console.log(child.name) //干啥
child.eat()             //干啥,这是1
child.study()           //干啥,这是2

数组扁平化

其他称呼:数组拍平,数组拉平,数组降维。
数组扁平化很多其中最常用的是:数组.flat();

数组方法

去重(过滤)

let arr1=["name","sex",size,"name"]
arr1.fifter((i)=>{
    console.log(i)
})

事件委托,事件模型,事件传播,事件类型,事件循环,事件流程

事件传播:事件捕获和事件冒泡
事件捕获:从最高的DON节点开始一层一层的去找要捕获的事件,直到捕获到
事件冒泡:捕获到的事件,一层一层冒泡到最高的DOM节点,直到触发事件即事件目标
能冒泡的事件:click,dblclick,keyup,mosedown,mousemove,mouseouer,mouseup,scroll
不能冒泡的事件:load,unload,mouseenter,mouseleave,blour,focus,resize,error
事件流程(DOM事件流):事件捕获->目标事件(事件目标)->事件冒泡
事件委托:通过父元素操作多个子元素
API:形参.target

this:指当前事件
形参.target:指当前元素的子元素所发生事件即目标事件)

事件类型:鼠标事件,表单事件,键盘事件,编辑事件,页面事件
事件循环(EventLoop):同步代码(主线程)-异步代码-(把异步代码封装进队列,队列里有宏任务和微任务)队列-宏任务(主线程)-微任务
事件模型:1. DOM0事件模型,2. DOM2事件事件模型(1)事件捕获和事件冒泡(2)注册事件和接触事件
阻止事件冒泡:事件.Propagation() 删除事件监听:事件对象.removeEventListens() 监听事件:事件对象.addEventListens(事件名,事件函数)
DOM五件事:增删改查+事件绑定
DOM节点:2大关系+6个属性 修改:3内容+3属性+1样式

防抖与节流

防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延迟。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次。例如王者荣耀英雄回城。
节流:当持续触发事件时,保证一定时间内只调用一次事件处理函数,意思就是说,假设一个用户一直触发这个函数,且每次触发小于既定值,函数节流会每个这个时间调用一次。
区别:防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行。例如王者荣耀英雄技能冷却需要时间
函数节流两种方法:(1)时间戳(2)定时器

重排与重绘

网页生成的过程:(第1步)HTML解析为DOM(第2步)CSS解析为CSSOM(第3步)DOM和CSSOM生成树(第4步)布局(第5步)绘制到屏幕
重绘:元素外观改变没有影响布局,重新把元素外观绘制出来叫做重绘,即外观发生变化
重排(回流):元素的位置尺寸在DOM树发生了变化,浏览器需要重新计算叫做重排,即页重新布局
区别:重绘不一定出现重排,但重排一定会出现重绘
渲染和样式:渲染是用户访问过程不断渲染页面是动态的过程,样式是页面的外观即静态的
重排的优化方案:(1)分离读写操作(2)样式集中改变(3)缓存布局信息(4)离线改变DOM
(5)position属性为absolute或fixed(6)优化动画

垃圾回收和内存泄露

垃圾回收:找出不再使用的变量,然后释放掉
垃圾回收两种方法:标记清楚和引用计数
内存泄漏:不再用到的内存,没有及时释放内存
常见的内存泄露:(1)全局变量(2)闭包(3)回调函数容易遗忘那个函数调用那个函数没有调用 垃圾回收优化:(1)数组array(2)优化对象尽量复用(3)复用函数最好放在循环体外