【2021 年前端复习之一】

前端性能优化经历的四个阶段

  • 第一阶段:库、框架的选型
  • 第二阶段:简单的构建化(js/css 的压缩和合并) 
  • 第三阶段:js / css 模块化开发
    • js模块化方案:AMD、CMD、CommonJs、ES6Module ;
    • CSS模块化开发基本都是在less、sass、stylus等预处理器的import/mixin特性支持下实现的
  • 第四阶段:组件化开发和资源管理

参考文章:https://link.zhihu.com/?target=https%3A//github.com/fouber/blog/issues/10

深入js隐式类型转换

https://segmentfault.com/a/1190000014983263 

https://www.cnblogs.com/iwzyuan/p/8695568.html 隐式类型转换规则

https://segmentfault.com/a/1190000014983263 隐式转换原理

阮一峰 javascript/

https://wangdoc.com/javascript/ 

promise

  • 是什么
    • 是“”承诺未来执行对象“的一种异步函数”  
    • 3中状态:pendind未完成, fullfill已完成, reject失败
  • 为什么
    • 解决 ajax 异步地狱回调怎么用
    • 实现用同步写异步代码
    • 支持多个并发请求
  • 怎么用  new Promise(function (resolve, reject) {})
    • 串联 .then ()  .then()
    • 并联 .all([p1,p2])
    • race([p1,p2]) 比较谁快用谁

canvas

  • 是什么
    • 是一块幕布,可以画图,写文字,动画,绘制图表,缩放,滤镜
  • 为什么
    • 解决 不借助 flash 插件
  • 怎么用
    • 绘制2D,getContext(‘2d’)支不支持画布功能,返回 CanvasRenderingContext2D 对象
    • 绘制 2D,getContext(‘webgl’)

jQuery

  • 是什么
    • 是 封装 js 的一个库
    • 1.xx版本兼容 IE6、7、8;2.xx移除了对 IE老版本的兼容
  • 为什么
    • 消除浏览器的差异,不用针对不同的浏览器谢冗长的代码
    • 简洁
    • 轻松实现动画,css操作
  • 怎么用 

编写  jQuery 插件的原则

  • $.fn上绑定函数
  • return this 支持链式调用
  •  设置默认值 $.extends({ }, $.fn.hightlight.defaults, options)  $.fn.hightlight.defaults
  • 用户调用设置默认值

underscore  

  • 是什么
    • 是一个第三方开源库,加绒低版本的IE浏览器,统一实现 map 、filter 函数
  • 为什么
    • 为支持 IE6-8 js 函数式编程
  • 怎么用
    • collections(为集合类对象提供接口,不包括 Map、Set)
      • _.map :遍历 / _.filter:过滤,参数可以是数组或对象
      • _.every:集合是否满足条件  / _.some :只有有一个满足条件 ,返回 true / false
      • _.max:最大值 /  min :最小值
      • _.groupBy(数组,方法) 按照返回设置的元素将数组或对象进行归类
      • _.shuffle:按照洗牌算法打乱数组 / _.sample :随机选择一个或多个元素
    • Arrays (伪数组提供方法)
      • _.first:获取第一个元素  / _.last:获取最后一个元素
      • _.faltten():将多维数组变成一位数组
      • _.zip():将多个数组按照索引所应对应起来,组成一个新的数组 / unzip:反之
      • _.object():将多个数组按索引对应起来,变成一个对象
      • _.range(number):循环出一个数组序列
      • _.uniq():对数组去重
    • functions
      • _.bind:代替 call(),将 js 原对象方法绑定上
      • _.partical:创造偏函数,固定原函数的参数
      • _.memoize:缓存,比如计算阶层
      • _.once:调用一次
      • _.delay:延迟执行函数,与 setTimeOut 相同
    • object'
      • _.key(属性名):返回对应value 的值,不包含原型链继承的属性和自身 /  allkeys():获取所有的属性,包含原型链继承的属性
      • _.values():返回自身但不包含原型链的继承属性
      • _.mapObject(obj,function(value, key)):循环遍历
      • _.invert():将 key 和value 互换
      • _.extend / extendOwn:把多个对象的 key,value 合并到一个 对象并返回,extendOwn会忽略原型链继承下来的属性
      • _.clone():浅拷贝
      • _.isEqule():深度比较
    • _.chaining() 链式调用

Node.js

  • 是什么
    • 是可以用 js 编写在后端运行的一种程序
  • 为什么
    • 不用未开发后端单独学习一门新语言,学习门槛较低,可以全栈开发
    • js 可以运用谷歌的 v8 引擎,执行效率高,性能稳定
    • 服务团队也在不断壮大
  • 怎么用
    • 模块  moule.exports
    • commonJs 规范 require
    • 模块
      • global ,类似于 window
      • process 代表 node.js 的进程
    • 基本模块(内置模块)
      • fs 读写文件
        • fs.readFile(文件名,数据,方法):异步读取文件,读取二进制流没有data,,返回的是 Buffer 对象
        • fs.readFileSync(文件名,'utf-8'):同步读取文件
        • fs.writeFile(文件名,数据,方法):异步写数据
        • fs.writeFileSync(文件名,数据):同步写数据
        • fs.stat():文件或目录的详细信息 
          • stat.isFile()
          • stat.isDirectory()
          • stat.size()
          • stat.birthtime()
          • stat.mtime()
      • stream 数据流
        • fs.createReadStream(文件名,‘uft-8’):读取流
        • 流文件.pipe(流文件):两个文件数据合并
      • http
        • .createServer(function(request, response) {  })创建 http 服务
          • request.method / request.url
          • response.writeHead(200, {'Content-Type':'text-html'}'}) /  response.end()
        • 文件服务器 url  /  path
          • ,parse(‘路径’)将字符串解析为 url 对象
          • path.resolve('.') 解析当前的目录
          • 组合拼接路径 parh.join(当前目录,‘’,页面名称)
      • crypto 提供通用的加密和哈希算法
        • MD5 / SHA1
        • Hmac 哈希算法
        • AES 对称加密算法
        • RSA 非对称加密算法
        • Diffle-Hellman 密钥交换协议
        • 数字证书

css 布局

css 布局的几种方式 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。 https://www.cnblogs.com/Renyi-Fan/p/12173366.html

  • CSS 定位详解 http://www.ruanyifeng.com/blog/2019/11/css-position.html
  • Flex 布局教程:语法篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html   https://www.runoob.com/w3cnote/flex-grammar.html
  • 设置float会有一个高度塌陷问题,如何解决? https://www.cnblogs.com/Renyi-Fan/p/12173366.html

深拷贝 && 浅拷贝

  • 浅拷贝 copy() 
    • 是新增加一个指针指向了被复制对象的内存地址,新对象改变,旧对象也改变
    • 旧对象里有值,没有引用,改变新对象的值,旧对象不会被修改,新旧对象完全分离开
    • 旧对象里有值,有引用,旧对象改变,新对象改变,有引用
    • 用法
      • 遍历
      • slice()
      • concat()
      • 扩展运算符 ...
      • create.assign(target,source)
//实现浅拷贝的思路
//1.对基础类型做一个基本的拷贝
//2.对引用类型开辟一个新的存储,并且拷贝一层对象属性
const dhslloeClone = (target) => {
    if (typeof target === 'object' && target != null) {
        const cloneTarget = Array.isArray(target)> [] : {};
        for (let prop in target) {
            if (target.hasOwnProperty(prop)) {
                cloneTarget[prop] = target[prop]
            }
        }
        return cloneTarget
    } else {
        return target
    }
}
  • 深拷贝 deepcopy()
    • 是新增了一个指针并且新增了一个内存,新旧对象互相分离
    • 旧对象里没有引用,新旧对象完全分离开
    • 旧对象里有值,有引用,新旧对象完全分离开
    • 用法
      • 乞丐版:JAON.parse(JSON.strignify())将一个对象的北荣转化为字符串,然后再生成一个新的对象
        • 局限
          • date引用类型会变成字符串(可以直接生成一个新的实例返回)
          • 无法拷贝不可枚举的属性
          • 无法拷贝对象的原型链(用Object.getOWnPropertyDescriptors()获取对象所有的属性,结合Object.create()创建一个新对象,并继承传入元独享的原型链)
          • 无法拷贝对象的循环引用(用WeakMap)
          • 对象有函数,undefined,symbol,经过序列化之后键值会消失(针对 symbol,可以用 Reflect.ownkeys())
          • 对象中有NaN,infinity,以及-infinity,序列化会变成 null
      • 存在大量深拷贝需求,用 immutable 库
  • 参开文章

函数防抖和函数节流 (长影运用:验证用户输入、resize、 scroll)

参考文章:https://www.jianshu.com/p/b7b698db8352

函数防抖

  • 是什么
    • 是解决被频繁调动事件方法,多出无用的操作,只管用户最后一次的动作再调用方法
  • 怎么用
    • 
      //例子一
      function fun () {
       console.log('resize')
      }
      
      function throttle(method, context) {
         clearTimeOut(method.timer)
         method.timer = setTimeOut(function () {
            method.call(window)
         }, 500)
      }
      
      throttle(fun, window)
      
      //例子二
          //防抖函数 执行最后一次提交的事件(搜索框输入、按钮提交)
          function debounce (fun, wait) {
              let timeout;
              return function () {
                  const context = this;
                  const args = arguments;
                  clearTimeout(timeout);
                  timeout = setTimeout(function () {
                      func.apply(context, args)
                  }, wait)
              }
          }

       

函数节流 

  • 是什么
    • 在特定的时间内只执行一次
  • 为什么
    • 解决用户滚动事件掉帧,cpiu 使用率增加,用户体验产
  • 怎么用
    • // 示例1
      var canRun = true;
      document.getElementById("throttle").onscroll = function(){
      if(!canRun){
        return
      }
      canRun  = false
      setTimeout(function () {
        canRun = true
      }, 500)
      
      }
      // 示例2
          //节流函数 在规定的时间内只执行一次 (拖拽、缩放)
          function debounce (func ,wait) {
              let timeout;
              return function () {
                  const context = this;
                  const args = arguments;
                  if (!timeout) {
                      timeout = setTimeout(function() {
                          timeout = null;
                          func.apply(context, args)
                      }, wait)
                  }
              }
          }
          

       

图片懒加载 

实现思路

  • 给每个图片设置一个自定义属性 data-src 存放真实的图片地址,src 可设置为 缓存小图片
  • 添加滚轮事件, 判断哪些图片要加载(scrollTop 滚动区域高度 + innerHeight 可视区域高度 > offsetTop 图片距离顶部的高度) 触发加载事件
  • 将 src 地址 替换真实地址

css3 新特性 https://m.html.cn/qa/css3/13608.html

  1. 选择器
  2. 文本
  3. 边框
  4. 背景
  5. 动画、旋转
  6. 渐变
  7. 多列布局
  8. flex 布局
  9. 媒体查询
  10. 过度

浏览器的内核

现在国内常见的浏览器有:IE、Firefox、QQ浏览器、Safari、Opera、Google Chrome、百度浏览器、搜狗浏览器、猎豹浏览器、360浏览器、UC浏览器、遨游浏览器、世界之窗浏览器等。

但目前最为主流浏览器有五大款,分别是IE、Firefox、Google Chrome、Safari、Opera。

作为前端开发,熟悉四大内核是非常有必要的。四大内核的解析不同使网页渲染效果更具多样化,下面总结一下各常用浏览器所使用的内核。

  1. IE浏览器内核:Trident内核,也是俗称的IE内核;
  2. Chrome浏览器内核:统称为Chromium内核或Chrome内核,以前是Webkit内核,现在是Blink内核;
  3. Firefox浏览器内核:Gecko内核,俗称Firefox内核;
  4. Safari浏览器内核:Webkit内核;
  5. Opera浏览器内核:最初是自己的Presto内核,后来是Webkit,现在是Blink内核;
  6. 360浏览器、猎豹浏览器内核:IE+Chrome双内核;
  7. 搜狗、遨游、QQ浏览器内核:Trident(兼容模式)+Webkit(高速模式);
  8. 百度浏览器、世界之窗内核:IE内核;
  9. 2345浏览器内核:以前是IE内核,现在也是IE+Chrome双内核;

 参考网址:
5大主流浏览器的差异:https://blog.csdn.net/qq_36379597/article/details/101382234
五大主流浏览器及四大内核:https://zhuanlan.zhihu.com/p/99777087?utm_source=wechat_session

DNS解析原理(输入地址后,发生了什么)

向DNS发出请求,找本地 DNS 服务器缓存,如果有,返回结果;

如果没有,就去根服务器查找,如果有,返回结果;

如果没有,就去域服务器查找,找到之后,把结果(域名解析服务器的地址)给本地 DNS 服务器,不是直接返回结果,这是为了给本地 DNS 服务器做缓存使用。 最后,本地 DNS 服务器向域名解析服务器发请求,最后返回这个 IP地址 

javaScript 执行机制(EventLoop)

https://juejin.cn/post/6844903512845860872 

继承的六种方式

https://segmentfault.com/a/1190000016184431 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值