变异野生前端的某东方面试之路(直播中

2,132 阅读6分钟

游泳健身了解一下:github

1面

实际项目中最常用到的数组方法

shift,pop,push,unshift,splice,slice,join,split,reverse,等等

实现数组的 map 方法

Array.prototype.map = function({
    // todo
}

解 思路是看如何使用通过如何使用来判断条件
Array.prototype.Map = function(fn){
    1.首先我们看到当前传进来到是一个方法
    2.map return 出去的是每个循环后的总数组
    3.如何获取值,值其实就是当前的this
    let arr = []
    let array = this
    for(let i=0,len=array.length;i<len;i++){
        arr.push(fn(array[i]))
    }
    return arr
}
[1,2,3,5,5].Map(function(){

})

写一个函数将如下数组拍平并按从大到小排序

[5, [31], [4, [69]]]
// 扁平化 最快直接toString
let arr = [5, [31], [4, [69]]]
// 直接排序,但是值是一个string 所以我们进行number
arr.toString().split(',').sort((x,y)=>y-x).map(item=>Number(item))

打印出来的 this 分别是什么

const a = {
    b() {console.log(this)},
    c: () => {console.log(this)}
}
// this 指向 a 所以this 是a
a.b()
// 函数的this指向window 所以是window
a.c()
// this 指向 window.a 所以this 是a
window.a.b()


窍门: 比如x.x.x.x.x.x() 这样的 this 指向最后一个x前面那个对象
箭头函数的this指向是编译时

请写出下面代码的运行结果,并解释原因

async function async1({
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2({
    console.log('async2');
}
console.log('script start');
setTimeout(function({
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve{
    console.log('promise1');
    resolve();
}).then(function({
    console.log('promise2');
});
console.log('script end');

这个题目我还是搞错了的最后自己总结了一下,// 我搞错在 await 这个方法上了
先走主线程就是一个宏任务,然后走当前的微任务,最后按宏,微依次往下执行
async 和 await 是pomise的超集,所以也是一个微任务,在题目上且在主线程上所以会执行
1. 先走这个
console.log('script start');
2. async1 执行了所以走这个
console.log('async1 start');
3. await async2(); 相当于 resolve(function(){console.log('async2');}) 且里面的执行了 所以
console.log('async2');
4. await 组断了我们所以先执行后面
console.log('promise1');
5. resolve(); 里面并没有什么方法所以继续执行后面的
console.log('script end');
6. 都走完了 我们在接着看 await async2();后面的应该执行了
console.log('async1 end');
7. new Promise() 这个后面的resolve效果发生
console.log('promise2');
8. 当前所有的主线程的执行完毕,所以下一个宏任务setTimeout
console.log('setTimeout');
// Promise 是一个微任务 ,setTimeout 宏任务,刚开始的主线程也是一个宏任务

顺序执行每一个函数,后一个函数以前一个函数的执行结果为参数,并返回最后一个函数的执行结果;第二个括号的值作为参数传给第一个函数。

let result = compose(fn1, fn2, fn3)(1);
1.首先扔进来一堆方法
2.题目意思是首先return 一个方法出来不然最后的()执行不了
3.最后的值要放到前面的方法里面所以前面的值需要保留需要闭包
4.前后都需要参数 reduce 比for 循环更好用
let compose = function(...arr){
    let fnlist= arr
    return function(val){
        return fnlist.reduce((x,y)=>{
            return y(x)
        },val)
    }
}

Vue组件之间如何通信?父与子?子与子?

vuex
$emit
事件总线(就是发布订阅这样的)$on $emit
$children 
$parent
// 下面两个我没有回答用的少,官网说少用
inject
provide

Vue: 写一个自定义过滤器,将输出的单词首字母设置为大写

没听懂啥意思。。。就直接说了

Vue: 实现一个 toast 提示插件,说明思路并写出简要的实现代码。

之前写过一个ui

// 虽然写过了当前当时并没有回答好,时间太久了
// 从使用方考虑,我们先得注入我们的$toast 这个方法,所以得 vue.use()
// 定义需要的字段
this.$toast({
 content: "可自动关闭",
 autoClose: true
})

// 主要是通过 Vue.component()
// 之前写的时候有好多想法光table 就写了一周多,很难写table 多层 table,按钮的选择上,
借鉴了element 和 iview 整体感觉 iview比较合适个人开发观看,element 会更好一点,
jsx 写法还是有点观看上的不舒服,最后学习Java的时候就把这个耽搁了,以后会自己搞好一套的。肯定

2面

你写了小程序云开发,说说什么是云开发

serverless 巴拉巴拉一堆输出

你简历中写了比较熟悉设计模式说说有哪些设计模式

观察者模式
发布订阅模式
单例模式
工程模式
抽象工厂模式
适配器模式
代理模式,等等

你项目中使用了vue全家桶 vuex

### 当前有点晕了没怎么准备vuex,就说vue 就是一个状态管理器啥的 只准备了 vue 源码
vuex 用的mixin 混合注入的
vuex 最常见的问法就是 motations 和 actions 的区别 
    actions 可以异步 motations 不支持异步
下面的这个图是需要掌握的

你项目中使用了vue全家桶 vuerouter

### 就说了不知道
### hash 和 history 的模式 之前看过,前面回答错后面紧张了

hash 可以通过 监听当前 #/ 当前哈希的后面来改变当前页面
window.addEventlistener('hashchange',fn)

history 
history.pushState 跳转改变
window.onpopState 监听操作

了解http缓存吗

### 大厂必问(概率高)
cache-control 只说一个max-age 当前缓存时间
有时间的小伙伴可以搜索,就是强缓存和协商缓存,
其实我只看了请求报文,和响应报文就只准备了下面的
请求报文
请求首行 请求方式 路由 协议/版本号
       get      /    http/1.1
请求体
    accept */* 当前能接收的数据
    user-agent xxx 当前请求的信息
    host 当前ip | 域名

响应报文
响应首行 协议/版本号 状态 状态主体
       http/1.1    200  ok
空行
响应head
    content-type 文件类型
    content-length 文件长度
    date 时间
    下面响应内容

了解http2吗

???

webpack

没问这个 但是炒鸡重要
plugin 和 loader ?? 

3面

就是今天 ??? 被爽约了 hr 联系不上,面试大佬联系不上,
继续看我的算法,以及程序员数学,二面回答的不是很好,加强一些,算法也是大公司必须的大家也瞅瞅

最后

能看到最后🙏谢谢大家了,多多点赞在github 上面对❤️是对我最好对鼓励,我会尽量分享一些自己使用得心得以及正确对食用方式

求靠谱内推(北京地区)可以留言我 +。=