前端面试题

 
序号
 
 
 
1
 
Node.js的框架有哪些
express koa2
2
2
call 和 apply的区别
call          从第二个参数开始逐个传参
apply       第二个参数是一个数组
3
4
addEventListener最后一个参数
true表示捕获,false表示冒泡
4
 
状态码200什么意思
通讯成功
5
 
状态码404
客户端请求错误,没有目标网页
6
 
状态码500
服务器内部错误
7
 
状态码503
服务器暂时无法使用
8
3
简单说几个性能优化的方法
拆分请求
压缩js html
压缩合并图片  走cdn
9
 
在团队里的角色
一个应用的小组长
10
 
错误收集方法
1 window.onerror
2 逻辑错误的地方主动打点收集
3 如有复现步骤,用fiddler把线上js 映射到本地
11
 
我的经验
1年QA
5年Flash
2年前端
2年egret
12
 
有哪些缓存
cookie 在客户端和服务端传递 最大传4k 在同源的浏览器窗口cookie过期时间之前保存
 
sessionStorage 浏览器关闭那失效 
localStorage 永远存在
13
2
get 和 post 的区别
get的参数会存到浏览器的历史中,用于获取数据,无副作用,幂等
post有副作用,幂不等
 
get 用于获取数据 无副作用 当然幂等
delete 用于删除数据 有副作用 多次调用效果相同 所以幂等
post 用于提交数据 有副作用 多次调用产生多条数据 所以幂不等
put 用于提交数据 有副作用 多次调用只生产或更新一条数据 所以幂等
14
 
什么是同域
协议 域名 端口 都相同
url = protocol + hostname + port + search + hash
host = hostname + port
origin = protocol + hostname + port 
另外还有 
href是全部
pathname 问号后斜杠那部分
15
2
Cors 跨源资源共享
cross origin resources sharing 跨域资源共享
若带cookie服务端也要设置
response.setHeader('Access-Control-Allow-Origin',"*");
 
1 cors需要客户端和服务端同时支持
2 如果浏览器发现ajax请求跨域,就会自动添加一些头信息,有时还会多发一个请求
3 cors请求有两类。简单请求和非简单请求
简单请求:类型是head get post,  Content-Type只限于下面三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain
4 发送cors简单请求时,浏览器会带上origin,服务器根据这个值来判断是否接受请求
4.1 如果没同意,会返回200http回应,但头信息上没有带上Access-Control-Allow-Origin,同时XMLHttpRequest的onerror会被调用
4.2 如果同意了,返回的http回应里,头信息上会带有
 
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true 表示允许带上cookie 一起发给服务器
Access-Control-Expose-Headers: FooBar
Content-Type: text/html;  charset = utf-8
 
如果想带着cookie, 需要做两步
1 服务器端要设置 Access-Control-Allow-Credentials: true
2 xhr.withCredentials = true
 
5发送非简单请求时 会在正式请求前 加一次http查询请求 即options请求
除了Origin字段,"预检"请求的头信息包括两个特殊字段。
(1)Access-Control-Request-Method
该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。
 
(2)Access-Control-Request-Headers
该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。
 
5.1 服务器如果同意了这个option请求 
5.2 正常的请求返回的头信息将会是这两个:
Access-Control-Allow-Origin: http://api.bob.com
Content-Type: text/html; charset=utf-8
 
2
OSI七层
Open System Interconnection
 
物理层 比特流
数据链路层  提供介质 链路管理 
网络层 寻址 和 路由选择
传输层 建立主机端到端国连接
会话层 管理会话
表示层 处理数据格式,数据加密
应用层 提供应用程序间通信
17
 
tcp udp 属于哪个层
传输层
18
 
http 属于哪个层
传输层
19
 
常用排序方法
冒泡排序:
let test:number[] = [1,1]
let len:number = test.length
for( let i:number = 0 ; i < len ; i ++ ){
     for( let j:number = 0 ; j < len - 1 - i  ; j ++ ){
           let temp:number = test[j+1];
           test[j+1] = test[ j ];
           test[j] = temp ;
     } 
}
时间复杂度  最差情况O(n2) 最好情况O(n) 
 
插入排序:
for( let i:number = 1 ; i < len ; i++ ){
     for( let j:number = 0 ; j < i ; j ++ ){
          if( test[j] > test[i] ){
                 let a:number = test[i];
                 test[i] = test[j] ;
                 test[j] = a ;
           }
     }
}
 
20
3
webpack缩小打包体积的方法
四种方法
1 第三方库单独引用
2 单独打包css
3 不同环境用不同一配置文件,以去掉不必要的插件
4 选择合适的devtool, 以优化sourceMap
21
2
请求url到html展示的过程
七步
dns 解析
tcp 三次握手
浏览器设置好请求报文后发出http请求
服务器处理请求并返回http报文
浏览器解析渲染页面
a html解析器构建dom tree
b css 解析器构建 style rule
a和b共同构造出呈现树 render tree -> 布局阶段
22
2
html里的async和defer区别
async是下载完就执行
defer是渲染完再执行
23
2
如何减少内存泄露
监听用完要移除
离开场景 清除动画 停止setTimeout
24
1
有几个原始类型,它们有方法吗
null undefined boolean number string symbol
原始类型是没有方法的
25
 
原始类型 和 对象类型 有什么区别
原始类型 存储的是值
对象类型 存储的是地址
27
 
eval
可把字符串解析成js代码并运行 应避免使用eval 很耗性能
28
1
null和undefined有什么区别
null表示定义了,但值为空值
undefinded表示不存在这个值
29
 
typeof  1
typeof '1'
typeof undefined
typeof true
typeof Symbol
typeof 函数
typeof 任何对象类型
number
string
undefined
boolean
symbol
function
object
30
2
this 三种情况
直接调用foo,那this一定是window ,  一定吗?
obj.foo(), 谁调用了函数,谁就是this
对于new的方式说, this被永远绑定在实例上面 
箭头函数的this取决于第一个普通函数的this
31
2
什么是闭包
函数A内部有一个函数B,
函数B可以访问到函数A中的变量,
那么函数B就是闭包
32
2
经典闭包题答案
有三个,只需答两个
方法一
for( var i = 0 ; i <= 5 ; i ++ ){
    (function(j){
          setTimeout( function timer() {
               console.log(j);
           }, j * 1000 ) ;
     }
})( i ) ;
 
方法二
setTimeout() 的第三个参数传 i
 
方法三
用 let 来定义 i
for( let i = 0 ; i <= 5 ; i ++ ){
     setTimeout( function timer(){
          console.log( i );
     }, i * 1000 );
}
33
1
如何实现浅拷贝
let b=Object.assign( {}, a ) ;
let b = { ... a } ;
34
1
如何实现深拷贝
JSON.parse( JSON.stringify( a ) ) ; 不支持 undefined Symbol 和 循环引用的对象
 
方法二:用MessageChannel
35
2
async 和 await 的使用方法
async function foo(){
    return 1 
}
函数前面的async一词意味着这个函数总是返回一个promise,如果代码中有return <非promise>语句 以
则会自动把返回的这个value值包装成promise的resolved的值
即foo().then( 这里可取到 value 的值 )
36
2
原型和原型链
每个实例对象都有一个__proto__指向它的原型对象
这个原型对象的constructor的prototype也指向这个原型对象
对象的 __proto__ 指向原型,对象和原型连接起来就组成了原型链
 
Object是所有对象的爸爸,所有对象都可以通过 __proto__ 找到它
Function是所有函数的爸爸,所有函数都可以通过 __proto__ 找到它
函数的 prototype 是一个对象
37
2
什么是变量提升
1 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
2 let const 不能提升,在window上找不到
38
1
class
语法糖 本质还是函数
39
2
继承类型
组合继承
寄生组合继承
40
2
为什么要使得模块化
解决命名冲突
提高复用性
提高代码的可维护性
41
1
es6模块化
1 es6模块不是对象
 
es6是编译时加载或者叫静态加载,即在编译时完成模块加载
 
export变量有两种方法
export var name:string = a; 或者
var name:string = 'a';
export {name } ; (我习惯用第一种,但书上建议用第二种)
 
export { name as test } 可以重命名 但不建议
 
import 
如果模块名不含路径,那么import命令会去 node_modules 目录寻找这个模块 
 
引入变量
import { first as test } from '路径'
 
import 都是在编译时加载的,不能在运行时加载
 
也可以整体加载
import { * as circle } from '路径'
 
关于default
export default XXX
import YYY from  "" // 这样引入的YYY代表的就是XXX
 
require是运行时加载模块 
42
 
proxy
Vue3.0中将会通过Proxy来替换原本的Object.defineProperty 来
实现数据响应式
43
1
map
filter
reduce
forEach
生成一个新数组
过滤生成一个新数组
const sum = arr.reduce( (acc, current) => acc + current, 0 ) ;
对每一项来执行
44
2
并发和并行concurrency 
并发是宏观概念,我分别有任务A和任务B,在一段时间内通过任务间的切换完成了这两个任务
并行是微观概念,假设cpu存在两个核心 那么我就可以同时完成任务A和B
45
1
回调函数的缺点
改变牵一发而动全身
不能return
不能用try catch
46
2
generator函数返回什么
generator函数是一个状态机,封闭了内部状态。
执行generator会返回一个遍历器对象,
var hw = helloWorldGenerator() // hw是一个指向内部状态的指针对象
 
2
generator有哪两个特征
function后有一个*
内部使用yield表达式
 
2
Promise的本质
Promise的写法只是回调函数的改进,只能让异步任务看得更清楚,另外多了一个整体catch错误的方法
47
3
异步编程方法有哪些
回调函数
事件监听
发布订阅
Promise
48
2
js是什么线程
一个进程包括很多线程,线程只能逐个执行
js是单线程执行的
49
2
什么是执行栈
遵循先进后出的原则
50
2
异步代码执行顺序是什么
Event Loop
先执行微任务 再执行宏任务
微任务: process.nextTick() promise MutationObserver
宏任务有: script setTimeout setInterval setImmdiate I/O UI
rendering 
51
2
V8下的垃圾回收机制
新生代算法:新分配的对象会被放入From空间中,
当From空间被占满时,GC 就会启动,
、检查From空间中存活的对象并复制到To空间中,如果有失活的对象就会销毁。当复制完成后将From和To空间互换
52
2
开发者工具里的技巧
Element里右键选择 scroll into view
Edit Break,在for循环里当i是某值时,就停在断点
53
2
事件触发过程
window -> 捕获 -> 目标 -> 冒泡 -> window
55
3
stopPropagation
来用阻止事件的进一步传播,可以阻止事件冒泡和捕获
56
2
stopImdiatePropagation
stopPropagation + 阻止该事件目标执行别的注册事件
57
2
什么是事件代理
即子节点需要注册事件的话,就注册到父节点上
58
3
跨域是为了防什么
用来防止csrf攻击,即利用用户的登录态发起恶意请求,浏览器拦截了这个响应
59
2
解决跨域问题的方法
方法一  jsonp
jsonp
function jsonp(url, jsonpCallback, success) {
let script = document.createElement('script')
script.src = url
script.async = true 
script.type = 'text/javascript' 
window[jsonpCallback] = function(data) { success && success(data)
}
document.body.appendChild(script);
}
jsonp('http://xxx', 'callback', function(value) {
    console.log(value)
})
 
方法二 Cors cross origin resources sharing 
需要目标服务器的后端response.setHeader 把 Access-Control-Allow-Origin 设置为 * 或允许www.test.17zuoye.net的加载
要找专门的cdn服务端 比如bootCDN 
// 接收跨域的cookie response.setHeader("Access-Control-Allow-Credentials", "true");
60
 
实现储存有哪些方法
cookie sessionStorage localStorage indexDB
61
2
cookie的属性
cookie.http-only 不能通过js来访问,以减少xss攻击
cookie.secure 只能在https中携带
cookie.same-site 不能在跨域请求中携带
62
 
浏览器的缓存有哪引起位置
Service Worker
Memory Cache
Disk Cache
Push Cache
网络请求
63
3
两种缓存策略
强缓存 协商缓存
64
2
firefox ui引擎
Gecko
65
2
chrome 和 safari 里的 ui 引擎
Webkit
66
4
html渲染过程
浏览器接收到字节数据 -> 字符串 -> token -> Node 连接成Dom树
67
4
css渲染过程
字节数据 -> 字符串 -> Token -> Node -> 连接成CSSOM树
过于具体的css选择器,因要通过递归寻找,所以非常消耗资源
68
1
DOM树 CSSOM树
两个一志渲染树 -> reflow painting -> 调用gpu绘制 合成图层
69
3
如果实现插入很多Dom页面不卡顿
方法一:requestAnimationFrame 循环插入Dom
方法二:虚拟滚动 visualized scroller,即用react-visualized
70
3
如何减少阻塞渲染
1 减少html层级,减少css的复杂度
2 defer:    script放到body最后,或者给script标签增加defer属性,表示js文件或并行下载,htmll解决完顺序执行 
3 async:   对于没有任何依赖的js文件可以加async属性,表示js下载和解析不会阻塞渲染
71
2
重绘 repaint 
回流 reflow
重绘:改外观而不改布局,比如改变颜色
回流:改变布局
72
3
减少重绘和回流 5 个
使用transform代替top
使用visibility替代display:none
少用js改变dom
动画速度越多,回流次数越多
频繁变化的节点要设置为图层,这样不会影响别的节点
73
3
XSS攻击 如何防范
cross site scripting 插入可执行的代码
1 永远不信任用户的输入
2 建立 CSP Content-Security-Policy 白名单,可以http header里设置,也可在meta里
2.1 只允许加载本站资源  default-src: 'self'
2.2 只允许加载https协议图片 img-src: https://*
2.3 允许加载任何来源的 child-src:'none'
74
3
CSRF攻击 如何防范4种
cross site request forgery 跨站伪造请求(伪造前端请求向后端发请求)
1 用get请求不对数据进行修改
2 设置cookie.same-site 不让第三方网站访问到用户的 cookie
3 阻止第三方网站请求接口(验证referer来判断请求是否为第三方发起的)
4 请求时要带验证信息,比如验证码或Token
75
3
点击劫持  如何防范
将要攻击的网站放到iFrame里面,伪造入口让用户点击
方法一 X-Frame-Options
deny:表示页面不允许通过iframe的方式展示
sameorigin:表示页面只可以在相同域名下通过iframe的方式展示
allow from表示页面可以在指定来源的iframe中展示
方法二:js防御
if (self == top) { var style = document.getElementById('click-jack') document.body.removeChild(style) } else { top.location = self.location }
76
2
中间人攻击 防范
中间人和客户端和服务端都建立了连接
解决方法:用https,并且关闭对http的修改访问。
77
2
测试性能工具
Audits 和 Performance
78
2
v8 JS性能优化
js -》抽象语法树 -> 用ignition转成ByteCode -> 用compiler turboFan 转成Machine code
 
让代码尽可能多的转为机器容易读的machine code
就应该让类型强制
 
v8引擎能把性能提升20多倍 
79
2
图片优化方法
用css 不用图片
移动端,最好请求裁好的图片
多个图片合并成一张图
大图用webP, 小图用png,图标用svg,照片用jpeg
80
1
DNS预解析
预解析出ip地址
81
1
节流方法
不希望滚动过程中一直发出请求,可用throttle来实现
即实现一个执行间隔,不断执行
下拉加载新内容
82
1
防抖方法
debounce 用于下拉条,在事件派发过来中,只执行一次行为
debounce分为前缘和后缘
83
 
预加载 
<link rel='preload' />
84
 
预渲染
<link rel='prerender' href='http://example.com'/>
85
1
懒加载 
即将不关键的资源延后加载
懒加载图片 js 视频
86
1
cdn
content delivery network 内容分发网络
即把静态资源放到不同服务器上
87
1
webpack打包速度和打包大小
1 优化Loader的文件搜索范围
     { // js 文件才使用 babel 
test: /\.js$/, 
loader: 'babel-loader', // 只在 src 文件夹下查找 
include: [resolve('src')], 
// 不会去查找的路径 exclude: /node_modules/ }
 
2 缓存Babel编译过的文件
loader: 'babel-loader?cacheDirectory=true'
 
3 HappyPack
Node是单线程的,所以Webpack也是单线程,特别是在执行Loader的时候,长时间编译的
任务很多,这样就会导致等待的情况。
HappyPack可以把Loader的同步执行转换为并行的
这样写:loader:'happpack/loader?id=happybabel'
plugins:[
    new HappyPack(
          id:'happybabel',
          loaders:[ 'babel-loader?cacheDirectory'],
          threads: 4 ,
    )
]
 
4 DllPlugin 可以将特定的类库提前打包然后引入 
    这极大地减少打包类库的次数,只有当类库更新版本才有需要重新打包,并且
也实现了将公共代码抽离成单独文件的优化方案。
    具体略
 
5 代码压缩  
  在 webpack4中,把mode设置为production时,就会并行压缩js代码了
resolve.extensions
resolve.alias
module.noParse
 
6 按需加载,底层原理都是Promise
 
7 Scope Hoisting 
代码就会尽可能把打包出来的模块合并到一个函数中去
module.exports = {
    optimization: { concatenateModules: true }
}
 
8 Tree Shaking
实现删除项目中未被引用的代码
webpack4中,mode设置为production,就会自动删去
88
3
MVVM的精髓是什么
通过ViewModel将视图中的状态和用户的行为分离出一个抽象
View Binder ViewModel Model
89
1
visual Dom
Virtual DOM 实际上没有使用什么全新的技术,仅仅是把 “ 双缓冲(double buffering)” 技术应用到了DOM上面。
这样一来,当你在这个单独的虚拟的DOM树上也一个接一个地修改30个节点的时候,它不会每次都去触发重绘,所以修改节点的开销就变小了。
之后,一旦你要把这些改动传递给真实DOM,之前所有的改动就会整合成一次DOM操作。这一次DOM操作引起的布局计算和重绘可能会更大,但是相比而言,整合起来的改动只做一次,减少了(多次)计算
90
3
路由实现方式
Hash History 模式
91
2
vue v-show v-if
 
92
2
响应式原理
Object.defineProperty() 来实现数据响应式
通过这个函数可以监听到set和get事件
93
 
Vue编译过程是什么
模板 -> AST -> render函数 -> virtual Dom --> 真实的dom
94
 
nextTick原理分析
可让我们在下次dom更新循环结束后执行延迟回调,用于获得更新后的Dom
setImmediate -> MessageChannel -> setTimeout 
95
 
React - Fiber 
它是一个虚拟的堆栈帧,
96
2
UDP
不需要建立连接,不需要验证数据报文,不需要流量控制,
但它可在实时性要求高的地方有所作为。比如视频和游戏
97
2
TCP
建立连接或断开连接都需要先握手
在传输数据的过程中,通过各种算法来保证数据的可靠性
98
 
TCP的头部信息
sequence number 可保证传输的报文都是有序的
acknowlegement number 这个序号表示数据接收端期望接收的下
99
1
TCP如何连接
建立连接要三次握手
客户端向服务端发
服务端应答
客户端确认
 
断开连接要4次握手
100
 
HTTP协议三部分
请求行 首部 实体
请求行:请求方法 url 协议版本 
101
 
头部有哪四种
用户首部 请求首部 响应首部 实体首部
102
 
get post区别
get 无副作用 且幂等
post 有副作用 不幂等
103
 
TLS 技术
https通过http来传输信息,但是信息通过tls协议进行了加密
有两种加载技术:对称加密 + 非对称加密
 
对称加密 即两边有相同的密钥
非对称加密 
104
 
状态码的规律
2xx 成功
3xx 重定向 
4xx 客户端错误 
5xx 服务端错误
 
 
时间复杂度
O(N)
 
 
栈
先进后出 push pop shifit unshift
 
 
队列
先进先出
 
 
链表
 
 
 
二叉树
 
 
 
二分搜索数
 
 
 
AVL树
 
 
 
Trie
 
 
 
并查集
 
 
 
堆
 
 
 
MVVM的精髓
viewModel将视图中的状态和用户的行为分离出一个抽象
 
 
Virtual DOM
React团队优化了算法,实现了O(n)的复杂并来对比差异,只对比同层的节点,而不是跨层对比,这也是考虑到在实际业务中很少会跨层的移动Dom元素
 
 
路由原理
本质就是监听url的变化 有两种实现方式:Hash模式 History模式
 
 
 
Vue和React的区别
Vue的表单可使用v-model支持双向绑定
Vue上手成本更低
 
 
Vue有哪些钩子函数
beforeCreate
created
beforeMount
beforeUpdate
updated
activated
deactivated
beforeDestroy
destroyed
 
 
父子通讯方法
父组件通过props传递数据给子组件
子组件emit事件给父组件
通过访问@parent和$children来访问对方 
$listener属性会将父组件中的v-on事件监听器传递给子组件
子组件通过访问$listenerso来自定义监听器
.sync
 
 
兄弟组件通过
this.$parent.$children 再查找name来实现
 
 
跨多层次组件通信
provide 
inject
 
 
任意组件 Vuex 或 Event Bus 解决
 
 
mixin和
mixins的区别
mixin用于全局混入,会影响到每个组件实例,通常插件都是这样初始化的
mixins是我们最常见的扩展组件的方式
 
 
computed和watch的区别
computed 只有当计算值变化才会返回内容
watch 监听到值的变化就会执行回调
vm.$watch()
 
 
v-show v-if
v-if 表示不渲染
 
 
哪些事件不支持冒泡
ui事件 load unload  鼠标事件 mouseleave 焦点事件 blur focus 
 
 
 
 
零碎面试题
 
什么是函数柯里化
add()()
es6的方法实现数组去重
let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3];
let set = new Set(array); let arr = Array.from(set);
css中的层叠
 
 
 
 
 
 
 
 
posted @ 2019-04-05 21:58  jason_xiao  阅读(271)  评论(0)    收藏  举报