昨天有幸的参加到了京东的金融组和物流组的面试 不过是外派的职位 虽然都顺利的经过了 不过感受可能对于外派人员的要求低一些吧 下边来给你们分享一下面试的经历吧
金融组这边其实个人技术栈是不太合适的 金融组主要是用 React 的 我只是私底下本身使用 并无真正的在项目中使用过 好在面试官好像也并非特别在乎 只是问了一下愿意学习一下 React 的使用吗 回答固然是确定的(其实我本身也一直想转成 React 技术栈) css
面试题仍是很是的基础的 而后就是对于框架的理解vue
主要是问了如下问题吧 我大概的描述一下我印象比较深的问题 至于一些做用域 做用域链 原型 原型链 和继承之类的问题我就很少作赘述了 真的是必考webpack
这些答案是我回复面试官的答案 并不是标准答案 标准答案请你们自行查阅资料web
这个方面其实问的不多 就问了两个布局面试
div {
width: 200px;
height: 200px;
}
.left {
background-color: red;
float: left;
}
.right {
background-color: #000;
margin-left: 200px;
}复制代码
Number,String,Boolean,Undefined,Null 还有 ES6 新增了一个 Symbolajax
复杂数据类型是按引用传递 改变拷贝数据的值会影响原始数据 基本数据类型是按值传递的 改变拷贝数据的值不会影响原始数据 基本数据类型存储在栈中 复杂数据类型存储在堆中vue-router
队列的特性是 FIFO(先入先出)我这里回答的是借用数组的 push 和 shift 方法 不过面试官好像更但愿我说一个本身实现 push 和 shift 的思路 因此这个应该也算没有回答好vuex
Let
Const
Promise
Object.assign
Object.keys
Reflect.ownKeys
数组的 map flat filter reduce isArray
async/await(其实应该是 ES7 的)
Number 的 isNaN isInfinite
解构赋值
函数默认值
rest 参数
Class
模块
forof 循环
Symbol
箭头函数等等的东西把
这里主要就是问了一些异步相关的 好比 Promise 的用法 如何捕获错误 有什么其余的方法 这里主要是回答 finally race 还有 all 这几个方法的用法 finally 得触发时机 若是进入了 catch 流程是否还会触发 finally 的触发取决于他出现的位置 若是他出如今 then 和 catch 以前就会在 then 和 catch 以前触发 无论有没有被 catch 都不会影响 finally 的触发
我还特别的提了一下若是 all 中的参数若是有本身的 catch 逻辑 那么即便这个 Promise 出错 也不会进入 all 方法的 catch 逻辑 由于被 catch 过的 Promise 在不抛出错误或者返回一个失败的 Promise 就会返回一个成功的 Promise
这里能够参考MDN的文档: developer.mozilla.org/zh-CN/docs/…数据库
箭头函数和普通函数有哪些不一样
箭头函数的 this 指向他建立时候的上下文 箭头函数不能做为构造函数 由于他没法经过任何方式改变 this 指向后端
这里就很少赘述了 老生常谈的问题 这个应该回答的没有问题 你们也能够本身在这中间引伸出一些本身了解的问题 好比 TCP 的三次握手四次挥手 这个感受回答的面试官还算满意
客户端和服务器之间用于传输 HTTP 数据的 TCP 链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接
原理没回答上来 只是知道是一种基于 http 和 tcp 的新协议 也不知道这算不算原理(我感受不算 😄) 使用 websocket 的缘由就是为了保证数据的实时性 减少服务器的请求压力 由于咱们须要一秒推送两次数据(有 k 线图和实时订单的存在 还有同步服务器时间) 因此若是使用 ajax 轮询会发送大量的请求 给服务器带来很大的压力
跨域是由于浏览器的同源策略 不容许加载不一样源的服务器上的资源 (域名协议端口其中任何一个不一样都会引发跨域) 解决方法就是 CORS 这应该是如今最主流的解决方法了 后端设置一下便可 其实还有不少其余的 好比JSONP window.name什么的古老方法 这里你们能够多说几个
name
data
components
methods
mixins
computed
watch
props
inject
provide
filters
directives
生命周期钩子
路由钩子
keepalive 的钩子
反正看你了解的程度来吧 我只说了我用过的 我很怕说一个没用过的给本身挖坑
computed 通常用于组织数据 返回一个特定的格式 咱们通常但愿 computed 是一个纯函数(没有反作用) 即在使用 computed 的过程当中不会改变实例的数据等 传入相同的参数 返回的结果一致 computed 会缓存上一次计算的结果 若是其中的依赖没有发生变化 不会再次计算 直接返回缓存的结果 在作一些有复杂的逻辑和具备反作用的操做时 咱们会使用 watch
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestory
destoryed
一些请求数据的操做会放在 created 中由于这时实例的数据等已经初始化完成 还有一些绑定事件监听的操做会在这一周期完成
一些须要操做 dom 的操做要放在 mounted 里 好比使用 echarts 初始化一个容器 由于此时视图才开始渲染 最好是放在 nextTick 中调用 不然不必定能拿到 dom 实例(这里不少人有误区 认为组件挂载完毕就是渲染完毕了 其实此时刚刚开始渲染 能够参考Vue 官方文档中对于这一辈子命周期的描述 cn.vuejs.org/v2/api/#mou…)
一些解绑事件的操做会放在 destoryed 这个阶段 好比 echarts 实例的销毁操做 websocket 的断开操做以及一些事件解绑等操做(不是组件上的事件 组件上的事件会在销毁后自动解绑 通常是指你在 created 中绑定的事件)
props 能够接受父组件传输的数据 能够接收一个对象的方式对数据的类型等作一些约束 父子组件传值能够经过在子组件上绑定一个自定义方法 由子组件使用 emit 来触发这个方法改变父组件的值 能够经过.sync 修饰符来简化这一流程 兄弟组件传值能够寻找公共的父级做为数据的承载者 或者使用 eventbus 等来传递数据 固然仍是有vuex
能够是一个对象 可是是一个对象会让全部的组件共享一个数据内存空间 修改其中的一个就会更改全部组件的属性
在公共数据比较多或者组件间传值较为复杂的时候使用 vuex vuex 主要是由 state mutation action getter 组成 (还有模块化的概念 不过主要是这四个)
state 用来保存数据 mutation 用来更改数据
action 主要是作一些异步的操做 而后提交一个 mutation 来更改数据
在组件中使用 store 中的数据能够用 vuex 给咱们提供的一些工具方法 mapStates mapActions mapGetters mapMutations 等 也可使用 this.$store.state.xxx 这种方式 每一个组件均可以访问到 store 的缘由在这(vuex 源码中的 init 方法)
function vuexInit () {
const options = this.$options
// store injection
if (options.store) {
this.$store = typeof options.store === 'function'
? options.store()
: options.store
} else if (options.parent && options.parent.$store) {
this.$store = options.parent.$store
}
}复制代码
vuex 帮咱们在实例上挂载了$store 这个对象
主要是利用了 Object.defineProperty 来作一个数据的劫持 配合发布/订阅者的模式来实现双向的绑定(这里你们能够详细的讲解一下这里的具体实现感受会更好 我好久没有再研究 vue 的源码了 因此怕给本身挖坑 就没有详细的说这个)
Hash 模式的兼容性更好 原理是经过监听 hashchange 来作页面的跳转 History 主要是使用了 History Api 中 pushState 和 replaceState 不会发送请求的特性来作页面跳转 经过监听 popstate 来作页面的跳转 History 模式须要后端配合将不存在的路由路径指向 index 页面 不然会报错
就是常见的那几个 200 301 302 304 400 401 403 404 500 502 这种 能够经过 304 状态码引伸出缓存的话题(若是你了解的话)
缓存分为强缓存和协商缓存
强缓存主要是经过设置 cache-control 和 expires 来设置 cache-control 的优先级高于 expires 主要是由于 expires 是绝对时间 根据用户本地时间来计算 并不许确 因此可使用 cache-control 的相对时间来设置
协商缓存主要是 last-modified 和 etag etag 实际上是对 last-modified 的缺点作了一点补充 由于 last-modified 只会关注他最后修改的日期 不会在乎内容是否变化 etag 是根据文件内容计算出一个惟一值 这样只要文件内容不变 就不会从新请求
这些就是在面试中主要聊的问题吧 而后但愿能够对你们带来一些帮助
(再次重申 是我回复面试官的答案 不是标准答案)