Open TokenYangForever opened 7 years ago
Node
Q:什么是Event loop A: * 直译过来就是事件循环,在node.js中,事件循环可以让node能够进行无阻塞的I/O操作(尽管js是单线程的)。node遇到I/O操作(包括文件I/O、http请求等)时,把这些操作交给操作系统来处理,处理好后通过callback回调函数返回给nodejs线程,然后排列在事件循环队列里依次执行回调函数。
Css
Q:移动端Retina屏幕1px边框效果 A: * 伪类 + transform:利用 :before 或者 :after 重做 border ,并 transform 的 scale 缩小一半,原先的元素相对定位,新做的 border 绝对定位。
.scale-1px{
position: relative;
border:none;
}
.scale-1px:after{
content: '';
position: absolute;
bottom: 0;
background: #000;
width: 100%;
height: 1px;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
}
@media screen and (-webkit-min-device-pixel-ratio: 2) {
.border { border: 0.5px solid #999 }
}
@media screen and (-webkit-min-device-pixel-ratio: 3) {
.border { border: 0.333333px solid #999 }
}
position: absolute; left: 50%; top: 50%;
transform: translate(-50%, -50%);
Q: Http2协议有哪些特点 A: 将数据消息分解为独立的帧,交错发送(解决队头阻塞、不再需要使用雪碧图这种方法);头部压缩
Q: 静态类型语言和强类型语言之间有什么区别? A:强类型语言:不能隐式转换类型:'1' + 1会报错。例如:Java、python。 弱类型语言:可以隐式转换,'1' + 1 = '11'。例如:JavaScript。 静态类型语言:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。 动态类型语言:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。
javascript
Q: Fetch API相对于传统的Ajax有哪些改进?有哪些Ajax能做到的,fetch不能做到 A: fetch基于promise,可以更好地写异步流程代码。
Q: ES Modules 和 commonJS区别 A:
Q: 解释一下双向绑定和单向数据流(mvmv框架中) A:
Q:JavaScript中的iterators和iterables是什么?有哪些原生的iterator? A:遍历器(Iterator)是一种遍历接口机制,只要一个对象的[Symbol.iterator]属性对应的函数有效的,那么这个对象就是可遍历(iterables)的,可遍历的对象就可以通过for..of来遍历使用。iterator还可以和generator函数一起使用,每次遍历返回一个yield后面的值。set、map、Array这些原生数据接口都是可遍历的。
Q: new关键字做了那些事 A: 新建一个对象,构造函数的原型赋值给新对象(原型继承),执行构建函数的代码,this指向这个对象。返回该对象。
Q: react与vue的比较 A:
Q:说说单线程的优缺点 A:优点:不用在意多线程编程中的状态同步问题、死锁问题; 缺点:一单出错,整个程序都会退出(健壮性欠缺)。像浏览器中JavaScript与UI共用一个线程一样,JavaScript长时间执行会导致UI的渲染和响应被中断。在Node中,长时间的CPU占用也会导致后续的异步I/O发不出调用,已完成的异步I/O的回调函数也会得不到及时执行。
Q: js中内存回收 A: JavaScript创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放内存。 不再被引用、以及从全局对象出发无法获取到的变量,其内存就会被释放。那些无法从根对象查询到的对象都将被清除
Q: 说一说promise A:
Q: 项目上的单页面应用如何实现? A: require.js实现模块化,text插件可以引入html/css文件,所以只要根据页面路由引入js文件,即可实现单页面的跳转。使用history的pushState、replaceState方法监听链接地址,实现后退返回上一个页面的功能
Q: target和currentTarget、事件流、事件代理 A: http://www.jianshu.com/p/dc1054bda70c
Q: 什么是函数柯里化?以及说一下JS的API有哪些应用到了函数柯里化的实现? A: 函数式编程的一些概念:
纯函数:对于相同的输入永远得到相同的输出,不依赖外部环境的状态。无可观察副作用
函数柯里化:将参数较多的函数转换成参数较少的函数。柯里化是一种“预加载”函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,某种意义上讲,这是一种对参数的“缓存”,是一种非常高效的编写函数的方法。
其他
下面这些操作(影响到页面render tree结构布局)会引起回流: 1、添加或者删除可见的DOM元素; 2、元素位置改变; 3、元素尺寸改变——边距、填充、边框、宽度和高度 4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变; 5、页面渲染初始化; 6、浏览器窗口尺寸改变——resize事件发生时;
而改变元素颜色以及visibility:hidden,就只会引起重绘,不会引起回流。
尽量减少对dom元素的频繁操作;集中修改样式(修改元素的className来一次性修改多项样式)
cookie可以在浏览器和服务器端来回传递数据,而localStorage和sessionStorage不会把数据发送给服务器,仅会保存在本地。cookie会在浏览器请求头或者ajax请求头中发送cookie内容。
cookie可以设置过期日期,sessionStorage是会话级的数据,浏览器窗口关闭时清除,localStorage是永久性的数据,一旦赋值,不管多长时间这值都是存在的,除非手动清除。cookie存储空间小,localStorage和sessionStorage更大。
cookie需要web服务器(后端)支持,比如你在本地打开一个静态html页面,就不能使用cookie了,而localStorage和sessionStorage可以使用。
为localStorage和sessionStorage设置过期时间,存储时把有效期和设置的初始时间同时存入storage,在读取的时候进行判断,如果已过期则清除storage
storage限制大小与浏览器有关,一般为5m,存储达到最大值后再执行set操作会报错。
gzip on; gzip_min_length 5k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 3; gzip_types application/javascript text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on;
Referer
(来源)是否是本站的,tasks 和 microtasks: tasks可以理解为一个需要按序执行的任务队列。tasks之间,浏览器可以更新渲染,来自鼠标点击的事件回调需要安排一个 task(macrotask宏任务),解析 HTML 和 setTimeout 同样需要。 Mircotasks(宏任务):通常是在当前task代码执行完成后,下一个task代码开始前执行,例如promise的异步操作或者mutation observer的回调就放在microtasks里执行,避免新建一个task。在执行一个microstask时,如果产生一个新的microstask,那么新产生的任务也会放在队列尾部执行(同样是在下一个task之前)。
setTimeout 和 promise。可以这样理解:setTimeout的回调函数一定是在下一个task(macrotask宏任务)执行的,promise的回调放在microtask(微任务)里,在第一个task执行完后执行,promise.then()返回的新的promise回调同样放到microtask中(在第一个task之后第二个task之前执行)。
总结:微任务是在宏任务之间执行的,microtasks包括:promise、mutation observer。task包括:setTimeout、setInterval、setImmediate、I/O、UI交互事件。
注:在node环境中,nextTick会在每一轮的宏任务之前普通任务之后执行,它不属于宏任务
渐进增强(Progressive Enhancement):一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。
优雅降级(Graceful Degradation):一开始就构建站点的完整功能,然后针对低版本浏览器测试和修复、hack新功能。