1.盒子水平垂直居中方法(常见)
- 利用绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过translate来调整元素的中心点到页面的中心。
.fu{
position:relitive;
}
.zi{
position:absolute;
top:50%;
left:50%;
transfrom:translate(-50%,-50%);
}
- 使用flex布局,通过align-items:center和justify-content:center设置容器的垂直和水平方向上为居中对齐,然后它的子元素也可以实现垂直和水平的居中。
display: flex;
justify-content: center;//内容水平居中
align-items: center;//垂直居中
2.数组去重
- es6 new Set( )方法
var arr = [1,1,1,2,2,2,3,4,5,5,6,6,7,7,7,8]
console.log(Array.from(new Set(arr)))
console.log([...new Set(arr)])
- indexOf()
var arr = [1,1,1,1,1,2,2,2,22,33,3,3,33,3,3,7,8,8,8,9]
var newArr= []
arr.filter((item)=>{
if(newArr.indexOf(item) === -1){
newArr.push(v)
}
})
console.log(newArr);
3.垃圾回收机制
- 标记清除
- 引用计数
4.let const var的区别
# | 变量提升 | 重复声明 | 修改值 | 块级作用域 |
let | 无 | 不可以 | 可以 | 有 |
const | 无 | 不可以 | 不可以,里面的东西可以改 | 有 |
var | 有undefined | 可以 | 可以 | 没有 |
5.双向数据绑定原理及实现
通过object.defineProperty劫持数据发生改变,如果数据发生改变(在set中进行赋值),触发update方法进行页面数据节点更新,从而实现数据双向绑定。
6.数据类型有哪些以及检测
- 数据类型:
基本数据类型:string,number,NAN, undefined, Null, Boolean,symbol
复杂数据类型:function, object, Array,date
- 检测:
- typeof——基本数据类型检测
- instanceof——复杂数据类型检测
- constructor——基本、复杂类型都可以检测
- object.prototype.toString.call()
7.防抖与节流
- 防抖:操作时不执行,确定不操作了才执行
function debounce(fun,delay){
let timer = null;
return function(){
if(timer) clearTimeout(timer)
let args = arguments
timer = setTimeout(() => {
fun.apply(this,args)
},delay)
}
}
- 节流:到了时间必须执行一次
funtion throttle(fun,time){
let start = 0;
return function(){
let now = new Date()
if(now - start > time){
fun.apply(this,arguments)
start = now
}
}
}
8.Diff算法
虚拟dom:把dom转为数据
9.事件循环机制
执行顺序:同步任务——异步任务(微任务——红任务)
10.原型和原型链
11.深拷贝,浅拷贝
- 浅拷贝:b复制a,修改b时a也变了就是浅拷贝(只拷贝一层)
- 深拷贝:b复制a, 修改b时a没变就是深拷贝(层层拷贝)
12.ajax,promise,axios,fetch区别
- ajax:全名XMLHttpRequest(XHR),局部刷新页面数据
- promise:解决异步回调嵌套
- axios: 封装ajax的库的其中一种
- fetch:ajax的替代品
13.路由有几种模式
两种:hash history
hash: 地址栏上有#,用window.localtion.hash读取
history: h5新增路由,需要后台的配合
14.get与post区别
# | 传输及安安全性 | 大小 | 缓存 | 后退有无影响 |
get | 不安全(明文传输) | 体积小 | 有缓存 | 后退没有影响 |
post | 安全 | 体积大 | 无缓冲 | 后退重新提交 |
15.前端优化
- 请求数据阶段主要指标是服务器响应时间,从服务器角度优化。
- 加载和解析页面阶段,性能优化的主要思路是减少请求数量、降低资源的大小和避免阻塞。
- 渲染阶段优化思路是避免重绘和重排。
16.数组的排序方式
- 冒泡排序
- 选择排序
17.输入 url 到打开页面 都做了什么事情 ?
- 输入URL
- 访问hosts解析,如果没有解析访问DNS解析
- TCP握手
- HTTP请求
- HTTP响应返回数据
- 浏览器解析并渲染页面
18.继承
19.什么是promise
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
promise有三种状态: pending(等待态),fulfilled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行
promise是用来解决两个问题的:
回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
promise可以支持多个并发的请求,获取并发请求中的数据
let myPromise = new Promise(function(myResolve, myReject) {
// "Producing Code"(可能需要一些时间)
myResolve(1); // 成功时
myReject(); // 出错时
}).then(res => {
console.log(res);//1
}).catch(res => {
console.log(res);
}) ;
20.普通函数与箭头函数的区别 ?
1.箭头函数没有prototype(原型),箭头函数没有自己的this,继承的是外层代码块的this。
2.不可以当做构造函数,也就是说不可以使用new命令,否则会报错的。
3.不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
4.不可以使用yield命令,因此箭头函数不能用作 Generator(生成器) 函数。
5.因为没有this,所以不能使用call、bind、apply来改变this的指向。
21.git 的常用指令有哪些 ?
git branch 分支查看
git branch branch_1 增加分支
git checkout branch 分支切换
git merge branch_1 合并分支(合并前要切换当前分支至master)
git branch -d branch_1 删除分支
git remote 查看当前仓库管理的远程仓库信息
git remote show origin 查看指定的远程仓库的详细信息
git push --set-upstream origin branch_1 第一次将本地分支推到远程仓库
git push <远程主机名> <本地分支名>:<远程分支名> 将本地分支推到远程分支
git pull <远程主机名> <远程分支>:<本地分支> 将远程分支拉到本地分支
git branch -d branch_0 删除本地合并后分支
git brench -D branch_0 删除本地未合并分支
git push origin --delete branch_0 删除远程分支
git tag 查看标签
git tag v1.0.0 打标签
git push origin v1.0.0 将tag同步到远程服务器
22.for in 和 for of 循环的区别 ?
for in ——key
for of ——value
23.常见的状态码
200 成功
400客户端错误
500服务器错误
24.token 一般存放在哪里 ? 为什么不存放在 cookie 内 ?
token一般放在本地存储中。token的存在本身只关心请求的安全性,而不关心token本身的安全,因为token是服务器端生成的,可以理解为一种加密技术。但如果存在cookie内的话,浏览器的请求默认会自动在请求头中携带cookie,所以容易受到csrf攻击。
25.浏览器的同源策略以及解决跨域的方式
同源策略:协议、域名、端口均相同,不相同则为跨域
跨域解决:jsonp、cors、代理、反向代理、proxy
26. 数组方法 forEach 和 map 的区别 ?
27. 你了解构造函数吗 ? class 是什么 ? 两者有什么区别 ?
28.