前端知识

🔴重点🟠难点🟡性能🟢算法🔵JS高阶🟣框架

JS知识点

  1. get、post(请求参数长度限制)——HTTP协议

    1. 两者区别
    2. GET 和 POST
  2. 原型链

    1. gitee -> 原型链代码

    2. processOn 思维导图

      image-20211217103257781

  3. mouseover、mouseenter

    1. 文章

    2. 共同点:鼠标移入元素触发事件

    3. 不同点:

      • mouseover:若存在子元素,则会冒泡触发多次mouseover事件

        mouseover

      • mouseenter:不存在子元素冒泡,也就是鼠标移入只会触发一次mouseenter事件

        mouseenter

  4. 可视区域高度

    可视区域就是不包括上下左右的工具栏、状态栏(滚动条特殊)。代码:

    1
    2
    3
    4
    5
    6
    //可视区域宽度
    document.documentElement.clientWidth
    document.body.clientWidth
    //可视区域高度
    document.documentElement.clientHeight
    document.body.clientHeight

    document.documentElement也可以为document.body

    1
    2
    3
    4
    //水平滚动条的位置
    document.documentElement.scrollLeft
    //垂直滚动条位置
    document.documentElement.scrollRight
  5. defer(异步加载js)

    1. defer和async
    2. defer和async简洁版
  6. 防抖节流

    1. 防抖(高阶)

      1
      2
      3
      4
      5
      6
      function debounce(method, context, param) {
      clearTimeout(method.tId);
      method.tId = setTimeout(function () {
      method.apply(context, param);
      }, 500);
      }
    2. 防抖(闭包型)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      function debounce(method, time) {
      let out = null;
      let that = this;
      return function (args) {
      clearTimeout(out);
      out = setTimeout(() => {
      method.call(that, args);
      }, time);
      };
      }
    3. 节流(自定义)

      参考文章

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      function throlle(method, timeout = 1000) {
      let out;
      let last;
      return function (...args) {
      let now = new Date();
      if (now - last < timeout) {
      clearTimeout(out);
      out = setTimeout(() => {
      method(...args);
      }, timeout);
      } else {
      last = now;
      method(...args);
      }
      };
      }
  7. 事件流

    1. JS事件流和事件委托

    2. 你真的理解 事件冒泡 和 事件捕获

    3. 阻止冒泡,阻止默认事件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      c.addEventListener(
      'click',
      e => {
      console.log('c 冒泡');
      e.stopPropagation();//阻止冒泡
      return false//阻止默认事件
      },
      false
      );

      注意:return false 不仅阻止了事件往上冒泡,而且阻止了事件本身(默认事件)。event.stopPropagation()则只阻止事件往上冒泡,不阻止事件本身

    4. javascript 事件流

  8. JS拖拽

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // 拖动开始-->拖动过程中-->拖动结束
    // 监听目标DOM的onmousedown事件→document的onmousemove→document的onmouseup
    //记录旧坐标鼠标移动后记录下新坐标,通过新坐标减去旧坐标得出变化的坐标,然后改变其位置
    function drag(ele) {
    let oldX, oldY, newX, newY; //存储新旧鼠标位置

    // 元素点击事件
    ele.onmousedown = function (e) {
    oldX = e.clientX; //存储鼠标当前位置(初始化位置)
    oldY = e.clientY;
    if (!this.style.left && !this.style.top) {
    //如果元素无初始值,则需要赋值
    this.style.left = 0;
    this.style.top = 0;
    }

    // 鼠标移动事件
    document.onmousemove = function (e) {
    newX = e.clientX; //存储移动后的鼠标位置
    newY = e.clientY;
    // 移动后的位置 = 当前位置 - (移动后的鼠标位置-移动前的鼠标位置)
    ele.style.top = parseFloat(ele.style.top) + (newY - oldY) + 'px';
    ele.style.left = parseFloat(ele.style.left) + (newX - oldX) + 'px';

    oldX = newX; //移动完后旧鼠标位置为新鼠标位置
    oldY = newY;
    };

    // 鼠标松开事件
    document.onmouseup = function () {
    // 解绑事件
    document.onmousemove = null;
    document.onmouseup = null;
    };
    };
    }
  9. js drag api

    HTML5 拖放(Drag 和 Drop)详解与实例 - 风雨后见彩虹 - 博客园 (cnblogs.com)

    在被拖动的元素上需定义

    1
    <img src="./PoinkoParrot2.jpeg" alt="" id="draggable" draggable="true" />

    在拖放的过程中会触发以下事件:

    • 在拖动目标上触发事件(源元素):

      • ondragstart - 用户开始拖动元素时触发
      • ondrag - 元素正在拖动时触发
      • ondragend - 用户完成元素拖动后触发
    • 释放目标时触发的事件:

      • ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
      • ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
      • ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
      • ondrop - 在一个拖动过程中,释放鼠标键时触发此事件
  10. eval

  11. AMD、CMD、CommonJs

  12. 🟠js监听对象属性改变(vue属性监听)

  13. JS实现跨域

  14. JS深度拷贝(浅拷贝、深拷贝…)

    image-20211222145748666

  15. 重排重绘

  16. 🟠JS全排列

    • 前端电商 sku 的全排列算法很难吗?学会这个套路,彻底掌握排列组合

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      let combine = function (...chunks) {
      let res = [];
      let helper = function (chunkIndex, prev) {
      let chunk = chunks[chunkIndex];
      let isLast = chunkIndex === chunks.length - 1;
      for (let val of chunk) {
      let cur = prev.concat(val);
      if (isLast) {
      // 如果已经处理到数组的最后一项了 则把拼接的结果放入返回值中
      res.push(cur); //将最后一个数组的所有选项分别压入
      } else {
      helper(chunkIndex + 1, cur);
      }
      }
      };
      // 从属性数组下标为 0 开始处理
      // 并且此时的 prev 是个空数组
      helper(0, []);
      return res;
      };

      let names = ['iPhone X', 'iPhone XS'];
      let colors = ['黑色', '白色'];
      let storages = ['64g', '256g'];
      let res = combine(names, colors, storages);

      console.log(res);
      /* result
      [
      [ 'iPhone X', '黑色', '64g' ],
      [ 'iPhone X', '黑色', '256g' ],
      [ 'iPhone X', '白色', '64g' ],
      [ 'iPhone X', '白色', '256g' ],
      [ 'iPhone XS', '黑色', '64g' ],
      [ 'iPhone XS', '黑色', '256g' ],
      [ 'iPhone XS', '白色', '64g' ],
      [ 'iPhone XS', '白色', '256g' ]
      ]
      */

      image-20211224151929493

  17. this指向、隐式丢失、显式绑定

  18. 🟠virtual dom

  19. vue生命周期

  20. 🔴🟠Promise底层实现

  21. 事件监听

  22. Generator

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // generator
    function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
    }
    let res = foo(1);
    console.log(res.next());//{ value: 2, done: false }
    console.log(res.next());//{ value: 3, done: false }
    console.log(res.next());//{ value: 4, done: true }
  • 生成自增id函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function* next_id() {
    let id = 0;
    while (true) {
    // !不是阻塞执行,是yield时跳出函数并储存当时的状态。
    // !执行next()时还原当时的状态,从上次yield的位置向下执行
    yield ++id;
    }
    }
    let a = next_id();
    console.log(a.next().value); //1
    console.log(a.next().value); //2
    console.log(a.next().value); //3
    console.log(a.next().value); //4
    console.log(a.next().value); //5
  1. arguments(箭头函数)

  2. 🔴🟠🔵继承

  3. 🔴script——async属性

  4. 🔴jsonp——跨域的解决

  5. 🔴ajax的返回状态——Fetch

  6. dns预加载(缓存)dns-preFetch

  7. 🔵函数柯里化(currying)

  8. 骨架屏

    什么是骨架屏 - 简书 (jianshu.com)

    如何实现优美的骨架屏 - 知乎 (zhihu.com)

  9. 🔴启动性能(异步)(前端性能优化)

  10. HTTP缓存机制

    (建议精读)HTTP灵魂之问,巩固你的 HTTP 知识体系 - 掘金 (juejin.cn)

    面试精选之http缓存 - 掘金 (juejin.cn)

    HTTP—-HTTP缓存机制 - 掘金 (juejin.cn)

  11. websocket、AJAX

    WebSocket:5分钟从入门到精通 - 掘金 (juejin.cn)

  12. TCP/IP模型(计算机网络)

    计算机网络-运输层 | Dong (gitee.io)

    [计算机网络-网络层 | Dong (gitee.io)](https://ypigy.gitee.io/2021/04/18/网络层/#网际协议 IP)

  13. 🟠gulp、webpack(打包原理)

    Webpack 模块打包原理 - 掘金 (juejin.cn)

    对比webpack,你更应该先掌握gulp【10分钟教你彻底掌握gulp】 - 掘金 (juejin.cn)

    webpack打包原理 ? 看完这篇你就懂了 ! - 掘金 (juejin.cn)

  14. PWA

    面试官:请你实现一个PWA 我:😭 - 掘金 (juejin.cn)

  15. 🔴单元测试

    如何做前端单元测试 - 掘金 (juejin.cn)
    前端单元测试入门与最佳实践 - 掘金 (juejin.cn)

  16. 🔴seo优化

    基于Vue SEO的四种方案 - SegmentFault 思否

    前端搜索引擎优化(SEO)的技巧 - 掘金 (juejin.cn)

    前端SEO优化 - 掘金 (juejin.cn)

  17. grid栅格布局

    最强大的 CSS 布局 —— Grid 布局 - 掘金 (juejin.cn)

  18. bigint

    JS最新基本数据类型:BigInt - 掘金 (juejin.cn)

  19. 🔴🟠0.1+0.2 ?(是0.3吗)

    用了一天时间,我终于彻底搞懂了 0.1+0.2 是否等于 0.3! - 掘金 (juejin.cn)

  20. osi七层模型(计算机网路)

    分类: 计算机网络 | Dong (gitee.io)

  21. 🔴head、状态码

    http协议 | Dong (gitee.io)

    http状态码总结_wzx19840423的专栏-CSDN博客_http状态码

    HTTP状态码(HTTP Status Code)_Sweet oDream-CSDN博客

  22. 声明式绑定(REACT Query/ Apollo GtaphQL Client)
    等有学react再来吧

  23. 假数据生产(Yapi、RAP2、Apifox)

    1. YApi 接口管理平台 (hellosean1025.github.io)
    2. RAP接口管理平台 (taobao.org)
    3. 阿里妈妈前端团队出品的开源接口管理工具RAP第二代
    4. Apifox
  24. BFF架构

    第 016 期 前后端经常争吵? - BFF 了解一下 - 掘金 (juejin.cn)

    微服务/API时代的前端开发] BFF入门–5个实用的BFF使用案例 - 掘金 (juejin.cn)

    初识BFF架构设计 - 掘金 (juejin.cn)

  25. 🔴文档碎片

    前端性能优化:创建文档碎片 - 掘金 (juejin.cn)

    性能优化之文档碎片 - 知乎 (zhihu.com)

  26. 🔴宏任务、微任务(同步异步)

    直接看js代码and思维导图(可以的话整个笔记)

  27. compose函数

    JavaScript中的compose函数和pipe函数 - 掘金 (juejin.cn)

  28. forEach跳出循环(终止并返回值)

    面试官问我JS中forEach能不能跳出循环 - 掘金 (juejin.cn)看完看看评论,挺有意思的

  29. shell命令

    Shell常见命令实践 - 掘金 (juejin.cn)

  30. git命令

    1. 合并代码冲突(merge&rebase)
    2. 代码回滚(reset&checkout)
    3. 代码暂存(stash)
  31. linux命令

  32. Element.

    1. getBounding
    2. IntersectionOberver
    3. createNodeIterator
    4. getComputedStyle
    5. getPropertyValue
    6. MutationObserver
  33. ES6常用方法

网址

  1. 编程学习
  2. 面试题:
  3. 组件库
  4. Vue源码(一些数据结构)
  5. 现代web开发困局
  6. 为什么 WeakSet 和 WeakMap 无法获取到元素的数量,也无法迭代其中的元素
  7. JS垃圾回收机制
  8. 前端性能优化
  9. gzip
  10. PWA
  11. 前端学习路线以及知识体系:
  12. 11个非常有用的HTML单行代码🎃 - 掘金 (juejin.cn)
  13. 「前端该如何优雅地Mock数据🏃」每个前端都应该学会的技巧 - 掘金 (juejin.cn)