基于TOP-K的面试题解总结(2)
5. 简述 Javascript 中的防抖与节流的原理并尝试实现
-
防抖: 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。
// fn 是需要防抖处理的函数
// wait 是时间间隔
function debounce(fn, wait = 50) {
// 通过闭包缓存一个定时器 timer
let timer = null
// 将 debounce 处理结果当作函数返回
// 触发事件回调时执行这个返回函数
return function(...args) {
// 如果已经设定过定时器就清空上一次的定时器
if (timer) clearTimeout(timer)
// 开始设定一个新的定时器,定时器结束后执行传入的函数 fn
timer = setTimeout(() => {
fn.apply(this, args)
}, wait)
}}
// DEMO
// 执行 debounce 函数返回新函数
const betterFn = debounce(() => console.log('fn 防抖执行了'), 1000)
// 停止滑动 1 秒后执行函数 () => console.log('fn 防抖执行了')
document.addEventListener('scroll', betterFn)
-
节流: 函数节流指的是某个函数在一定时间间隔内(例如 3 秒)只执行一次,在这 3 秒内 无视后来产生的函数调用请求,也不会延长时间间隔。3 秒间隔结束后第一次遇到新的函数调用会触发执行,然后在这新的 3 秒内依旧无视后来产生的函数调用请求,以此类推。
// fn 是需要执行的函数
// wait 是时间间隔
const throttle = (fn, wait = 50) => {
// 上一次执行 fn 的时间
let previous = 0
// 将 throttle 处理结果当作函数返回
return function(...args) {
// 获取当前时间,转换成时间戳,单位毫秒
let now = +new Date()
// 将当前时间和上一次执行函数的时间进行对比
// 大于等待时间就把 previous 设置为当前时间并执行函数 fn
if (now - previous > wait) {
previous = now
fn.apply(this, args)
}
}}
// DEMO// 执行 throttle 函数返回新函数const betterFn = throttle(() => console.log('fn 函数执行了'), 1000)// 每 10 毫秒执行一次 betterFn 函数,但是只有时间差大于 1000 时才会执行 fnsetInterval(betterFn, 10)
6. promise 有哪些状态?简述 promise.all 的实现原理
-
三种状态:
-
Pending:进行中
-
Resolved/Fulfilled:已完成
-
Rejected:已失败
-
promise.all(参数):
-
参数:一个promise的参数。可以是一个可迭代对象,如Array、String等
-
只有待所有输入的promise参数都返回resolved,promise.all才返回resolved,若有一个rejected,则返回第一个rejected的回调执行。
7. 简述 CSS 盒模型
-
CSS盒模型:
-
基本盒模型:content+padding+border+margin
-
IE模型:元素宽度width=content+padding+border
-
标准模型:元素宽度widh=content
-
外边距重叠: 当两个垂直外边距相遇时,他们将形成一个外边距,合并后的外边距高度等于两个发生合并的外边距的高度中的较大者。
-
BFC块级格式化上下文:
-
BFC内的元素垂直方向的边距会发生重叠。属于不同BFC的元素外边距不会发生重叠
-
BFC的区域不会与浮动元素的布局重叠。
-
创建BFC:例如设置display:flex/inline-blocks、float只要不是none就行、overflow不为visible等
8. 简述 Javascript 原型以及原型链
-
原型:
-
每个对象拥有一个原型对象,对象以其原型为模板,从原型继承方法和属性,这些属性和方法定义在对象的构造器函数的 prototype 属性上,而非对象实例本身。
-
每个构造函数都有一个属性xxx.prototype,指向原型对象
-
任意函数._proto_的指向是Function,但Function._proto_===Function.prototype
-
原型链:
-
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的 __proto__隐式原型上查找,即它的构造函数的 prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
9. 简述什么是 XSS 攻击以及 CSRF 攻击?
-
XSS攻击:
-
定义:是一种代码注入攻击, 攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
-
常见方式:
-
在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
-
在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
-
在标签的 href、src 等属性中,包含 javascript: (伪协议)等可执行代码。
-
防范方式:
-
HttpOnly:在cookie 中设置 HttpOnly 属性后,js脚本将无法读取到 cookie 信息。
-
输入过滤:在前端进行输入格式的检查,后端也做相应的过滤检查。
-
CSRF跨站点请求伪造:
-
定义: 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
-
防范方式:
-
token:token 验证的 CSRF 防御机制是公认最合适的方案。
9. CSS 的选择器优先级是怎样?
-
优先级通用规则:
-
!important
-
在stayle属性里写的行内样式
-
id选择器(#id)
-
class选择器(.class名)
-
标签选择器(<div>、<p>等)
-
通配符选择器(*)
-
伪选择器
-
CSS叠加规则:
-
不同的样式可以叠加
-
相同的样式且权重相同的情况下:后来者居上

浙公网安备 33010602011771号