avaScript Charts兼容性好的JavaScript、HTML5图表开发工具,能满足大部分的开发需求,包括序列图表(列型图,条形图,线型图,面积图,步骤折线图,平滑折线图,蜡烛图,ohlc图),饼图/环形图,雷 达图/极区图以及xy图/散点图/气泡图。
本站文章除注明转载外,均为本站原创或翻译
7. 页面 社会化 分享功能
8. 富文本编辑器
9. 日历
10. 综合效果搜索平台
11. 前端工程化
12. 轮播图
- [无缝切换](http://www.swipejs.com/)
- [滑屏效果](http://www.idangero.us/swiper/)
- [全屏fullpage](https://github.com/peunzhang/fullpage)
- [单个图片切换](https://github.com/qiqiboy/touchslider)
- [单个全屏切换](https://github.com/peunzhang/slip.js)
- [百度的切换库](http://touch.code.baidu.com/examples.html?qq-pf-to=pcqq.group)
- [单个全屏切换](https://github.com/peunzhang/iSlider)
- [滑屏效果](https://github.com/saw/touch-interfaces)
- [旋转拖动设置](http://baijs.com/tinycircleslider/)
- [类似于swipe切换](http://touchslider.com/)
- [支持多种形式的触摸滑动](http://www.swiper.com.cn/demo/index.html)
- [滑屏效果](https://github.com/joker-ye/main/blob/master/wap/index.html)
- [大话主席pc移动图片轮换](http://www.superslide2.com/)
- [滑屏效果](https://github.com/hahnzhu/parallax.js)
- [基于zepto的fullpage](https://github.com/yanhaijing/zepto.fullpage)
- [ - 定宽网页设计下,固定宽度布局开发WebApp并实现多终端下WebApp布局自适应](http://www.cnblogs.com/plums/archive/2013/01/10/WebApp-fixed-width-layout-of-multi-terminal-adapter-since.html][WebApp)
- [判断微信客户端的那些坑](http://loo2k.com/blog/detecting-wechat-client/)
- [可以通过javascript直接调用原生分享的工具](https://github.com/JefferyWang/nativeShare.js)
- [JiaThis 分享到微信代码](http://www.jiathis.com/help/html/weixin-share-code)
- [聊聊移动端跨平台开发的各种技术](http://fex.baidu.com/blog/2015/05/cross-mobile/)
- [前端自动化测试](http://www.zhihu.com/question/29922082)
- [多种轮换图片](http://ajccom.github.io/niceslider/)
- [滑动侧边栏](https://mango.github.io/slideout/)
13. 文件上传
14. 模拟select
15. 取色插件
16. 城市联动
17. 剪贴板
18. 简繁转换
19. 表格 Grid
20. 在线演示
21. 播放器
22. 粒子动画
九. Nodejs
十. 性能优化
- [Javascript高性能动画与页面渲染](http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering)
- [移动H5前端性能优化指南](http://isux.tencent.com/h5-performance.html)
- [5173首页前端性能优化实践](http://ued.5173.com/?p=1731)
- [给网页设计师和前端开发者看的前端性能优化](http://www.uisdc.com/front-end-performance-for-web-designers-and-front-end-developers)
- [复杂应用的 CSS 性能分析和优化建议](http://www.orzpoint.com/profiling-css-and-optimization-notes/)
- [张鑫旭——前端性能](http://www.zhangxinxu.com/wordpress/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD/)
- [前端性能监控总结](http://www.xiaoqiang.org/javascript/font-end-performance-monitor.html)
- [ 网站性能优化之CSS无图片技术](http://udc.weibo.com/2013/05/%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B9%8Bcss%E6%97%A0%E5%9B%BE%E7%89%87%E6%8A%80%E6%9C%AF/)
- [web前端性能优化进阶路](http://www.aliued.cn/2013/01/20/web%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%BF%9B%E9%98%B6%E8%B7%AF.html)
- [前端技术:网站性能优化之CSS无图片技术](http://my.eoe.cn/tuwandou/archive/4544.html)
- [浏览器的加载与页面性能优化](http://www.baiduux.com/blog/2011/02/15/browser-loading/)
- [页面加载中的图片性能优化](http://www.w3ctech.com/p/1503)
- [Hey——前端性能](http://www.feelcss.com/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD)
- [html优化](http://www.baiduux.com/blog/2010/03/15/html%E4%BC%98%E5%8C%96-2/)
- [99css——性能](http://www.99css.com/tag/%e6%80%a7%e8%83%bd)
- [Yslow——性能优化](http://www.yslow.net/category.php?cid=20)
- [YSLOW中文介绍](http://www.cnblogs.com/yslow/)
- [转一篇Yahoo关于网站性能优化的文章,兼谈本站要做的优化](http://www.360ito.com/article/40.html)
- [Yahoo!团队实践分享:网站性能](http://www.360doc.com/content/10/0928/09/2588264_56971287.shtml)
- [网站性能优化指南:什么使我们的网站变慢?](http://blog.jiasule.com/i/153)
- [网站性能优化实践,减少加载时间,提高用户体验](http://www.powereasy.net/helpyou/knowledge/ecommerce/9593.html)
- [浅谈网站性能优化 前端篇](http://www.umtry.com/archives/747.html)
- [前端重构实践之如何对网站性能优化?](http://www.adinnet.cn/blog/designview/2012-7-12/678.html)
- [前端性能优化:使用媒体查询加载指定大小的背景图片](http://www.gbin1.com/technology/javascript/20130708-front-end-performance-optimization-9/)
- [网站性能系列博文](http://www.mykuer.com/post/factors-that-affect-the-speed-of-web-site-open.html)
- [加载,不只是少一点点](http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201109/41355.shtml)
- [前端性能的测试与优化](http://mzhou.me/article/95310/)
- [分享网页加载速度优化的一些技巧?](http://www.gbin1.com/technology/html/20130217-tips-for-speed-up-page-loading/)
- [页面加载中的图片性能优化](http://www.f2es.com/images-bytes-opt/)
- [web前端优化(基于Yslow)](http://www.tcreator.info/webSchool/website/Front-end-Opt-Yslow.html)
- [网站性能优化工具大全](https://www.qianduan.net/website-performance-optimization-tool.html)
- [【高性能前端1】高性能HTML](http://www.alloyteam.com/2012/10/high-performance-html/)
- [【高性能前端2】高性能CSS](http://www.alloyteam.com/2012/10/high-performance-css/)
- [由12306谈谈网站前端性能和后端性能优化](http://coolshell.cn/articles/6470.html)
- [AlloyTeam——前端优化](http://www.alloyteam.com/webfrontend/%E5%89%8D%E7%AB%AF%E4%BC%98%E5%8C%96/)
- [毫秒必争,前端网页性能最佳实践](http://www.cnblogs.com/developersupport/p/3248695.html)
- [网站性能工具Yslow的使用方法](http://blog.sina.com.cn/s/blog_6e9d2e0701017kvu.html)
- [前端工程与性能优化(上):静态资源版本更新与缓存](http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1)
- [前端工程与性能优化(下):静态资源管理与模板框架](http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part2)
- [HTTPS连接的前几毫秒发生了什么](http://blog.jobbole.com/48369/)
- [Yslow](http://uicss.cn/yslow/#more-12319)
- [Essential Web Performance Metrics — A Primer, Part 1](http://blog.smartbear.com/web-performance/essential-web-performance-metrics-a-primer-part-1/)
- [Essential Web Performance Metrics — Part 2](http://blog.smartbear.com/performance/essential-web-performance-metrics-part-2/)
- [YUISlide,针对移动设备的动画性能优化](http://jayli.github.io/blog/data/2011/12/23/yuislide.html)
- [Improving Site Performance](http://joelglovier.com/improving-site-performance/)
- [让网站提速的最佳前端实践](http://segmentfault.com/a/1190000000367899)
- [Why Website Speed is Important](http://sixrevisions.com/web-development/why-website-speed-is-important/)
- [Need for Speed – How to Improve your Website Performance](https://www.devbridge.com/articles/need-for-speed-how-to-improve-your-website-performance/)
- [阿里无线前端性能优化指南 (Pt.1 加载期优化)](https://github.com/amfe/article/issues/1)
十一. 前端架构
十二. 个人作品
1. 推荐作品
2. 群员作品
3. 国外大牛精品
十三. 简历模板
十四. 面试题
十五. iconfont
十六. 开发工具类
十七. 前端导航网站
十八. 常用CDN
十九. Git,SVN,Github
这些技术如何学习,有没有免费资料?
对前端的技术,架构技术感兴趣的同学关注我的头条号,并在后台私信发送关键字:“前端”即可获取免费的架构师学习资料
源|https://segmentfault.com/a/1190000015288700
本篇文章整理总结了一些前端面试题,涵盖面很广,并且面的都是知名大厂,所以这些题还是很有代表性的,都掌握以后一面基础面应该没什么问题,二面也能应付大半,奉上:
1. 万能居中
1.margin: 0 auto;水平
2.text-align: center;水平
3.行高,垂直
4.表格,center,middle;水平垂直
5.display:table-cell;模拟表格,all
6.绝对定位,50%减自身宽高
7.绝对定位,上下左右全0,margin:auto
8.绝对定位加相对定位。不需要知道宽高
9.IE6,IE7:给父元素设一个font-size:高度/1.14,vertical-align:middle
2. BFC优化
块格式化上下文, 特性:
3. 和模型哪两种模式?什么区别?如何设置
4. 常用清除浮动的方法,如不清除浮动会怎样?
当父元素不给高度的时候,内部元素不浮动时会撑开, 而浮动的时候,父元素变成一条线, 造成塌陷.
5. 栅格化的原理
比如antd的row和col, 将一行等分为24份, col是几就占几份, 底层按百分比实现; 结合媒体查询, 可以实现响应式
6. 纯css实现三角形
// 通过设置border
.box
{
width:0px;
height:0px;
border-top:50px solid rgba(0,0,0,0);
border-right:50px solid rgba(0,0,0,0);
border-bottom:50px solid green;
border-left:50px solid rgba(0,0,0,0);
}
7. 高度不定,宽100%,内一p高不确定,如何实现垂直居中?
8. 至少两种方式实现自适应搜索
9. 设置一段文字的大小为6px
10. css菊花图
四个小圆点一直旋转
// 父标签
animation: antRotate 1.2s infinite linear;
// 子标签
animation: antSpin 1s infinite linear;
@keyframe antSpin {
to {
opacity: 1
}
}
@keyframe antRotate {
to {
transform: rotate(405)
}
}
// animation-delay: 逐个延迟0.4s
11. 关于em
<p style="font-size: 20px">
123
<p style="font-size: 2em;width: 2em">456</p>
</p>
// 此时子元素的font-size为40px, 宽度为80px(还要乘以子元素font-size的系数)
12. 关于vh, vw
vw:viewpoint width,视窗宽度,1vw等于视窗宽度的1%。
vh:viewpoint height,视窗高度,1vh等于视窗高度的1%。
vmin:vw和vh中较小的那个。
vmax:vw和vh中较大的那个。
13. Flex布局
14. overflow原理
15. 实现自适应的正方形:
16. 标准模式和怪异模式
17. CSS3实现环形进度条
两个对半矩形遮罩, 使用rotate以及overflow: hidden进行旋转
18. css优先级
选择器的特殊性值表述为4个部分,用0,0,0,0表示。
1. ES5和ES6继承方式区别
2. Generator了解
ES6 提供的一种异步编程解决方案, Generator 函数是一个状态机,封装了多个内部状态。
// 通过设置border.box { width:0px; height:0px; border-top:50px solid rgba(0,0,0,0); border-right:50px solid rgba(0,0,0,0); border-bottom:50px solid green; border-left:50px solid rgba(0,0,0,0); }
调用后返回指向内部状态的指针, 调用next()才会移向下一个状态, 参数:
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
3. 手写Promise实现
var myPromise=new Promise((resolve, reject)=> {
// 需要执行的代码
...
if (/* 异步执行成功 */) {
resolve(value)
} else if (/* 异步执行失败 */) {
reject(error)
}
})
myPromise.then((value)=> {
// 成功后调用, 使用value值
}, (error)=> {
// 失败后调用, 获取错误信息error
})
4. Promise优缺点
function promise () {
this.msg='' // 存放value和error
this.status='pending'
var that=this
var process=arguments[0]
process (function () {
that.status='fulfilled'
that.msg=arguments[0]
}, function () {
that.status='rejected'
that.msg=arguments[0]
})
return this
}
promise.prototype.then=function () {
if (this.status==='fulfilled') {
arguments[0](this.msg)
} else if (this.status==='rejected' && arguments[1]) {
arguments[1](this.msg)
}
}
5. 观察者模式
又称发布-订阅模式, 举例子说明.
实现: 发布者管理订阅者队列, 并有新消息推送功能. 订阅者仅关注更新就行
6. 手写实现bind
Function.prototype.bind=function () {
// 保存原函数
var self=this
// 取出第一个参数作为上下文, 相当于[].shift.call(arguments)
var context=Array.prototype.shift.call(arguments)
// 取剩余的参数作为arg; 因为arguments是伪数组, 所以要转化为数组才能使用数组方法
var arg=Array.prototype.slice.call(arguments)
// 返回一个新函数
return function () {
// 绑定上下文并传参
self.apply(context, Array.prototype.concat.call(arg, Array.prototype.slice.call(arguments)))
}
}
7. 手写实现4种继承
<p style="font-size: 20px"> 123 <p style="font-size: 2em;width: 2em">456</p> </p>// 此时子元素的font-size为40px, 宽度为80px(还要乘以子元素font-size的系数)
8. css菊花图
四个小圆点一直旋转
// 父标签
animation: antRotate 1.2s infinite linear;
// 子标签
animation: antSpin 1s infinite linear;
@keyframe antSpin {
to {
opacity: 1
}
}
@keyframe antRotate {
to {
transform: rotate(405)
}
}
// animation-delay: 逐个延迟0.4s
9. http状态码
10. Object.create实现(原型式继承,特点:实例的proto指向构造函数本身)
11. async和await:
12. 算法和数据结构:
13. 封装JSONP
function jsonp ({url, param, callback}) {
return new Promise((resolve, reject)=> {
var script=document.createElement('script')
window.callback=function (data) {
resolve(data)
document.body.removeChild('script')
}
var param={...param, callback}
var arr=[]
for (let key in param) {
arr.push(`${key}=${param[key]}`)
}
script.src=`${url}?${arr.join('&')}`
document.body.appendChild(script)
})
}
14. 手动实现map(forEach以及filter也类似)
// for循环实现
Array.prototype.myMap=function () {
var arr=this
var [fn, thisValue]=Array.prototype.slice.call(arguments)
var result=[]
for (var i=0; i < arr.length; i++) {
result.push(fn.call(thisValue, arr[i], i, arr))
}
return result
}
var arr0=[1, 2, 3]
console.log(arr0.myMap(v=> v + 1))
// forEach实现(reduce类似)
Array.prototype.myMap=function (fn, thisValue) {
var result=[]
this.forEach((v, i, arr)=> {
result.push(fn.call(thisValue, v, i, arr))
})
return result
}
var arr0=[1, 2, 3]
console.log(arr0.myMap(v=> v + 1))
15. js实现checkbox全选以及反选
<body>
<button id="other">反选</button>
<input type="checkbox" id="all" />全选
<input type="checkbox" class="check" />1
<input type="checkbox" class="check" />2
<input type="checkbox" class="check" />3
<script>
var checkbox=document.getElementsByClassName('check')
var checkAll=document.getElementById('all')
var checkOther=document.getElementById('other')
checkAll.onclick=function() {
var flag=true
for (var i=0; i < checkbox.length; i++) {
if (!checkbox[i].checked) flag=false
}
if (flag) {
for (var i=0; i < checkbox.length; i++) {
checkbox[i].checked=false
}
} else {
for (var i=0; i < checkbox.length; i++) {
checkbox[i].checked=true
}
}
}
checkOther.onclick=function() {
for (var i=0; i < checkbox.length; i++) {
checkbox[i].checked=!checkbox[i].checked
}
}
</script>
</body>
16. 对原型链的理解?prototype上都有哪些属性
17. 为什么使用继承
通常在一般的项目里不需要,因为应用简单,但你要用纯js做一些复杂的工具或框架系统就要用到了,比如webgis、或者js框架如jquery、ext什么的,不然一个几千行代码的框架不用继承得写几万行,甚至还无法维护。
18. setTimeout时间延迟为何不准
单线程, 先执行同步主线程, 再执行异步任务队列
19. 事件循环述,宏任务和微任务有什么区别?
20. let const var作用域
块级作用域, 暂时性死区
21. 节流和防抖
// 函数节流 滚动条滚动
var canRun=true;
document.getElementById("throttle").onscroll=function(){
if(!canRun){
// 判断是否已空闲,如果在执行中,则直接return
return;
}
canRun=false;
setTimeout(function(){
console.log("函数节流");
canRun=true;
}, 300);
};
// 函数防抖
var timer=false;
document.getElementById("debounce").onscroll=function(){
clearTimeout(timer); // 清除未执行的代码,重置回初始化状态
timer=setTimeout(function(){
console.log("函数防抖");
}, 300);
};
22. 实现一个sleep函数
// 这种实现方式是利用一个伪死循环阻塞主线程。因为JS是单线程的。所以通过这种方式可以实现真正意义上的sleep()。
function sleep(delay) {
var start=(new Date()).getTime();
while ((new Date()).getTime() - start < delay) {
continue;
}
}
function test() {
console.log('111');
sleep(2000);
console.log('222');
}
test()
23. 闭包
24. Immutable.js
Facebook出品, 倡导数据的不可变性, 用的最多就是List和Map.
25. js实现instanceof
// 检测l的原型链(__proto__)上是否有r.prototype,若有返回true,否则false
function myInstanceof (l, r) {
var R=r.prototype
while (l.__proto__) {
if (l.__proto__===R) return true
}
return false
}
27. ES6的模块引入和CommonJs区别
28. 严格模式
// 严格模式下, 隐式绑定丢失后this不会指向window, 而是指向undefined
'use strict'
var a=2
var obj={
a: 1,
b: function() {
// console.log(this.a)
console.log(this)
}
}
var c=obj.b
c() // undefined
29. fetch, axios区别
30. typescript缺点
31. 构造函数实现原理
// 模拟构造函数实现
var Book=function(name) {
this.name=name;
};
//正常用法
var java=new Book(‘Master Java’);
//使用代码模拟,在非IE浏览器中测试,IE浏览器不支持
var python={};
python.__proto__=Book.prototype;
Book.call(python, 'Master Python');
32. for in 和 for of区别
33. JS实现并发控制:
使用消息队列以及setInterval或promise进行入队和出队
34. ajax和axios、fetch的区别
35. promise.finally实现
Promise.prototype.finally=function (callback) {
let P=this.constructor;
return this.then(
value=> P.resolve(callback()).then(()=> value),
reason=> P.resolve(callback()).then(()=> { throw reason })
);
};
1. reflow(回流)和repaint(重绘)优化
2.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
3.localStorage 与 sessionStorage 与cookie的区别总结
4.浏览器如何阻止事件传播,阻止默认行为
5.虚拟DOM方案相对原生DOM操作有什么优点,实现上是什么原理?
虚拟DOM可提升性能, 无须整体重新渲染, 而是局部刷新.
JS对象, diff算法
6.浏览器事件机制中事件触发三个阶段
7.什么是跨域?为什么浏览器要使用同源策略?你有几种方式可以解决跨域问题?了解预检请求吗?
8.了解浏览器缓存机制吗?
9.为什么操作 DOM 慢?
DOM本身是一个js对象, 操作这个对象本身不慢, 但是操作后触发了浏览器的行为, 如repaint和reflow等浏览器行为, 使其变慢
10.什么情况会阻塞渲染?
11.如何判断js运行在浏览器中还是node中?
判断有无全局对象global和window
12.关于web以及浏览器处理预加载有哪些思考?
图片等静态资源在使用之前就提前请求
资源使用到的时候能从缓存中加载, 提升用户体验
页面展示的依赖关系维护
13.http多路复用
14. http和https:
15. CSRF和XSS区别及防御
16. cookie可设置哪些属性?httponly?
chrome控制台的application下可查看:
17. 登录后,前端做了哪些工作,如何得知已登录
18. http状态码
19. # Http请求头缓存设置方法
Cache-control, expire, last-modify
20. 实现页面回退刷新
21. 正向代理和反向代理
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
(1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
(2)负载均衡,通过反向代理服务器来优化网站的负载
22. 关于预检请求
在非简单请求且跨域的情况下,浏览器会自动发起options预检请求。
23. 三次握手四次挥手
24. TCP和UDP协议
25. 进程和线程的区别
1. 生命周期
2 .双向数据绑定v-model。这个最好也是自己实现一下 理解更深
通过v-model
VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending';}var hw=helloWorldGenerator();
3.vue父子组件传递参数
4.vue传递参数方法
hw.next()// { value: 'hello', done: false }hw.next()// { value: 'world', done: false }hw.next()// { value: 'ending', done: true }hw.next()// { value: undefined, done: true }
5.vue自定义组件
可以使用独立可复用的自定义组件来构成大型应用, 采用帕斯卡命名法或横线连接, 通过以上方式进行组件间通信. 每一个组件都是Vue实例, 可以使用生命周期钩子.
6. vue自定义指令
7.vuex组成和原理
8.vue-router的原理,例如hashhistory和History interface这些东西要弄明白。其实看一下源码就好了,看不懂可以直接看解析的相关技术博客。
9.vue的seo问题
seo关系到网站排名, vue搭建spa做前后端分离不好做seo, 可通过其他方法解决:
10.预渲染和ssr
以上
11.生命周期内create和mounted的区别
12.监听watch
对应一个对象,键是观察表达式,值是对应回调。值也可以是methods的方法名,或者是对象,包含选项。在实例化时为每个键调用 $watch()
13.登录验证拦截(通过router)
var myPromise=new Promise((resolve, reject)=> { // 需要执行的代码 ... if (/* 异步执行成功 */) { resolve(value) } else if (/* 异步执行失败 */) { reject(error) }})myPromise.then((value)=> { // 成功后调用, 使用value值}, (error)=> { // 失败后调用, 获取错误信息error})
router.beforeEach((from, to, next)=> {
if (to.meta.requireAuth) { // 判断跳转的路由是否需要登录
if (store.state.token) { // vuex.state判断token是否存在
next() // 已登录
} else {
next({
path: '/login',
query: {redirect: to.fullPath} // 将跳转的路由path作为参数,登录成功后跳转到该路由
})
}
} else {
next()
}
})
14. v-for key值
不写key值会报warning, 和react的array渲染类似. 根据diff算法, 修改数组后, 写key值会复用, 不写会重新生成, 造成性能浪费或某些不必要的错误
15. vue3.0的更新和defineProperty优化
15. vue使用this获取变量
正常要通过vm.[图片上传失败...(image-6d2f4e-1570591304185)]
root传参取值
16. jQuery的优缺点,与vue的不同,vue的优缺点?
17. vue解除双向绑定
function promise () { this.msg='' // 存放value和error this.status='pending' var that=this var process=arguments[0] process (function () { that.status='fulfilled' that.msg=arguments[0] }, function () { that.status='rejected' that.msg=arguments[0] }) return this}promise.prototype.then=function () { if (this.status==='fulfilled') { arguments[0](this.msg) } else if (this.status==='rejected' && arguments[1]) { arguments[1](this.msg) }}
18. vue异步组件
为了简化,Vue 允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染
Vue.component(
'async-webpack-example',
// 这个 `import` 函数会返回一个 `Promise` 对象。
()=> import('./my-async-component')
)
19. MVC与MVVM
20. vue渐进式
小到可以只使用核心功能,比如单文件组件作为一部分嵌入;大到使用整个工程,vue init webpack my-project来构建项目;VUE的核心库及其生态系统也可以满足你的各式需求(core+vuex+vue-route)
1. 新旧生命周期
2. react核心
3. fiber核心(react 16)
4. 渲染一个react
5. 高阶组件
高阶组件就是一个函数,且该函数(wrapper)接受一个组件作为参数,并返回一个新的组件。
高阶组件并不关心数据使用的方式和原因,而被包裹的组件也不关心数据来自何处.
6. hook(v16.7测试)
在无状态组件(如函数式组件)中也能操作state以及其他react特性, 通过useState
7. redux和vuex以及dva:
8. react和vue的区别
9. react单向数据流怎么理解
React是单向数据流,数据主要从父节点传递到子节点(通过props)。如果顶层(父级)的某个props改变了,React会重渲染所有的子节点。
10. React算法复杂度优化
react树对比是按照层级去对比的, 他会给树编号0,1,2,3,4.... 然后相同的编号进行比较。所以复杂度是n,这个好理解。
关键是传统diff的复杂度是怎么算的?传统的diff需要出了上面的比较之外,还需要跨级比较。他会将两个树的节点,两两比较,这就有n^2的复杂度了。然后还需要编辑树,编辑的树可能发生在任何节点,需要对树进行再一次遍历操作,因此复杂度为n。加起来就是n^3了。
11. React优点
声明式, 组件化, 一次学习, 随处编写. 灵活, 丰富, 轻巧, 高效
1. 移动端兼容适配
2. flexible如何实现自动判断dpr
判断机型, 找出样本机型去适配. 比如iphone以6为样本, 宽度375px, dpr是2
3. 为什么以iPhone6为标准的设计稿的尺寸是以750px宽度来设计的呢?
iPhone6的满屏宽度是375px,而iPhone6采用的视网膜屏的物理像素是满屏宽度的2倍,也就是dpr(设备像素比)为2, 并且设计师所用的PS设计软件分辨率和像素关系是1:1。所以为了做出的清晰的页面,设计师一般给出750px的设计图,我们再根据需求对元素的尺寸设计和压缩。
4. 如何处理异形屏iphone X
5. 移动端首屏优化
6. PWA全称Progressive Web App,即渐进式WEB应用
一个 PWA 应用首先是一个网页, 可以通过 Web 技术编写出一个网页应用. 随后添加上 App Manifest 和 Service Worker 来实现 PWA 的安装和离线等功能
解决了哪些问题?
7. 离线包方案
现在 web 页面在移动端的地位越来越高,大部分主流 App 采用 native + webview 的 hybrid 模式,加载远程页面受限于网络,本地 webview 引擎,经常会出现渲染慢导致的白屏现象,体验很差,于是离线包方案应运而生。动态下载的离线包可以使得我们不需要走完整的 App 审核发布流程就完成了版本的更新
8. 自适应和响应式布局的区别
1. babel和polyfill
2. jpg, jpeg和png区别
3. git rebase和merge区别
1.JSBridge通信原理, 有哪几种实现的方式?
JsBridge给JavaScript提供了调用Native功能,Native也能够操控JavaScript。这样前端部分就可以方便使用地理位置、摄像头以及登录支付等Native能力啦。JSBridge构建 Native和非Native间消息通信的通道,而且是 双向通信的通道。
2.实现一个简单的 JSBridge,设计思路?
1. 二分查找和冒泡排序
2. 快速排序
Function.prototype.bind=function () { // 保存原函数 var self=this // 取出第一个参数作为上下文, 相当于[].shift.call(arguments) var context=Array.prototype.shift.call(arguments) // 取剩余的参数作为arg; 因为arguments是伪数组, 所以要转化为数组才能使用数组方法 var arg=Array.prototype.slice.call(arguments) // 返回一个新函数 return function () { // 绑定上下文并传参 self.apply(context, Array.prototype.concat.call(arg, Array.prototype.slice.call(arguments))) }}
3. 最长公共子串
function Father () {}function Child () {}// 1\. 原型继承Child.prototype=new Father()// 2\. 构造继承function Child (name) { Father.call(this, name)}// 3\. 组合继承function Child (name) { Father.call(this, name)}Child.prototype=new Father()// 4\. 寄生继承function cloneObj (o) { var clone=object.create(o) clone.sayName=... return clone}// 5\. 寄生组合继承// 6\. ES6 class extend继承
4. 最长公共子序列(LCS动态规划)
另一篇
// 父标签animation: antRotate 1.2s infinite linear;// 子标签animation: antSpin 1s infinite linear;@keyframe antSpin { to { opacity: 1 }}@keyframe antRotate { to { transform: rotate(405) }}// animation-delay: 逐个延迟0.4s
5. 数组去重,多种方法
6. 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)
// 使用柯里化 + 递归
function curry ( fn ) {
var c=(...arg)=> (fn.length===arg.length) ?
fn (...arg) : (...arg1)=> c(...arg, ...arg1)
return c
}
7. 反转二叉树
var invertTree=function (root) {
if (root !==null) {
[root.left, root.right]=[root.right, root.left]
invertTree(root.left)
invertTree(root.right)
}
return root
}
8. 贪心算法解决背包问题
var items=['A','B','C','D']
var values=[50,220,60,60]
var weights=[5,20,10,12]
var capacity=32 //背包容积
greedy(values, weights, capacity) // 320
function greedy(values, weights, capacity) {
var result=0
var rest=capacity
var sortArray=[]
var num=0
values.forEach((v, i)=> {
sortArray.push({
value: v,
weight: weights[i],
ratio: v / weights[i]
})
})
sortArray.sort((a, b)=> b.ratio - a.ratio)
sortArray.forEach((v, i)=> {
num=parseInt(rest / v.weight)
rest -=num * v.weight
result +=num * v.value
})
return result
}
9. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
function FindNumbersWithSum(array, sum)
{
var index=0
for (var i=0; i < array.length - 1 && array[i] < sum / 2; i++) {
for (var j=i + 1; j < array.length; j++) {
if (array[i] + array[j]===sum) return [array[i], array[j]]
}
//index=array.indexOf(sum - array[i], i + 1)
// if (index !==-1) {
// return [array[i], array[index]]
//}
}
return []
10. 二叉树各种(层序)遍历
深度广度遍历
// 根据前序和中序重建二叉树
/* function TreeNode(x) {
this.val=x;
this.left=null;
this.right=null;
} */
function reConstructBinaryTree(pre, vin)
{
var result=null
if (pre.length===1) {
result={
val: pre[0],
left: null,
right: null
}
} else if (pre.length > 1) {
var root=pre[0]
var vinRootIndex=vin.indexOf(root)
var vinLeft=vin.slice(0, vinRootIndex)
var vinRight=vin.slice(vinRootIndex + 1, vin.length)
pre.shift()
var preLeft=pre.slice(0, vinLeft.length)
var preRight=pre.slice(vinLeft.length, pre.length)
result={
val: root,
left: reConstructBinaryTree(preLeft, vinLeft),
right: reConstructBinaryTree(preRight, vinRight)
}
}
return result
}
// 递归
// 前序遍历
function prevTraverse (node) {
if (node===null) return;
console.log(node.data);
prevTraverse(node.left);
prevTraverse(node.right);
}
// 中序遍历
function middleTraverse (node) {
if (node===null) return;
middleTraverse(node.left);
console.log(node.data);
middleTraverse(node.right);
}
// 后序遍历
function lastTraverse (node) {
if (node===null) return;
lastTraverse(node.left);
lastTraverse(node.right);
console.log(node.data);
}
// 非递归
// 前序遍历
function preTraverse(tree) {
var arr=[],
node=null
arr.unshift(tree)
while (arr.length) {
node=arr.shift()
console.log(node.root)
if (node.right) arr.unshift(node.right)
if (node.left) arr.unshift(node.left)
}
}
// 中序遍历
function middleTraverseUnRecursion (root) {
let arr=[],
node=root;
while (arr.length !==0 || node !==null) {
if (node===null) {
node=arr.shift();
console.log(node.data);
node=node.right;
} else {
arr.unshift(node);
node=node.left;
}
}
}
// 广度优先-层序遍历
// 递归
var result=[]
var stack=[tree]
var count=0
var bfs=function () {
var node=stack[count]
if (node) {
result.push(node.value)
if (node.left) stack.push(node.left)
if (node.right) stack.push(node.right)
count++
bfs()
}
}
bfs()
console.log(result)
// 非递归
function bfs (node) {
var result=[]
var queue=[]
queue.push(node)
while (queue.length) {
node=queue.shift()
result.push(node.value)
node.left && queue.push(node.left)
node.right && queue.push(node.right)
}
return result
}
11. 各种排序
// 插入排序
function insertSort(arr) {
var temp
for (var i=1; i < arr.length; i++) {
temp=arr[i]
for (var j=i; j > 0 && temp < arr[j - 1]; j--) {
arr[j]=arr[j - 1]
}
arr[j]=temp
}
return arr
}
console.log(insertSort([3, 1, 8, 2, 5]))
// 归并排序
function mergeSort(array) {
var result=array.slice(0)
function sort(array) {
var length=array.length
var mid=Math.floor(length * 0.5)
var left=array.slice(0, mid)
var right=array.slice(mid, length)
if (length===1) return array
return merge(sort(left), sort(right))
}
function merge(left, right) {
var result=[]
while (left.length || right.length) {
if (left.length && right.length) {
if (left[0] < right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
} else if (left.length) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
return result
}
return sort(result)
}
console.log(mergeSort([5, 2, 8, 3, 6]))
// 二分插入排序
function twoSort(array) {
var len=array.length,
i,
j,
tmp,
low,
high,
mid,
result
result=array.slice(0)
for (i=1; i < len; i++) {
tmp=result[i]
low=0
high=i - 1
while (low <=high) {
mid=parseInt((high + low) / 2, 10)
if (tmp < result[mid]) {
high=mid - 1
} else {
low=mid + 1
}
}
for (j=i - 1; j >=high + 1; j--) {
result[j + 1]=result[j]
}
result[j + 1]=tmp
}
return result
}
console.log(twoSort([4, 1, 7, 2, 5]))
12. 使用尾递归对斐波那契优化
递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
// 传统递归斐波那契, 会造成超时或溢出
function Fibonacci (n) {
if ( n <=1 ) {return 1};
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Fibonacci(10) // 89
Fibonacci(100) // 超时
Fibonacci(500) // 超时
// 使用尾递归优化, 可规避风险
function Fibonacci2 (n , ac1=1 , ac2=1) {
if( n <=1 ) {return ac2};
return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}
Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity
13. 两个升序数组合并为一个升序数组
function sort (A, B) {
var i=0, j=0, p=0, m=A.length, n=B.length, C=[]
while (i < m || j < n) {
if (i < m && j < n) {
C[p++]=A[i] < B[j] ? A[i++] : B[j++]
} else if (i < m) {
C[p++]=A[i++]
} else {
C[p++]=B[j++]
}
}
return C
}
1. node的router是什么
2. 数据库索引是啥
3. 浏览器的事件循环和node事件循环有什么区别?
以上就是前端面试题全面整理-带解析 涵盖(css、js、浏览器、vue、react、移动web、前端性能、算法、node)的详细内容,更多请关注html中文网其它相关文章!
我是@半糖学前端 ,专注前端技术领域分享,一个前端从业者,关注我和我一起学习,共同进步!
*请认真填写需求信息,我们会在24小时内与您取得联系。