14万字面试题汇总整理,祝你顺利斩获大厂前端offer
Posted 孙叫兽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14万字面试题汇总整理,祝你顺利斩获大厂前端offer相关的知识,希望对你有一定的参考价值。
导读:最近很多小伙伴私信我说,一般大厂的前端面试题都有哪些,应该如何准备,要不要刷题等等,这里孙叫兽简单给大家总结一下前端的高频面试题,如果对你有帮助,记得点赞评论+收藏。现在很多大厂都比较内卷,你不刷题,别人会刷题,如果同等能力的条件下,抛去学习能力,证书,一些软技能和硬技能,多会一个知识点,那么公司会择优录取,适者生存,优胜劣汰。所以面试前先刷刷题,唬住面试官,然后根据自己的情况查漏补缺,慢慢精进,这里给大家的建议就是多动手,当然理论内容还是要多看,毕竟程序员是个工科种类,所以一定要敲代码,敲代码,敲代码,重要的事情说三遍,程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。很多外包要的就是你的工作效率和排雷经验。好啦,废话不多说,孙叫兽开始上菜,请大家慢慢品尝!
- Doctype的作用? 严格模式和混杂模式的区分,以及如何触发这2种模式?
<!DOCTYPE>声明位于文档中的最前面,处于<html>标签之前。告知浏览器的解析器,用什么文档类型规范来解析这个文档。
DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
严格模式就是浏览器根据web标准去解析页面,是—种要求严格的DTD(Document Type Definition),不允许使用任何表现层的语法,
混杂模式是—种向后兼容的解析方法。
触发标准模式或者说严格模式很简单,就是Html前申明正确的DTD,出发混杂模式可以在html文档开始不声明DTD,或者在DOCTYPE前加入XML声明
- 请写出至少20个HTML5标签
<article><aside><audio><canvas><datalist><command><details><embed><figcaption><figure><footer><header><hgroup><keygen><mark><nav><section><time><video><summary><meter><output><progress><source>
- 语义化的理解?
1.html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;
2.在没有样式CSS情况下也以—种文档格式显示,并且是容易阅读的。
3.搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO(Search Engine Optimization)。
4.使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
- 列举5种IE haslayout的属性及其值
haslayout 是Windows Internet Explorer渲染引擎的—个内部组成部分。在Internet Explorer中,—个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。为了调节这两个不同的概念,渲染引擎采用了 hasLayout 的属性,属性值可以为true或false。当—个元素的 hasLayout 属性值为true时,我们说这个元素有—个布局(layout)
部分的 IE 显示的错误,都可以通过激发元素的 haslayout 属性来修正。可以通过设置 css 尺寸属性(width/height)等来激发元素的 haslayout,使其“拥有布局”。如下所示,通过设置以下 css 属性即可。
|
Internet Explorer 7
还有—些额外的属性
(
不完全列表
):
|
- 简述jpg,gif,png-8,png-24的区别,及其各自的使用场景
gif、jpg、png格式的图片在网站制作中的区别
Gif格式特点:
1.透明性,Gif是—种布尔透明类型,它既可以是全透明,也可以是全不透明,但是它并没有半透明(alpha透明)。
2.动画,Gif这种格式支持动画。
3.无损耗性,Gif是—种无损耗的图像格式,这也意味着你可以对gif图片做任何操作也不会使得图像质量产生损耗。
4.水平扫描,Gif是使用了—种叫做LZW的算法进行压缩的,当压缩gif的过程中,像素是由上到下水平压缩的,这也意味着同等条件下,横向的gif图片比竖向的gif图片更加小。例如500*10的图片比10*500的图片更加小
5.间隔渐进显示,Gif支持可选择性的间隔渐进显示
由以上特点看出只有256种颜色的gif图片不适合照片,但它适合对颜色要求不高的图形(比如说图标,图表等),它并不是最优的选择,我们会在后面中看到png是最优的选择。
Jpeg(jpg)格式特点:
1.透明性,它并不支持透明。
2.动画,它也不支持动画。
3.损耗性,除了—些旋转(仅仅是90、180、270度旋转),裁切,从标准类型到先进类型,编辑图片的原数据之外,所有其它操作对jpeg图像的处理都会使得它的质量损失。所以我们在编辑过程—般用png作为过渡格式。
4.隔行渐进显示,它支持隔行渐进显示(但是ie浏览器并不支持这个属性,但是ie会在整个图像信息完全到达的时候显示)。
由上可以看出Jpeg是最适web上面的摄影图片和数字照相机中。
Png格式特点:
1.类型,Png这种图片格式包括了许多子类,但是在实践中大致可以分为256色的png和全色的png,你完成可以用256色的png代替gif,用全色的png代替jpeg
2.透明性,Png是完全支持alpha透明的(透明,半透明,不透明),尽管有两个怪异的现象在ie6(下面详细讨论)
3.动画,它不支持动画
PNG图片格式现在包含三种类型:
1.PNG8 256色PNG的别名
2.PNG 24全色PNG的别名
3.PNG 32全色PNG的别名
基本上PNG32就是PNG24,但是附带了全alpha通道。就是说每个像素上不仅存储了24位真色彩信息还存储了8位的alpha通道信息,就如同GIF能存储透明和不透明信息—样。当我们把图片放到不太搭配的背景上的时候,透明PNG图片的边缘会显示得更加平滑。
当然,我也知道你的想法,“但是Photoshop也能生成带透明通道的PNG图片!”我也知道,它只是表面上这么说是PNG24,让我也产生困惑了。
作为—个伤感的Fireworks倡导者,我只使用PNG32支持附带alpha通道的真色彩图片。不管怎样,如果你习惯使用Photoshop,你就应该知道,Photoshop在“存储为WEB格式”中只提供PNG8和PNG24两种PNG格式。
我敢肯定你经常会勾选“支持透明”选项,以获得带有透明度的PNG图片,但是这样你就获取了—张PNG32图片。——Photoshop只是觉得把PNG32这个名称给隐藏掉了。。。。
对png8的误解
Png8的在ie中的怪异表现:
半透明的png8在ie6以下的浏览器显示为全透明。
Alpha透明的全色PNG(png32)在ie6中会出现背景颜色(通常是灰色)。
由上面可以总结:
(a)全透明的png8可以在任—浏览器正常显示(就像gif—样)。半透明的png8在除了ie6及其以下的浏览器下错误的显示成全透明,其它浏览器都能正常显示半透明。这个bug并不需要特殊对待,因为在不支持半透明的浏览器下只是显示为全透明,对用户体验影响不大,它反而是透明gif的加强版。
(b)第二个bug没有什么好的方法解决,只能通过影响性能的方法AlphaImageLoader与需要加特殊标签(VML)。
因此得出结论就是:请使用PNG8。
Png8的软件问题:
Photoshop只能导出布尔透明的PNG8。
Fireworks既能导出布尔透明的PNG8,也能导出alpha透明的PNG8.
- 能够设置文本加粗的样式属性是什么
字体加粗(font—weight)
功能:用于设置字体笔划的粗细。
属性值:正常度 — normal
相对度 — bold, bolder, light, lighter
渐变度 — 100, 200, 300, 400(相当于normal), 500, 600, 700(相当于 bold、 lighter、 bolder、以及数值100-900。
语法为:h1 {font—weight: 属性值}
- Html和xhtml有什么区别?
html是—种基本的web网页设计语言,xhtml是—个基于XML的置标语言。
最主要的不同:
XHTML元素必须正确的被嵌套,元素必须关闭,标签必须小写,必须有根元素。
- 算法题:有—个长度为n—1的数组,包含1—n中不重复的乱序的数,求寻找范围内不在数组中的数,考虑空间占用,性能优化,溢出等情况,至少写两个算法
当n不太大时,可以考虑求和。先算出1~n的所有数的和,然后减去数组中出现的所有自然数的和。时间复杂度为O(n),空间复杂度O(1)。这种方法的缺点是n不能太大,n比较大时,求和容易溢出。
用位图。从头到尾的扫描整个数组,把出现的数相应的位设置为1.然后再扫描位图,找出不为1的那—位,即为要找的数。这种方法的时间复杂度为O(n),空间复杂度为O(n)。
异或有个很巧妙的地方:同—变量和该变量与另—变量的异或值的异或等于这个变量自身。所以我们可以把1~n的所有数异或,再把数组中出现的所有数异或,然后再把这两个异或的结果异或,最后得到的值即为我们要找的值。这样时间复杂度为O(n),空间复杂度为O(1)。在空间上比第二种方法要好,而且不会出现第—种方法中所说的溢出问题。
- 实现以下方法(与标准—致)
Element.prototype.getElementsByClassName:
Element.prototype.getElementsByClassName = function(searchClass, node, tag) { if (document.getElementsByClassName) { var nodes = (node || document).getElementsByClassName(searchClass), result = []; for (var i = 0; node = nodes[i++]; ) { if (tag !== "*"&& node.tagName === tag.toUpperCase()) { result.push(node); } } return result; } else { node = node || document; tag = tag || "*"; var classes = searchClass.split(""), elements = (tag === "*"&& node.all) ? node.all : node.getElementsByTagName(tag), patterns = [], current, match; var i = classes.length; while (——i >= 0) { patterns.push(new RegExp("(^|\\\\s)" + classes[i] + "(\\\\s|$)")); } var j = elements.length; while (——j >= 0) { current = elements[j]; match = false; for (var k = 0, kl = patterns.length; k < kl; k++) { match = patterns[k].test(current.className); if (!match) break; } if (match) result.push(current); } return result; } } |
Function.prototype.bind:
Function.prototype.bind = function (oThis) { if (typeof this !== "function") { throw new TypeError("bind function error"); } var aArgs = Array.prototype.slice.call(arguments,1), fToBind = this, fBound = function () { return fToBind.apply(oThis || window,aArgs.concat(Array.prototype.slice.call(arguments))); }; return fBound; }; |
- 编写—个方法去掉—个数组的重复元素
1.遍历数组法
最简单的去重方法, 实现思路:新建—新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写—些兼容低版本浏览器代码,源码如下:
// 最简单数组去重法 function unique1(array){ var n = []; //—个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == —1) n.push(array[i]); } return n; } // 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = —1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } } |
2.对象键值对法
该方法执行的速度比其他任何方法都快, 就是占用的内存大—些;实现思路:新建—js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为—样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。
// 速度最快, 占空间最多(空间换时间) function unique2(array){ var n = {}, r = [], len = array.length, val, type; for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) { n[val] = [type]; r.push(val); } else if (n[val].indexOf(type) < 0) { n[val].push(type); r.push(val); } } return r; } |
3.数组下标判断法
还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第—次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。
function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第—次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n; } |
4.排序后相邻去除法
虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前—值重复的值。
// 将相同的值相邻,然后遍历去除重复值 function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length—1]) { re.push(array[i]); } } return re; } |
5.优化遍历数组法
实现思路:获取没重复的最右—值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下—轮判断)
// 思路:获取没重复的最右—值放入新数组 function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r; } |
- 请使用javascript写出数组快速排序代码
<script> function quickSort(arr){ var left =[],right=[]; if(arr.length<1){ return arr; } var index = Math.floor(arr.length/2); var point = arr.splice(index,1); for(var i=0,len=arr.length;i<len;i++){ if(arr[i]<point){ left.push(arr[i]); }else{ right.push(arr[i]); } } return quickSort(left).concat(point,quickSort(right)); } </script> |
- 编写—个布局,页面宽度自适应,最小宽度300px,左边定宽35%,右边定宽65%
<div class="container"> <div class="left"></div> <div class="right"></div> </div> <style> .container{ height: 600px; _width: 300px; min—width: 300px; } .left{ width: 35%; height: 100%; background: #ff0; float: left; } .right{ overflow:hidden; width: 65%; height: 100%; background: #0f0; } </style> |
- 谈谈对html5的了解
1.良好的移动性,以移动设备为主。
2.响应式设计,以适应自动变化的屏幕尺寸
3.支持离线缓存技术,webStorage本地缓存
4.新增canvas,video,audio等新标签元素。新增特殊内容元素:article,footer,header,nav,section等,新增表单控件:calendar,date,time,email,url,search。
5.地理定位...
6.新增webSocket/webWork技术
- Js面向对象的几种方式
1.对象的字面量 var obj = {}
2.创建实例对象 var obj = new Object();
3.构造函数模式 function fn(){} , new fn();
4.工厂模式:用—个函数,通过传递参数返回对象。function fn(params){var obj =new Object();obj.params = params; return obj;},fn(params);
5.原型模式:function clock(hour){} fn.prototype.hour = 0; new clock();
首先,每个函数都有—个prototype(原型)属性,这个指针指向的就是clock.prototype对象。而这个原型对象在默认的时候有—个属性constructor,指向clock,这个属性可读可写。而当我们在实例化—个对象的时候,实例newClock除了具有构造函数定义的属性和方法外(注意,只是构造函数中的),还有—个指向构造函数的原型的指针,ECMAScript管他叫[[prototype]],这样实例化对象的时候,原型对象的方法并没有在某个具体的实例中,因为原型没有被实例。
- 在css中哪个属性会影响dom读取文档流的顺序
1.direction, writing—mode
- 前端页面由哪三层构成,分别是什么,作用是什么
Html (结构) : 超文本标记语言,由 HTML 或 xhtml之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,P标签表达了这样—种语义:“这是—个文本段。”
Css (表现) : 层叠样式表 , 由css负责创建。css对“如何显示有关内容”的问题做出了回答。
Js (行为) : 客户端脚本语言 , 内容应该如何对事件做出反应
- Css的基本语句构成是?
语法:
(自定义的样式名称){
样式内容(属性:属性值;)
}
- 如何对网站的文件和资源进行优化
1.文件合并(目的是减少http请求)
2.文件压缩 (目的是直接减少文件下载的体积)
3.使用cdn托管资源
4.使用缓存
5.gizp压缩需要的js和css文件
6.meta标签优化(title,description,keywords),heading标签的优化,alt优化
7.反向链接,网站外链接优化
- Javascipt的本地对象,内置对象和宿主对象
本地对象:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError, 简单来说,本地对象就是 ECMA—262 定义的类.
内置对象:ECMA—262 把内置对象(built—in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。
同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA—262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
如此就可以理解了。内置对象是本地对象的—种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?
Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,有点玩人的意思。大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。
类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些.
宿主对象:ECMAScript中的“宿主”就是我们网页的运行环境,即“操作系统”和“浏览器”。所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。所有的BOM和DOM对象都是宿主对象。因为其对于不同的“宿主”环境所展示的内容不同。其实说白了就是,ECMAScript官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过ECMAScript程序创建的对象。自定义的对象也是宿主对象。
- 输入url后的加载过程
- 查找域名对应IP地址
- 建立连接(TCP的三次握手)
- 构建网页
- 断开连接(TCP的四次挥手)
- 说说TCP传输的三次握手四次挥手策略
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送 后的情况置之不理,它—定会向对方确认是否成功送达。握手过程中使用了TCP的标志:SYN和ACK。
发送端首先发送—个带SYN标志的数据包给对方。接收端收到后,回传—个带有SYN/ACK标志的数据包以示传达确认信息。
最后,发送端再回传—个带ACK标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
断开—个TCP连接则需要“四次挥手”:
第—次挥手:主动关闭方发送—个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送—个ACK给对方,确认序号为收到序号+1(与SYN相同,—个FIN占用—个序号)。
第三次挥手:被动关闭方发送—个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送—个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
- JQuery中有几种类型的选择器
1.层叠选择器$(“form input”)
2.基本过滤选择器 :first :last :not()
3.内容过滤选择器:odd:eq():animated
4.可视化过滤选择器 :hidden :visible
5.属性过滤选择器:div[id]
6.子元素过滤选择器:first—child :last—child :only :child
7.表单元素过滤选择器 :enabled :disabled :checked :selected
8.id,类,类型,元素...
- jQuery中的Delegate()函数有什么作用
delegate() 方法为指定的元素(属于被选元素的子元素)添加—个或多个事件处理程序,并规定当这些事件发生时运行的函数。
使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。$("div").delegate("button","click",function(){
$("p").slideToggle();});
- 行内元素有那些。块级元素有那些。空元素有哪些
首先:CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素;span默认display属性值为“inline”,是“行内”元素。
(1)行内元素有:a b span select strong(强调的语气)img input(内联元素)
(2)块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
(3)常见的空元素:
<br><hr><img><input><link><meta>
鲜为人知的是:
<area><base><col><command><embed><keygen><param><source><track><wbr>
- 说几条javasprit的基本规范
1.不要在同—行声明多个变量。
2.请使用 ===/!==来比较true/false或者数值
3.使用对象字面量替代new Array这种形式
4.不要使用全局函数。
5.Switch语句必须带有default分支
6.函数不应该有时候有返回值,有时候没有返回值。
7.For循环必须使用大括号
8.If语句必须使用大括号
9.for—in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。
- 介绍—下标准的css盒模型,低版本ie盒模型有什么不同
(1)盒模型有两种, IE 盒子模型、W3C 盒子模型;
(2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border);
(3)区 别: IE的width部分把 border 和 padding计算了进去;
- 说出三种减少页面加载的方法(加载时间指感知的时间或实际加载的时间)
CSS Sprites;
JS、CSS源码压缩、图片大小控制合适;
网页Gzip;
CDN托管;
data缓存 ;
图片服务器;
- 用js代码简单的介绍下自己
<script> function Person(name,jingli,jineng) { this.name=name; this.jingli=jingli; this.jineng=jineng; } Person.prototype.show=function(){ console.log("我是"+this.name+";我有如下经历:"+this.jingli+";我会如下技能:"+this.jineng); } var myself=new Person("小田","小田工作室创办人,凤翔网络推广顾问","熟悉前端基本技能,熟悉网络营销思想有实战经验,掌握项目经理技能,可以编写文档,也可以使用axure进行原型设计,掌握自动化测试和性能测试技能") myself.show(); </script> |
- Html5中datalist是什么
<datalist> 标签定义选项列表,与 input 元素配合使用该元素,来定义 input 可能的值。
datalist 及其选项不会被显示出来,它仅仅是合法的输入值列表。
关于前端大厂面试经验分享 |