这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战vue
是时候寄出失传已久的——面向面试复习法!es6
目录:面试
- HTML篇
- CSS篇
- JS篇
- DOM篇
- HTTP篇
- Vue2篇
- 安全篇
- 浏览器兼容篇
答:就是使用恰当语义的 HTML 标签,好比段落用 <p>
,边栏用 <aside>
,主要内容用 <main>
,页眉用 <header>
,这样能让人和机器都能快速理解网页内容。ajax
写法:<meta name="viewport" content="width=device-width, initial-scale=1.0">
正则表达式
用处:控制页面在移动端不要缩小显示。canvas
答:内容相关的有页眉 <header>
,内容 <main>
,边栏 <aside>
,脚注 <footer>
等。跨域
功能相关的有 <canvas>
,<video>
等。数组
答:H5 != HTML5,H5是移动端页面,不是必定要用了 HTML5 语法的页面才是 H5。promise
答:content-box(W3C盒模型)的宽度 == 内容区宽度浏览器
border-box(IE盒模型)的宽度 == 内容区宽度 + padding 宽度 + border 宽度
经过 box-sizing 属性切换两种盒模型
水平居中:
垂直居中:
答:BFC 就是块格式化上下文。
举例:若是给一个 div 写一个 overflow: hidden;(清除浮动)那么这个div里面的浮动元素就会被 div 包裹起来。
BFC造成的条件:
权重法(CSS2):行内样式是1000 > id选择器是100 > 类选择器是10 > 元素选择器是1
更准确的判断法(CSS3):
父元素添加以下代码,里面的子元素就清除浮动了:
.clearfix::after {
content: ""; // 空串
display: block; // 显示为块级元素
clear: both; // 清除两侧浮动的影响
}
.clearfix {
zoom: 1; // IE兼容
}
复制代码
或者直接:overflow: hidden; 但不建议用这个。
Promise 的用法之 then 的用法:
$.ajax(...).then(成功函数, 失败函数)
链式 then 的用法:
$.ajax(...).then(成功函数1, 失败函数1).then(成功函数2, 失败函数2)
其余方法,例如 Promise.all、Promise.race,建议直接通读:
// 背代码咯
function fn(){
return new Promise(function(resolve, reject) {
setTimeout(() => {
// resolive() 或者 reject()
}, 3000)
})
}
// 而后咱们就能够 then 了
fn().then(...)
复制代码
目的:把异步代码写成同步代码
// 老的写法(异步):
function fn() {
return new Promise(function(resolve, reject) {
setTimeout(() => {
resolive('哈哈哈')
}, 3000)
})
}
fn().then((res) => {
res === '哈哈哈' // true
})
// 新的写法(同步):
async function fn2() {
var res = await fn();
res === '哈哈哈' // true
}
复制代码
能够把它理解成游戏中的CD冷却时间,当技能在冷却时间内的时候,咱们就不能使用该技能。
function fn() {
// 游戏技能
}
var cd = false; // 是否冷却中
button.onclick = function() {
if (cd) {
// 不能使用技能
} else {
fn(); // 使用技能
cd = true; // 进入冷却时间
var timerId = setTimeout(() => {
cd = false
}, 3000) // 3秒后技能才可用
}
}
复制代码
咱们想象一个情景:当用户输入一段数据后咱们要去对数据进行验证,可是若是不间断的进行验证会浪费咱们的计算机资源。因此咱们就想等用户输入数据后,2s 后才进行验证,若 2s 间用户更新了输入的数据,那么 2s 将从新计时。
function fn() {
// 要执行的代码
}
var timerId = null;
button.onclick = function() {
if (timerId) {
clearTimeout(timerId); // 中止以前的计时
}
timerId = setTimeout(() => { // 从新计时
fn();
timerId = null;
}, 2000)
}
复制代码
举例:
var obj = {
foo: function() {
console.log(this)
}
}
var bar = obj.foo
obj.foo() // 打印出的 this 是 obj
bar() // 打印出的 this 是 window
复制代码
答:String, Number, Boolean, null, undefined, Symbol, BigInt 共 7 种基础数据类型,外加一种引用类型:Object。
JSON法(缺点多,好比 a 里面不能有函数):
var a = {...}
var b = JSON.parse(JSON.stringify(a))
复制代码
递归拷贝法:
function clone(obj) {
if(Array.isArray(obj)){
var copy = [];
}else{
var copy = {};
}
for (let i in obj) {
if (obj.hasOwnProperty(i)) {
copy[i] = typeof obj[i] === 'object' ? clone(obj[i]) : obj[i];
}
}
return copy;
}
复制代码
环:
// 不会
复制代码
Set 去重:
var a = [3, 4, 6, 3, 5, 4]
Array.from(new Set(a)) // [3, 4, 6, 5]
[...new Set(a)] // ES6 语法下的 Set 去重
复制代码
笨办法:
// 使用双重循环,每次从原数组中提取一个数据和新数组中已有数据比较
复制代码
function trim(string) {
return string.replace( /^\s+|\s+$/ ,'');
}
复制代码
例:( a==1 && a==2 && a==3 ) 可能为 true 吗?
答:可能。
例:null == undefined?
答:true
// 谷歌一下
复制代码
回答什么是冒泡和捕获便可。
答:不直接监听子元素,而是监听父元素,只须要在监听后判断是哪一个“儿子”触发的事件。
好处:一次监听全部“儿子”,那怕是后面动态生成的“儿子”,也能被监听。
答:created(在实例建立完成后被当即调用)、mounted、updated 、destroyed(Vue 实例销毁后调用) 等生命周期钩子函数。
答:父子通讯(使用 Prop 传递数据、使用 v-on 绑定自定义事件),兄弟通讯(new Vue() 做为 Bus 或者 Vuex),爷孙通讯(能够 爷爷—>爸爸—>儿子 依次通讯,也能够只用采用 Vuex 状态管理器等方案)
简单总结版:当把一个 JS 对象传入 Vue 实例做为 data 选项时,Vue 将遍历这个对象的全部属性,并使用 Object.defineProperty() 把这些属性所有转化为 getter/setter。这些 gettet/setter 对用户来讲是不可见的,可是在内部它们让 Vue 能够追踪依赖,在属性被修改时通知变动。
计算属性 vs 方法:
计算属性 vs 侦听器
答:向响应式对象中添加一个属性,并确保这个新属性一样是响应式的,且触发视图更新。若是采用普通的方法向对象中添加属性,那么这个新增属性不会是响应的。
答:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
我若是开发一个博客,我会将用户"是否登陆"这个状态放入到 Vuex 中,供全部组件访问和修改。
答:它是 vue.js 官方的路由管理器,它让咱们构建单页面应用变得很简单。
我在作一个单页面应用,但想要实现多页效果的时候,我会把一个个页面对应为一个个的组件,而后用路由来管理它们,这样就实现了单页面应用。
名称:跨站脚本攻击
举例: 经过客户端脚本语言,在一个论坛发帖中发布一段恶意的 JavaScript 代码就是脚本注入,若是这个代码内容有请求外部服务器,那么就叫作XSS!
预防:过滤尖括号、script 等特殊字符(把 < 替换成 <)
名称:跨站请求伪造
举例:冒充用户发起请求(在用户不知情的状况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。
预防:添加图片验证码、短信验证码;进行 token 校验