前端面试题
js部分
js据类型
基本数据类型:String,Number,Boolean,Null,undefined
split() join() 的区别
前者是将字符串切割成数组的形式,后者是将数组转换成字符串
.Event Loop & 宏任务微任务
JavaScript是单线程语言,单线程意味着所有任务需要排队执行,可将任务分为同步任务和异步任务两种。
同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕才能执行后一个任务;异步任务是指不进入主线程而进入任务队列的任务,只有任务队列通知主线程某个异步任务可执行,该任务才会进入主线程执行。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。它们的具体运行机制为:
1.所有同步任务都在主线程上执行,形成一个执行栈;
2.还存在一个任务队列,只要异步任务有了结果,就在任务队列中放置一个事件;
3.当执行栈所有同步任务完成,系统就会读取任务队列,将事件对应的异步任务加入执行栈执行。这个过程是循环不断的,所以整个运行机制称为Event Loop(事件循环)。任务又能进一步细分为宏任务和微任务,宏任务如主代码块,setTimeout等,微任务如Promise等。每执行一个宏任务后,会执行完所有微任务,再从下一个宏任务开始。因此以下代码会按序号输出:
js事件、事件流
事件
事件是文档或者浏览器窗口中发生的,特定的交互瞬间。
事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字。事件是javaScript和DOM之间交互的桥梁。
事件流
你若触发,我便执行——事件发生,调用它的处理函数执行相应的JavaScript代码给出响应。
典型的例子有:页面加载完毕触发load事件;用户单击元素,触发click事件。
事件委托是什么
事件代理又称事件委托,是javaScript中绑定事件的常用技巧。顾名思义,‘事件代理’就是把原本需要绑定的事件委托给父元素,让父元素负责事件监听。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能
数组对象有哪些原生方法,列举一下
pop、push、shift、unshift、splice、reverse、sort、concat、join、slice、toString、indexOf、lastIndexOf、reduce、reduceRight
forEach、map、filter、every、some
settimeout和setinterval区别
setTimeout只在指定时间后执行一次,代码如下:
下面展示一些 内联代码片
。
<script>
//定时器 异步运行
function hello(){
alert("hello");
}
//使用方法名字执行方法
var t1 = window.setTimeout(hello,1000);
var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法
window.clearTimeout(t1);//去掉定时器
</script>
setInterval以指定时间为周期循环执行,代码如下:
//实时刷新时间单位为毫秒
setInterval('refreshQuery()',8000);
/* 刷新查询 */
function refreshQuery(){
$("#mainTable").datagrid('reload',null);
}
两种方法根据不同的场景和业务需求择而取之,
一般情况下setTimeout用于延迟执行某方法或功能,
setInterval则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步
防抖与节流
css
重绘与回流
浏览器使用流式布局,把HTML解析成DOM,CSS解析成CSSOM,两者合并就产生了Render Tree渲染树。一旦Render Tree构建完毕后,浏览器就可以根据它来绘制页面了。
当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。会导致回流的操作如页面首次渲染,浏览器窗口大小改变,元素尺寸、位置、内容等变化,添加或删除可见DOM元素,**CSS伪类等;会导致回流的属性和方法如clientWidth、offsetWidth、scrollWidth等。
而当页面中元素只是样式改变,并不影响它在文档流中的位置时,浏览器将新样式赋予元素并重新绘制,这个过程则称为重绘。
可见回流必将引起重绘,重绘不一定会引起回流,页面布局和几何属性改变时就需要回流,回流比重绘代价更高。不过现代浏览器会维护一个队列,将多次的变动“攒着”,等积累一定数量的变动再一次性执行,但比如取offsetWidth这样的属性时,浏览器为了给精确的值会立即刷新队列。因此,避免重绘与回流的方法有:避免频繁操作样式,最好一次性重写style属性,或者将样式定义为class并一次性更改class属性;
避免频繁操作DOM,尽量使用离线的DOM,比如创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加回中;
也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘;
避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来;对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。
正在持续更新中,也欢迎前端小伙伴和我一起更新 ,也欢迎提出好的建议和不足的地方