- 内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟
- 内存泄露是指你用不到(访问不到)的变量,依然占居着内存空间,不能被再次利用起来
- 意外的全局变量,这些都是不会被回收的变量(除非设置 null 或者被重新赋值),特别是那些用来临时存储大量信息的变量
- 周期函数一直在运行,处理函数并不会被回收,jq 在移除节点前都会,将事件监听移除
- js 代码中有对 DOM 节点的引用,dom 节点被移除的时候,引用还维持
- JavaScript 中 4 种常见的内存泄露陷阱
babel把ES6转成ES5或者ES3之类的原理是什么
- 它就是个编译器,输入语言是ES6+,编译目标语言是ES5
- babel 官方工作原理
- 解析:将代码字符串解析成抽象语法树
- 变换:对抽象语法树进行变换操作
- 再建:根据变换后的抽象语法树再生成代码字符串
Promise 模拟终止
- 当新对象保持“pending”状态时,原Promise链将会中止执行。
- return new Promise(()=>{}); // 返回“pending”状态的Promise对象
- 从如何停掉 Promise 链说起(promise内存泄漏问题)
promise 放在try catch里面有什么结果
- Promise 对象的错误具有冒泡性质,会一直向后传递,直到被捕获为止,也即是说,错误总会被下一个catch语句捕获
- 当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直至被捕获
网站性能优化
- http 请求方面,减少请求数量,请求体积,对应的做法是,对项目资源进行压缩,控制项目资源的 dns 解析在2到4个域名,提取公告的样式,公共的组件,雪碧图,缓存资源,
- 压缩资源,提取公共资源压缩,提取 css ,js 公共方法
- 不要缩放图片,使用雪碧图,使用字体图表(阿里矢量图库)
- 使用 CDN,抛开无用的 cookie
- 减少重绘重排,CSS属性读写分离,最好不要用js 修改样式,dom 离线更新,渲染前指定图片的大小
- js 代码层面的优化,减少对字符串的计算,合理使用闭包,首屏的js 资源加载放在最底部
js 自定义事件实现
- 原生提供了3个方法实现自定义事件
- createEvent,设置事件类型,是 html 事件还是 鼠标事件
- initEvent 初始化事件,事件名称,是否允许冒泡,是否阻止自定义事件
- dispatchEvent 触发事件
angular 双向数据绑定与vue数据的双向数据绑定
- 二者都是 MVVM 模式开发的典型代表
- angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟,的对象放入到事件监测的脏队列,当数据变化的时候,触发 $diget 方法进行数据的更新,视图的渲染
- vue 通过数据属性的数据劫持和发布订阅的模式实现,大致可以理解成由3个模块组成,observer 完成对数据的劫持,compile 完成对模板片段的渲染,watcher 作为桥梁连接二者,订阅数据变化及更新视图
get与post 通讯的区别
- Get 请求能缓存,Post 不能
- Post 相对 Get 安全一点点,因为Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,Post 不会,但是在抓包的情况下都是一样的。
- Post 可以通过 request body来传输比 Get 更多的数据,Get 没有这个技术
- URL有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的
- Post 支持更多的编码类型且不对数据类型限制
有没有去研究webpack的一些原理和机制,怎么实现的
- 解析webpack配置参数,合并从shell传入和webpack.config.js文件里配置的参数,生产最后的配置结果。
- 注册所有配置的插件,好让插件监听webpack构建生命周期的事件节点,以做出对应的反应。
- 从配置的entry入口文件开始解析文件构建AST语法树,找出每个文件所依赖的文件,递归下去。
- 在解析文件递归的过程中根据文件类型和loader配置找出合适的loader用来对文件进行转换。
- 递归完后得到每个文件的最终结果,根据entry配置生成代码块chunk。
- 输出所有chunk到文件系统。
ES6模块与CommonJS模块的差异
- CommonJs 模块输出的是一个值的拷贝,ES6模块输出的是一个值的引用
- CommonJS 模块是运行时加载,ES6模块是编译时输出接口
- ES6输入的模块变量,只是一个符号链接,所以这个变量是只读的,对它进行重新赋值就会报错
模块加载AMD,CMD,CommonJS Modules/2.0 规范
- 这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的
- 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行
- CMD 推崇依赖就近,AMD 推崇依赖前置
Node 事件循环,js 事件循环差异
- Node.js 的事件循环分为6个阶段
- 浏览器和Node 环境下,microtask 任务队列的执行时机不同
- Node.js中,microtask 在事件循环的各个阶段之间执行
- 浏览器端,microtask 在事件循环的 macrotask 执行完之后执行
- 递归的调用process.nextTick()会导致I/O starving,官方推荐使用setImmediate()
浅拷贝和深拷贝的问题
- 深拷贝和浅拷贝是只针对Object和Array这样的复杂类型的
- 也就是说a和b指向了同一块内存,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝
- 浅拷贝, ”Object.assign() 方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象
- 深拷贝,JSON.parse()和JSON.stringify()给了我们一个基本的解决办法。但是函数不能被正确处理
开放性问题
开放性问题主要是考察候选人业务积累,是否有自己的思考,思考问题的方式,没有标准答案。不过有些问题挺刁的,哈哈哈哈,比如:" 你见过的最好的代码是什么? "总之提前准备下没错。
- 先自我介绍一下,说一下项目的技术栈,以及项目中遇到的一些问题
- 从整体中,看你对项目的认识,框架的认识和自己思考
- 项目中有没有遇到什么难点,怎么解决
- 如果你在创业公司你怎么从0开始做(选择什么框架,选择什么构建工具)
- 说一下你项目中用到的技术栈,以及觉得得意和出色的点,以及让你头疼的点,怎么解决的
- 一个业务场景,面对产品不断迭代,以及需求的变动该怎么应对,具体技术方案实现
- 你的学习来源是什么
- 你觉得哪个框架比较好,好在哪里
- 你觉得最难得技术难点是什么
- 你见过的最好的代码是什么
作者: Belinda 原文:https://segmentfault.com/a/1190000015916686
閱讀更多 全棧取經之路 的文章