面试准备

1.本地存储

  • navigator.onLine 判断设备是否能上网
  • HTML5应用缓存,为离线web应用设计,可以用一个描述文件manifest file,列出要下载和缓存的资源

1.1 cookie

  • document.cookie 可以访问cookie
  • cookie 在客户端存储会话信息,用于保存客户端状态
  • 响应中包含Set-Cookie字段,要求设置相应cookie
  • 向相同域名发送请求都会包含这个cookie
  • 浏览器对cookie数量限制在每个域30或50个,超过cookie数量,浏览器就会清楚之前设置的cookie,删除最少使用的cookie,为了绕开限制可以使用子cookie
  • cookie大小限制在4095B范围内
  • cookie是由分号隔开,需要用encodeURIComponent编码后存入
  • 可以添加HTTP-only字段,cookie只能从服务器读取,

1.2 localStorage

持久化存储数据,同源策略

  • clear
  • setItem
  • getItem
  • removeItem
  • length 获取有多少键值对在Storage对象中
    在safa上,无痕模式下去写入LocalStorage会报错,要注意捕获异常

1.3. SessionStorage

存储会话数据,数据只保持到浏览器关闭

  • 对存储数据进行修改,都会在文档上触发storage事件
  • 每个来源2.5M的大小限制

1.4 IndexedDB

同源策略,对象存储数据库,所有操作为异步执行,客户端本地数据库

2.nodejs

  • 中间件
    是一个处理请求对象和响应对象的函数,在express请求响应循环中,下一个内联的中间件通常用变量next表示
  • 执行任何代码
  • 修改请求和响应对象
  • 终结请求-响应循环
  • 调用堆栈中的下一个中间
    如果中间件没有终结请求响应循环,则必须调用next方法将控制权交给下一个中间件,否则请求就会挂起
  • 常用中间件
    • flash
      后台管理部分用于显示成功和错误信息
    • wechat, wechatCenter
      用于处理微信公众号发过来的请求,

4.preact

  • 与React相同的API,更容易迁移
  • 更小的体积,更适用于移动端,首屏渲染时间小于React
  • 渲染性能更好
  • 专注于React服务端渲染
  • 花更多时间去解决更关键的问题,而不是花在使用替换方案和解决其兼容性上
  • React项目使用在自己的核心产品上

3.React生命周期

生命周期分为挂载,渲染,卸载这几个阶段

  • 挂载阶段
    componentWillMount可以在render方法之前执行,componentDidMount会在render方法之后执行,在componentWillMount中调用setState方法,组件会更新state,但组件只渲染一次

  • 卸载阶段
    componentWillUnmount
    执行一些清理方法,事件回收或是清除定时器

  • 更新阶段
    如果组件自身的state更新了,会依次执行

    • shouldComponentUpdate
      接受更新的props和state,在需要时更新,不需要时不更新,即是否执行虚拟DOM对比
  • componentWillUpdate
    渲染前后时刻,不能执行setState,会造成死循环,自身调用自身

  • componentDidUpdate
    渲染之后时刻

  • componentWillReceiveProps
    在props传入后,渲染之前setState,这里调用setState不会二次渲染

  • 可以使用setstate的有
    componentWillMount
    componentDidMount
    componentWillReceiveProps
    componentDidUpdate

  • 将无状态组件写成函数组件
    展示型组件,也无法使用组件的生命周期方法

4.React性能优化

1.如果新的props和旧的一样,这是React还是要进行虚拟DOM的diff,,这个diff就是多余的性能损耗,而且在DOM结构比较复杂的情况,整个diff会花费较长的时间
可以通过集成React.pureComponent纯组件来优化性能,它重写了shouldComponentUpdate,浅比较Props和state,当两者相等时返回false,这样组件就不会进行虚拟DOM的diff
2.有特殊需求时,可以使用shouldComponentUpdate来判断是否需要更新组件,比如判断传入数据的id是否有变化等等
3.diff算法不会尝试比较不同组件类的子树,如果发现正在使用的两个组件类输出的DOM结构非常相似,可以把这两个组件类改成一个组件类
4.不要进行DOM节点跨层级的操作,保持稳定DOM结构有助于性能的提升,可以通过CSS隐藏和显示节点,而不是真正地移除和添加DOM节点
5.React会将所有显示到DOM的字符串转义,防止XSS

5.使用Symbol设置私有属性

let Person=(function(){
    let _name=Symbol();
    class Person{
        constructor(name){
            this[_name]=name;
        }

        get name(){
            return this[_name];
        }
    }
    return Person;
})();

let a=new Person('red');
console.log(a.name);

首先在函数作用域内创建属性名,使用闭包引用这个变量,就不会被垃圾回收器回收,接着使用Symbol设置属性名,保证不会重名,且外部无法生成同样的值,保证唯一性

6.express特点

  • 自带路由和路由规则,需要body-parser解析请求主体
  • 使用一个接一个的中间件的线性结构

7.koa特点

  • 洋葱模型,调用next下一个中间件的前后都能执行相应的代码

8.HTTP请求报文和响应报文

8.1 请求报文

请求报文由

  • 请求行,请求头部,请求主体构成
    请求行包含请求方法,请求URL,HTTP协议及版本
    响应报文
  • 响应行,响应头部,响应主体构成
    响应行包含HTTP协议及版本,状态码及描述

9.性能优化

  • 根据User-Agent判断浏览器的类型,如果是谷歌浏览器返回webp格式

10.请求报文和响应报文

请求报文由

  • 请求行
    请求方法,URL字段,HTTP协议版本
  • 请求头部
    User-Agent 请求浏览器的类型
    Host 请求的主机名
  • 请求主体

响应报文

  • 响应行
    状态码,HTTP协议版本
  • 响应头部
    Set-Cookie字段
    Content-Type字段
  • 响应主体

11.垃圾回收机制

内存分配量达到了一个临界值,垃圾收集器就会运行,这个临界值会动态调整。
如果垃圾回收的内存分配量低于15%,那么临界值就会加倍,垃圾回收的内容分配量高于85%,那么临界值会重置为默认值

12.ES6

及时清除引用是非常重要的,WeakSet和WeakMap对值的引用都是不计入垃圾回收机制的,这是弱引用,一旦消除对该节点的引用,它占用的内存就会被垃圾回收机制释放,WeakMap保存的键值对也会自动消失,向向对象上添加数据,又不想干扰垃圾回收机制,就可以使用WeakMap

  • WeakSet
    • 防止不重复值得集合,成员只能是对象,而不能是其他类型的值
    • WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用
    • 内部有多少成员取决于垃圾回收机制有没有运行,运行前后成员个数不同,垃圾回收机制何时运行是不可预测的
    • WeakSet不可遍历

13.暂时性死区

只要在块级作用域内存在let命令,声明的变量就绑定这个区域,不再受外部影响,在声明之前使用变量,会报错
只要已进入当前作用域,索要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才能获取和使用该变量

14.前端SEO

  • 合理的title,description,keywords
  • 语义化HTML代码
  • 重要内容HTML代码放在最前 搜索引擎对抓取的长度有限制
  • 重要内容不要用js输出
  • 少用iframe
  • 非装饰性图片必须加alt
  • 提高网站速度:网站速度是搜索引擎排序的一个重要指标
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • JS 基础 数据类型 JavaScript的数据类型分为两类,原始类型和对象类型 原始类型 数字 字符串 布尔值 ...
    还是那个西瓜阅读 309评论 0 0
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,834评论 1 18
  • 林高远哪里见过这样的架势,只闭了眼拧着两道眉,宽松到晃荡的衣袖下青筋露了半截出来,突兀地鼓在细瘦的手腕上,汩汩地跳...
    上目线阅读 637评论 0 0
  • 在漫长的绿皮车的旅途中,把剩下的一口气看完了。感觉封面的嘘头有点大了,没有很深的感受,也没有读完舍不得放下的...
    晴天先生阅读 283评论 0 1
  • (P147-150,一个漫长的春天4月14日) 其实标题只是跟这次的记录内容相关而已。其实这次的记录很奇特,...
    猜猜我为什么叫闪电阅读 407评论 0 1