学习漫漫路,基础知识补充

827 阅读10分钟

后面会不断往这里面写东西的,学的东西太浅了,慢慢记录

  1. http无状态

    • http不会为了下次连接所需要的信息而维护这次连接
  2. 扁平化数据转树状

    • 遍历数据
    • 判断当前的元素是否为子级
    • 为子级则插入到父级的children数组中
    • 递归
  3. 元素位置互换

    • 假设:A与B位置互换
    • 保存父节点
    • 获取各节点的下一个节点并保存
    • 利用insertBefore插入到各下一节点的前面
  4. CSS3新特性

    • 属性选择器
    • border-radius
    • rgbaopacity
    • transform
    • animation(动画)
    • 阴影
  5. 移动端适配

    • rem + 媒体查询
    • 媒体查询修改字体大小(有阶梯性)或者是通过JavaScript动态控制根元素字体大小
    • rem根据根元素字体大小进行响应
  6. CSS中animationtransitiontransformtranslate区别

    • animation:动画(类似一种设置好播放时间、次数的动画)
    • transition:过渡(hover等),是需要人为触发且是一次性的(重复需要重新触发,比如:鼠标移动到元素上等)
    • transform:变形
    • translate:移动
  7. animationtransition区别:

    • 触发:animation无需触发,自动执行;transition需要手动触发
    • 重复:animation可重复发生;transition重复发生需要再次触发
    • 状态:animation有多个状态;transition仅有开始和结束状态
    • 暂停:animation可暂停;transition不可暂停
    • animation像是一种动画的播放,而transition更像是一种过渡状态的展示
  8. 伪元素和伪类

    • 形式方面:伪类:、伪元素::
    • 伪类用于添加元素的特殊效果、伪元素用于添加文档流之外的元素
    • 伪类常用于一些元素的过渡效果、伪元素常用与添加图标以及清除浮动等操作
  9. loadDOMContentLoaded的区别

    • DOMContentLoaded:DOM被完全加载及解析之后触发
    • load:除DOM完全解析外,其他资源、依赖均加载完成后触发
  10. Vue生命周期

    • beforeCreate:实例创建阶段(方法、computed、watch、method、data无法使用)
    • created:实例创建完成,方法、数据可使用,可在此进行异步请求
    • beforeMounte:页面挂载阶段,此时页面还未进行渲染与挂载
    • mounted:页面挂载完成,可以对元素进行操作
    • beforeUpdate:页面更新前,可在此进行提醒
    • updated:页面更新完成,可在此进行提醒
    • beforeDestroy:实例销毁前,可在此进行定时器清除操作
    • destroyed:实例销毁,无法进行任何操作
    • keep-alive:
      • deactivated:组件被缓存
      • activated:组件激活
  11. 路由守卫

    • 全局守卫
      • 全局前置守卫:beforeEach,进入路由前触发,常用于检测登录状态
      • 全局解析守卫:beforeResolve,在beforeRouteEnter完成后触发
      • 全局后置守卫:afterEach,进入路由后触发
    • 路由守卫(为某个路由操作单独配置)
      • beforeEnter
    • 组件守卫
      • 进入路由前:beforeRouteEnter
      • 此路由复用:beforeRouteUpdate
      • 离开当前路由:beforeRouteLeave
  12. Vue2与Vue3的一些区别

    • 生命周期
      • vue3beforeCreate+created -> setup
      • 其他周期仅是改了名称,功能不变
    • 响应式:
      • vue2Object.defineProperty + 观察者模式
      • vue3Proxy
    • Diff算法优化
  13. Vue原理

    • template转换为抽象语法树AST树
    • 优化:遍历AST树,标记静态节点,下次渲染跳过对比
    • AST树转换为可执行的代码
  14. Diff算法流程

    • 同级比较,不相同则直接移除,进行渲染,相同再比较子节点
    • 判断子节点是否存在,存在情况不一样则进行移除或添加操作
    • 如果存在子节点,深度递归比较子节点
    • Vue2Diff:双端比较
  15. 虚拟DOM

    • JavaScript利用对象将真实DOM抽象化
    • Diff算法实现两棵虚拟DOM树的差异比较
    • Patch算法将两棵虚拟DOM树之间的差异应用到真实DOM上
  16. Vue2响应式

    • 三个重要角色:Observer(添加gettersetter)、Dep(进行依赖收集与更新派发)、Watcher(观察者对象,数据改变后观察者收到派发更新,进行更新操作)
    • Dep的作用:仅有在当前变量在页面有绑定时才进行正常的派发更新,若是无用变量则无需进行派发更新、重新渲染
    • 主要步骤:
      1. 通过Observer对监听的数据添加gettersetter
      2. 利用getter进行依赖收集,存放在Dep、利用setter通过Dep.notify()进行派发更新
      3. Watcher收到派发更新,进行响应操作
  17. 三种观察者对象

    • 渲染:render watcher
    • 计算属性:computed watcher
    • 侦听器:user watcher
  18. Ajax设置Header

    • xhr.setRequestHeader("key",value)
  19. Ajax请求携带cookie

    • 服务端配置响应头Access-Control-Allow-Origions(跨域)
    • 服务端配置响应头Access-Control-Allow-Credentials
    • 配置请求头WithCredentials:true
  20. 其他跨域方法

    • jsonp:利用了<script>标签不受跨域影响,后端返回函数名及参数,前端对此进行执行(缺点:只有GET方法)
    • cors:如19
    • node中间件nginx反代理:接了一层服务器转发,服务器没有同源策略
    • iframepostMessagewebsocket
  21. event.targetevent.currentTarget之间的区别

    • event.target是触发该事件的元素(例如事件委托,点击了某个元素向上冒泡触发事件,指的就是这个元素)
    • event.currentTarget是绑定该事件的元素(假如我绑在了ul上,则不管怎么触发都是指向ul
  22. 如何添加一个点击事件

    • addEventListener
    • 标签中的onclick
    • JavaScript获取标签,div.onclick = function(){}
  23. v-ifv-show

    • v-show实际上是通过display:none来控制元素显隐,不管条件是否正确都会创建元素(有渲染开销),隐藏也能获得该标签
    • v-if实际上是通过对元素进行DOM元素的加载和卸载控制显隐,不符合条件则不创建元素,且v-if会触发生命周期(有切换开销),隐藏后不能获得该标签
  24. CSS隐藏某个元素

    • display:none不会占据最初位置,触发回流
    • visibility:hidden会占据最初位置,触发重绘,且是继承的,子元素可以取消hidden
    • rgba透明(继承,子元素可改变)、opacity:0透明(父+子看成一整体)
    • 移动元素到页面外
    • 让元素到最下层(z-index:-1)
  25. 数组和链表的区别

    • 数组在栈区,链表在堆区
    • 数组在内存中连续,链表在内存中不连续
    • 数组静态分配内存,链表动态分配内存
    • 查找性能相同
    • 链表插入、删除性能高(数据不连续存储,因此插入删除不会导致元素大量移位)
    • 数组的读取性能高(数据存储空间连续,可以快速定位)
  26. 各继承方法的缺点:

    • 原型链继承:
      1. 实例无法向构造函数传参
      2. 所有实例会共享父类的实例属性
    • 构造函数继承:
      1. 只能够继承父类构造函数的属性
      2. 不能够复用
      3. 每个新实例都有父类构造函数的副本
    • 组合继承
      1. 调用了两次父类构造函数,生成了两份实例,耗内存
  27. 垃圾回收

    • 标记清除
      1. 基本数据类型存放在栈中
      2. 引用数据类型的指针存放在栈中,内容存放在堆中
      3. GC自动执行,将没有被引用的变量标记为垃圾数据,有被引用的变量标记为活动数据,随后将垃圾数据清除释放
    • 引用计数
  28. Promiseasync/await的区别

    • Promise:ES6、async/await:ES7
    • 错误捕捉
      1. Promise错误通过catch捕捉
      2. async/await错误可通过thentry-catch捕捉
  29. 异步

    • ES5:setTimeoutsetInterval、回调函数、发布订阅、事件监听
    • ES6:Promise
    • ES7:async/await
  30. 事件委托

    • 利用事件冒泡机制
    • 定位目标元素:event.targetevent.srcElement
    • 事件兼容:event || window.event
  31. ES5中类与ES6中class的区别

    • class在必须严格模式下,不存在变量提升,内部属性和方法不可枚举
    • ES5的构造函数可以当做函数使用,而class不行(必须使用new调用)
    • class通过superextends进行继承,ES5通过构造函数或原型链进行继承
    • 继承方面:
      1. class是将父类属性和方法加到this上,再由子类来修改指向
      2. ES5是先创造子类对象实例,再将父类方法添加到this
  32. ES5实现ES6class

    • 从以下方面进行解决:
      1. 禁止直接调用,必须使用new操作符
      2. 不允许内部方法与属性枚举
      3. 创建出class
      4. 实现原型链上的继承和静态方法的继承
      5. 使用父类实例对象的this
      6. 子类继承
  33. Promise的输出问题

    • 查看以下代码
        new Promise((resolve,reject)=>{
            {
                //此处是同步代码,立即执行
                resolve(); //同步执行代码,立即执行,立即执行
                //此处也是同步代码,立即执行
            }
        }).then(()=>{
            {
                //此处是异步代码
            }
        })
    
  34. 基本有序的数组用什么排序方法进行排序最快

    • 堆排序
  35. Flex

    • 属性:flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content
    • 重要:flex:0 1 auto
      1. flex-grow:伸缩(放大)比例
        1. 值为0(默认):不放大也不缩小
        2. 值为1:放大填充空位(等分剩余空间,若有2,则以2:1比例分配剩余空间)
      2. flex-shrink:收缩(缩小)比例
        1. 值为0:不缩小
        2. 值为1(默认):空间不足则缩小
      3. flex-basis:缺省尺寸
        1. 值为auto(默认):按原来的尺寸显示
  36. tcp为什么是可靠的

    • 停止等待协议
      1. 发送出一段数据后,设置一个定时器,如果在定时器触发前还没有收到另一端的确认接收消息时,重新发送
    • 连续ARQ
      1. 采用累积确认的方式进行数据发送,分组发送多个数据,另一端会对按序到达的最后一个分组进行确认(如[1,2,3,4,5],只发送了[1,2,3,5],则会确认接收到3,重新发送4与5)
  37. ref

    • 在子组件上使用:是对子组件实例的一个引用,可以通过ref去调用子组件的方法
    • DOM上使用:对DOM元素的引用
  38. 如何判断null类型

    • Object.prototype.toString.call
    • ===
  39. 各种请求方法

    • GET:向指定服务端请求资源
    • POST:向指定服务端提交资源
    • PUT:向指定地址存储资源(更新)
    • HEAD:获取资源响应首部
    • DELETE:从服务端删除资源
    • OPTION:获取可以请求的方法
  40. hash路由和history路由

    • hash路由:将#拼接在真实的url后,#后路径有变化时,浏览器并不会重新发起请求,而是触发onhashchange事件,根据onhashchange事件去进行一些操作,hash路由有以下特点:
      1. hash变化触发网页跳转
      2. 会改变url但是不会重新发起请求,所有的页面跳转均在客户端内操作
      3. 通过onhashchange事件进行hash的监听,实现无刷新跳转
      4. hash永远不会提交到server
    • history路由:新的url可以是与当前url同源的任一地址(与当前地址相同也可),但是会重复记录此操作
      1. 方法pushState:将url推入栈顶
      2. 方法replaceState:更改url
      3. 方法window.onpopstate:响应pushStatereplaceState的更改
      4. 存在的问题:
        1. 对当前页面刷新时重新发起请求,若nginx未匹配到当前url,则会报404
    • 路由选择:
      1. 浏览器端使用hash
      2. 客户端使用history
  41. Promise.allPromise.race

    • Promise.all:返回一个Promise对象,全部成功则res为一个数组,数组内是结果,其中一个失败则返回失败结果
    • Promise.race:返回最快得出结果的,不论成功失败