工作环境是真的好啊。进门是类似于咖啡馆似的休息厅,装修风格也很时尚,充满了鲜活的气息。
接待的小姐姐也很好,全程眯着眼睛笑着哈哈哈哈哈。
笔试题:
1、有关Promise的输出流程
-
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(3);
})
console.log(4); // 1 2 4 3
2、数组去重
-
// set
function unique (arr) {
return Array.from(new Set(arr))
}
// splice
function unique(arr){
for(var i=0; i<arr.length; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个
arr.splice(j,1);
j--;
}
}
}
return arr;
}
3、计算一个字符串中,每个字符的个数
-
var str = "sdwprwqsjxg",json = {};
for (var i = 0, l = str.length; i < l; i++) {
json[str[i]] = (json[str[i]] + 1) || 1;
}
console.log(json);
4、读取数组中的最大值,数组中每个数加一个固定的number,如果结果大于这个最大值输出true,小于输出false
-
const arr = [1, 2, 3, 4, 10, 15];
let num = 6
let maxNum = Math.max(
5、写防抖函数
-
function debounce(func, delay) {
let timer = null
return function (
6、取两个数组交集元素
-
let a = [1, 2, 3], b = [2, 4, 5]
let intersection = a.filter(v => b.includes(v)) // [2]
console.log(intersection);
7、数组方法
-
方法 说明 push() 添加元素到数组末尾 pop() 删除数组末尾元素 unshift() 添加元素到数组的头部 shift() 删除数组最前面元素 indexOf() 查看某个元素在数组中的位置 splice(start, num, value) 实现增删改操作(start开始下标,num删除元素个数,value插入或替换的元素) slice(begin, end) 浅拷贝数组并返回拷贝后的新数组 Array.from() 从一个类似数组或可迭代对象中创建一个新的数组实例 fill(value, start, end) 用一个固定值填充数组中[start,end)的全部元素
问题:
1、水平、垂直居中的方法
-
不知道子元素的宽度和高度
-
容器display:flex; justify-content:center; align-items:center;
-
-
知道子元素的宽度和高度
-
容器position:relative; 子元素position:absolute; top:50%; left:50%; transform: translate(-50%, -50%);
-
2、computer和watch的区别
-
watch:处理一个数据影响多个数据
-
computer:处理一个数据受多个数据影响
3、在生命周期中什么时候读不到“this”
-
这个我认为是在渲染成DOM前是读不到的(mounted之前)
4、vue从data改变到页面渲染的过程(当data中新增了一个元素,发生了什么)
-
(1)new Vue,执行初始化。
-
(2)挂载$mount方法,通过自定义Render方法、template、el等生成Render函数。
-
(3)通过Watcher监听数据的变化。
-
(4)当数据发生变化时,Render函数执行生成VNode对象。
-
(5)通过patch方法,对比新旧VNode对象,通过DOM Diff算法,添加、修改、删除真正的DOM元素;
5、action和mutation的使用
-
action主要处理的是异步的操作,mutation必须同步执行,而action就不受这样的限制,也就是说action中我们既可以处理同步,也可以处理异步的操作
-
action改变状态,最后是通过提交mutation
6、解释一下闭包
-
闭包就是能够读取其他函数内部变量的函数;一个函数内部的函数
-
用处
-
可以读取函数内部的变量
-
让这些变量的值始终保持在内存中。
-
封装私有变量
-
7、flex布局的属性
-
父容器上的属性
-
设置主轴的方向:flex-direction
-
row: 默认值,主轴为水平方向从左到右;
-
row-reverse: 主轴为水平方向从右到左;
-
column: 主轴为垂直方向从上到下;
-
column-reverse: 主轴为垂直方向从下到上
-
-
设置子容器沿主轴排列:justify-content
-
位置排列:
-
flex-start:起始端对齐
-
flex-end:末尾段对齐
-
center:居中对齐
-
-
分布排列:
-
space-around:子容器沿主轴均匀分布,位于首尾两端的子容器到父容器的距离是子容器间距的一半。
-
space-between:子容器沿主轴均匀分布,位于首尾两端的子容器与父容器相切。
-
-
-
设置子容器如何沿交叉轴排列:align-items
-
位置排列:
-
flex-start:起始端对齐
-
flex-end:末尾段对齐
-
center:居中对齐
-
-
基线排列:
-
baseline:基线对齐,这里的
baseline
默认是指首行文字,即first baseline
,所有子容器向基线对齐,交叉轴起点到元素基线距离最大的子容器将会与交叉轴起始端相切以确定基线。
-
-
拉伸排列:
-
stretch:子容器沿交叉轴方向的尺寸拉伸至与父容器一致。
-
-
-
设置换行方式:flex-wrap
-
nowrap:不换行
-
wrap:换行
-
wrap-reverse:逆序换行,沿着交叉轴的反方向换行
-
-
轴向与换行组合设置:flex-flow
-
flow 即流向,也就是子容器沿着哪个方向流动,流动到终点是否允许换行,比如
flex-flow: row wrap
,flex-flow
是一个复合属性,相当于 flex-direction 与 flex-wrap 的组合,可选的取值如下:-
row
、column
等,可单独设置主轴方向 -
wrap
、nowrap
等,可单独设置换行方式 -
row nowrap
、column wrap
等,也可两者同时设置
-
-
-
多行沿交叉轴对齐:align-content
-
当子容器多行排列时,设置行与行之间的对齐方式。
-
位置排列:
-
flex-start:起始端对齐
-
flex-end:末尾段对齐
-
center:居中对齐
-
-
分布排列:
-
space-around:等边距均匀分布
-
space-between:等间距均匀分布
-
-
拉伸排列:
-
stretch:拉伸对齐
-
-
-
-
子容器上的属性
-
在主轴上如何伸缩:flex
-
flex
的值可以是无单位数字(如:1, 2, 3),也可以是有单位数字(如:15px,30px,60px),还可以是none
关键字。子容器会按照flex
定义的尺寸比例自动伸缩,如果取值为none
则不伸缩。 虽然flex
是多个属性的缩写,允许 1 - 3 个值连用,是flex-grow,flex-shrink,flex-basis的缩写,但通常用 1 个值就可以满足需求。
-
-
单独设置子容器如何沿交叉轴排列:align-self
-
位置排列:
-
flex-start:起始端对齐
-
flex-end:末尾段对齐
-
center:居中对齐
-
-
基线排列:
-
baseline:基线对齐
-
-
拉伸排列:
-
stretch:拉伸对齐
-
-
-
设置基准大小:flex-basis
-
flex-basis
表示在不伸缩的情况下子容器的原始尺寸。主轴为横向时代表宽度,主轴为纵向时代表高度。
-
-
设置扩展比例:flex-grow
-
子容器弹性伸展的比例。如图,剩余空间按 1:2 的比例分配给子容器。
-
-
设置收缩比例:flex-shrink
-
子容器弹性收缩的比例。如图,超出的部分按 1:2 的比例从给子容器中减去。
-
-
设置排列顺序:order
-
改变子容器的排列顺序,覆盖 HTML 代码中的顺序,默认值为 0,可以为负值,数值越小排列越靠前。
-
-
8、mutation是异步的吗
-
mutation必须同步执行
9、项目中怎么读取的接口数据
-
项目1:ajax
-
面试官又胖又矮哈哈哈哈哈感觉挺可爱的,穿着拖鞋就走过来了。这工作氛围也太随意了吧。贼有想进这里的欲望,但是吧中途回答的不太好,感觉到了面试官对我比较失望。。。