日期: 2021 年 6 月 1 日

常见JavaScript基础面试题上(附答案)

JavaScript一直都是前端面试的重头戏,也是*核心的部分。JavaScript也是囊括知识点*多的部分,从BOM到DOM,从 ECMAScript编程到简单算法的实现等,都是 JavaScript部分面试题主要考察的内容。
当然,这里的重中之重当属事件和DOM操作,这也是 JavaScript的核心部分。在 ECMAScript中,小到运算符,大到函数的闭包、作用域,以及原型链等都是应试者必须掌握的技术知识。
今天我们为大家准备了一些常见的JavaScript基础面试题,一共有200多道题,因为内容比较多,我们拆分为上下两篇,今天这篇里一共有100道面试题。

1、JavaScript有哪些垃圾回收机制?

有以下垃圾回收机制。

标记清除( mark and sweep)

这是 JavaScript*常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境”。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。

垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。

引用计数( reference counting)

在低版本的E中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。

当声明了一个变量并将个引用类型赋值给该变量的时候,这个值的引用次数就加1.如果该变量的值变成了另外一个,则这个值的引用次数减1.当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问。

因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值占用的空间在正中虽然 JavaScript对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。

也就是说,只要涉及BOM和DOM,就会出现循环引用问题

2、列举几种类型的DOM节点

有以下几类DOM节点。

整个文档是一个文档( Document)节点。

每个HTML标签是一个元素( Element)节点。

每一个HTML属性是一个属性( Attribute)节点。

包含在HTML元素中的文本是文本(Text)节点。

3、谈谈 script标签中 defer和 async属性的区别。

区别如下。

(1) defer属性规定是否延迟执行脚本,直到页面加载为止, async属性规定脚本一旦可用,就异步执行。

(2) defer并行加载 JavaScript文件,会按照页面上 script标签的顺序执行, async并行加载 JavaScript文件,下载完成立即执行,不会按照页面上 script标签的顺序执行。

4、说说你对闭包的理解。

使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性

(1)函数嵌套函数。

(2)在函数内部可以引用外部的参数和变量

(3)参数和变量不会以垃圾回收机制回收

5、解释一下 unshift0方法。

该方法在数组启动时起作用,与 push()不同。它将参数成员添加到数组的顶部下面给出一段示例代。

var name=["john"] name. unshift("charlie");name.unshift("joseph""Jane"); console. log(name);

输出如下所示。

[" joseph ", Jane "," charlie "," john "]

6、encodeR0和 decodeR0的作用是什么?

encodeURI()用于将URL转换为十六进制编码。而 decodeURI()用于将编码的URL转换回正常URL。

7、为什么不建议在 JavaScript中使用 innerHTML?

通过 innerHTML修改内容,每次都会刷新,因此很慢。在 innerHTML中没有验证的机会,因此更容易在文档中插入错误代码,使网页不稳定。

8、如何在不支持 JavaScript的旧浏览器中隐藏 JavaScript代码?

在< script>标签之后的代码中添加“<!–”,不带引号。

在< /script>标签之前添加“//–>”,代码中没有引号。

旧浏览器现在将 JavaScript代码视为一个长的HTML注释,而支持 JavaScript的浏览器则将”<!-“和”//–>”作为一行注释。

9、在DOM操作中怎样创建、添加、移除、替换、插入和查找节点?

具体方法如下。

(1)通过以下代码创建新节点。

createDocument Fragment ()//创建一个D0M片段createElement ()//创建一个具体的元素createTextNode ()//创建一个文本节点

(2)通过以下代码添加、移除、替换、插入节点

appendchild()removechild()eplacechild ()insertBefore ()//并没有 insertAfter()(3)通过以下代码查找节点。getElementsByTagName ()//通过标签名称查找节点getElementsByName ()//通过元素的name属性的值查找节点(IE容错能力较强,会得到一个数//组,其中包括id等于name值的节点)getElementById(//通过元素Id查找节点,具有唯一性

10、如何实现浏览器内多个标签页之间的通信?

调用 localstorge、 cookie等数据存储通信方式

11、null和 undefined的区别是什么?

null是一个表示“无”的对象,转为数值时为0;undefined是一个表示“无”的原始值,转为数值时为NaN。

当声明的变量还未初始化时,变量的默认值为 undefined 。

null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

undefined表示“缺少值”,即此处应该有一个值,但是还没有定义,典型用法是如下。

(1)如果变量声明了,但没有赋值,它就等于 undefined

(2)当调用函数时,如果没有提供应该提供的参数,该参数就等于 undefined。

(3)如果对象没有赋值,该属性的值为 undefined。

(4)当函数没有返回值时,默认返回 undefined。

null表示“没有对象”,即此处不应该有值,典型用法是如下。

(1)作为函数的参数,表示该函数的参数不是对象。

(2)作为对象原型链的终点。

12、new操作符的作用是什么?

作用如下:

(1)创建一个空对象。

(2)由this变量引用该对象

(3)该对象继承该函数的原型(更改原型链的指向)

(4)把属性和方法加入到this引用的对象中。

(5)新创建的对象由this引用,*后隐式地返回this,过程如下:

var obj ={};obj._ _ proto_ _ Base .prototype; Base .call(obj);

13、JavaScript延迟加载的方式有哪些?

包括 defer和 async、动态创建DOM(创建 script,插入DOM中,加载完毕后回调、按需异步载入 JavaScript。

14、call()和apply()的区别和作用是什么?

作用都是在函数执行的时候,动态改变函数的运行环境(执行上下文)。

call和 apply的*个参数都是改变运行环境的对象。

区别如下。

call从第二个参数开始,每一个参数会依次传递给调用函数;apply的第二个参数是数组,数组的每一个成员会依次传递给调用函数。

func, call(funcl, varl, var2, var3)

对应的 apply写法为:

func. apply (funcl, [varl, var2, var3])

15、哪些操作会造成内存泄漏?

内存泄漏指不再拥有或需要任何对象(数据)之后,它们仍然存在于内存中。

提示:垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象占用的内存立即被回收。

如果 setTimeout的*个参数使用字符串而非函数,会引发内存泄漏闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)等会造内存泄漏。

16、列举E与 firefox的不同之处。

不同之处如下

(1)IE支持 currentStyle;Firefox使用 get ComputStyle。

(2)IE使用 inner Text;Firefox使用 textContent。

(3)在透明度滤镜方面,正使用 filter:alpha( opacity=num);Firefox使用-moz- opacity :num

(4)在事件方面,IE使用 attachEvent:Firefox使用 add Event Listener

(5)对于鼠标位置:IE使用 event. clientX;Firefox使用 event. pageX。

(6)IE使用 event. srcElement;Firefox使用 event. target

(7)要消除list的原点,IE中仅须使 margin:0即可达到*终效果;Firefox中需要设置margin:0、 padding:0和 list-style:none

(8)CSS圆角:IE7以下不支持圆角。

17、讲解一下 JavaScript对象的几种创建方式。

有以下创建方式:

(1) Object构造函数式。

(2)对象字面量式。

(3)工厂模式。

(4)安全工厂模式。

(5)构造函数模式。

(6)原型模式。

(7)混合构造函数和原型模式。

(8)动态原型模式。

(9)寄生构造函数模式。

(10)稳妥构造函数模式。

18、如何实现异步编程?

具体方法如下:

方法1,通过回调函数。优点是简单、容易理解和部署;缺点是不利于代码的阅读和维护,各个部分之间高度耦合( Coupling),流程混乱,而且每个任务只能指定一个回调函数。

方法2,通过事件监听,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”( Decoupling),有利于实现模块化;缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

方法3,采用发布/订阅方式。性质与“事件监听”类似,但是明显优于后者。

方法4,通过 Promise对象实现, Promise对象是 Commonjs工作组提出的一种规范,旨在为异步编程提供统一接口。它的思想是,每一个异步任务返回一个 Promise对象,该对象有一个then方法,允许指定回调函数。

19、请解释一下 JavaScript的同源策略。

同源策略是客户端脚本(尤其是 JavaScript)的重要安全度量标准。它*早出自Netscape Navigator2.0,目的是防止某个文档或脚本从多个不同源装载。

这里的同源策略指的是协议、域名、端口相同。同源策略是一种安全协议。指一段脚本只能读取来自同一来源的窗口和文档的属性。

20、为什么要有同源限制?

我们举例说明。比如一个黑客,他利用 Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名、密码登录时,他的页面就可以通过 Javascript读取到你表单上 Input中的内容,这样黑客就会轻松得到你的用户名和密码。

21、在 JavaScript中,为什么说函数是*类对象?

*类函数即 JavaScript中的函数。这通常意味着这些函数可以作为参数传递给其他函数,作为其他函数的值返回,分配给变量,也可以存储在数据结构中。

22、什么是事件?E与 Firefox的事件机制有什么区别?如何阻止冒泡?

事件是在网页中的某个操作(有的操作对应多个事件)例如,当单击一个按钮时,就会产生一个事件,它可以被 JavaScript侦测到,在事件处理机制上,正E支持事件冒泡;Firefox同时支持两种事件模型,也就是捕获型事件和冒泡型事件。

阻止方法是 ev.stop Propagation.注意旧版E中的方法 ev. cancelBubble=true.

23、函数声明与函数表达式的区别?

在 JavaScript中,在向执行环境中加载数据时,解析器对函数声明和函数表达式并非是一视同仁的。解析器会首先读取函数声明,并使它在执行任何代码之前可用(可以访问)。至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正解析和执行它。

24、如何删除一个 cookie?

为了删除 cookie,要修改 expires,代码如下。

document. cookie =’user=icketang;expires =’+ new Date(0)

25、编写一个方法,求一个字符串的长度(单位是字节)

假设一个英文字符占用一字节,一个中文字符占用两字节:

function GetBytes(str){ var len=str .length; var bytes= len forvar i-0:i<len1++){if (str. charcodeAt (i)>255) bytes++;}return bytes;}alert( GetBytes("hello 有课前端网!"));

26、对于元素, attribute和 property的区别是什么?

attribute是DOM元素在文档中作为HTML标签拥有的属性;property就是DOM元素在 JavaScript中作为对象拥有的属性。

对于HTML的标准属性来说, attribute和 property是同步的,会自动更新,但是对于自定义的属性来说,它们是不同步的。

27、解释延迟脚本在 JavaScript中的作用。

默认情况下,在页面加载期间,HTML代码的解析将暂停,直到脚本停止执行。

这意味着,如果服务器速度较慢或者脚本特别“沉重”,则会导致网页延迟。在使用Deferred时,脚本会延迟执行,直到HTML解析器运行。这缩短了网页的加载时间,并且它们的显示速度更快。

28、什么是闭包( closure)?

为了说明闭包,创建一个闭包。

function hello(){//函数执行完毕,变量仍然存在var num= 100;var showResult= function(){ alert (num);} num++;return showResult ;}var showResult= he1lo();showResult()//执行结果:弹出101

执行 hello()后, hello()闭包内部的变量会存在,而闭包内部函数的内部变量不会存在,使得 JavaScript的垃圾回收机制不会收回hello()占用的资源,因为hell()中内部函数的执行需要依赖 hello()中的变量。

29、如何判断一个对象是否属于某个类?

使用 instanceof关键字,判断一个对象是否是类的实例化对象;使用 constructor属性,判断一个对象是否是类的构造函数。

30、JavaScript中如何使用事件处理程序?

事件是由用户与页面的交互(例如单击链接或填写表单)导致的操作。需要个事件处理程序来保证所有事件的正确执行。事件处理程序是对象的额外属性。此属性包括事件的名称和事件发生时采取的操作。

31、在 JavaScript中有一个函数,执行直接对象查找时,它始终不会查找原型,这个函数是什么?

hasOwnProperty。

32、在 JavaScript中如何使用DOM?

DOM代表文档对象模型,并且负责文档中各种对象的相互交互。DOM是开发网页所必需的,其中包括诸如段落、链接等对象。可以操作这些对象,如添加或删除等。为此,DOM还需要向网页添加额外的功能。

33、documen.wrte和 innerHTML的区别是什么?

document.wite重绘整个页面;innerHTML可以重绘页面的一部分。

34、在 JavaScript中读取文件的方法是什么?

可以通过如下方式读取服务器中的文件内容。

function readAjaxEile(url) {//创建xhr var xhr =new XMLHttpRequest();/监听状态xhr. onreadystatechange=function(){//监听状态值是4if(xhr. readystate == 4 && xhr. status = = =200){console. log(xhr. responseText)}//打开请求xhr.open('GET', url, true)//发送数据xhr, send(null)}

可以通过如下方式读取本地计算机中的内容。

function readInputFile(id) { var file= document. getElementById(id). files[0];//实例化 FileReader var reader=new FileReader();//读取文件reader. readAsText (file)//监听返回reader, onload= function (data) { console. log (data, this .result)}}

35、如何分配对象属性?

将属性分配给对象的方式与赋值给变量的方式相同。例如,表单对象的操作值以下列方式分配给” submit”:document.form. action=” submit'”

36、请说几条书写 JavaScript语句的基本规范。

基本规范如下:

(1)不要在同一行声明多个变量。

(2)应使用==/!==来比较true/ false或者数值。

(3)使用对象字面量替代 new Array这种形式。

(4)不要使用全局函数。

(5) switch语句必须带有 default分支。

(6)函数不应该有时有返回值,有时没有返回值。

(7)for循环必须使用大括号括起来。

(8)if语句必须使用大括号括起来。

9)for-in循环中的变量应该使用war关键字明确限定的作用域,从而避免作用域污染。

37、eva的功能是什么?

它的功能是把对应的字符串解析成 Javascript代码并运行应该避免使用eval,它会造成程序不安全,非常影响性能(执行两次,一次解析成JavaScript语句,一次执行)

38、[“1,”2,”3”].map( parselnt)的执行结果是多少?

[1,NaN,NaN],因为 parseInt需要两个参数(val, radix),其中 radix表示解析时用的基数(进制);map传递了3个参数(item, index,aray),对应的radix不合法导致解析失败。

39、谈谈你对this对象的理解。

this是 JavaScript的一个关键字,随着函数使用场合的不同,this的值会发生变化。但是有一个总原则,即this指的是调用函数的那个对象一般情况下,this是全局对象 Global,可以作为方法调用

40、Web- garden和web-farm有什么不同?

web-garden和 web-farm都是网络托管系统。唯一的区别是 web-garden是在单个服务器中包含许多处理器的设置,而web-farm是使用多个服务器的较大设置。

41、说一下 document. write0的用法。

document. write()方法可以用在两个地方,页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容document. write只能重绘整个页面, innerHTML可以重绘页面的一部分。

42、在 JavaScript中什么是类(伪)数组?如何将类(伪)数组转化为标准数组?

典型的类(伪)数组是函数的 argument参数,在调用 getElements By TagName和 document .childNodes方法时,它们返回的 NodeList对象都属于伪数组。可以使用Array .prototype. slice. call( fake Array)将数组转化为真正的Aray对象。

43、JavaScript中callee和 caller的作用是什么?

caller返回一个关于函数的引用,该函数调用了当前函数;callee返回正在执行的函数,也就是指定的 function对象的正文。

44、讲一下手写数组快速排序的步骤。

“快速排序”的思想很简单,整个排序过程只需要3步

(1)在数据集之中,选择一个元素作为“基准”( pivot)。

(2)将所有小于“基准”的元素,都移到“基准”的左边;将所有大于“基准”的元素,都移到“基准”的右边。

(3)对“基准”左边和右边的两个子集,不断重复第(1)步和第(2)步,直到所有子集只剩下一个元素为止。

45、如何统计字符串“ aaaabbbccccddfgh”中字母的个数或统计*多的字母数?

具体代码如下

var str =aaaabbbecccddfgh"; function dealstr(str){ var obj={};for (var i= 0;i< str length:i++){var v=str.charAt (i);if (obj[v] && obj [v].value === v){++obj[v]. count } else { obj[v] ={count:1, va⊥ue:v}}} return obj ;}var obj= dealstr(str);for (key in obj){ console. log (obj[key] .value +'=' obj[ key].count)}

46、写一个 function,清除字符串前后的空格(兼容所有浏览器)。

具体代码如下

function trim(str){if (str && typeof str === "string"){ return str.replace(/^\s+1\s+$/g,"");//去除前后空白符。

47、列出不同浏览器中关于 JavaScript兼容性的两个常见问题。

(1)事件绑定兼容性问题。

IE8以下的浏览器不支持用 add Event Listener来绑定事件,使用 attachement可以解决这个问题

(2) stopPropagation兼容性问题

IE8以下的浏览器不支持用 e .stopPropagation()来阻止事件传播,使用 e .return Value =false可以解决这个问题。

48、闭包的优缺点是什么?

优点是不产生全局变量,实现属性私有化缺点是闭包中的数据会常驻内存,在不用的时候需要删除,否则会导致内存溢出(内存泄漏)。

49、用 JavaScript实现一个数组合并的方法(要求去重)。

代码如下。

var arrl =['a']; var arr2 =['b', 'c'];var arr3=['c', ['d'], 'e', undefined, null];var concat =( function() {//去重合并arr1和arr2var _concat =function (arrl, arr2)for (var i =0, len= arr2.length;i< len;i++){~ arrl. indexOf (arr2[i])|| arrl. push(arr2[i])}}//返回数组去重合并方法return function(){ var result =[];for (var i=0, len= arguments .length;i< len:i++){ _concat (result, arguments [i])return result}})()

执行concat(arrl,ar2,ar3)后,会返回[‘a’,null, undefined,’e’,[‘d],’c’,’b’]。

50、说明正则表达式给所有string对象添加去除首尾空白符的方法(trim方法)。

代码如下。

prototype. trim= function(){return this .replace(/^\s+I\s+$/g," );};

51、说明用 JavaScript实现一个提取电话号码的方法。

代码如下

var str="12345678901 021-12345678 有课前端网 0418-1234567  13112345678"; var reg=/(1\d{0})|(0\d{2,3}\-\d{7,8})/g;alert(str.match(reg);

测试“12345678901 021-12345678有课前端网0418-1234567 13112345678”,得到的结果应该是:[12345678901,021-12345678,0418-1234567,13112345678]

52、JavaScript中常用的逻辑运算符有哪些?

“and”(&&)运算符、“or”(‖)运算符和”not”(!)运算符,它们可以在 JavaScript中使用。

53、什么是事件代理(事件委托)?

事件代理( Event Delegation),又称为事件委托,是 JavaScript中绑定事件的常用技巧。顾名思义,“事件代理”就是把原本需要绑定的事件委托给父元素,让父元素负責事件监听。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能。

54、什么是 JavaScript?

JavaScript是客户端和服务器端的脚本语言,可以插入HTML页面中,并且是目前较热门的Web开发语言,同时, JavaScript也是面向对象的编程语言。

55、列举Java和 JavaScript的不同之处。

Java是一门十分完整、成熟的编程语言。相比之下, JavaScript是一个可以被引入HTML页面的编程语言。这两种语言并不完全相互依赖,而是针对不同的意图而设计的。Java是一种面向对象编程(OOP)或结构化编程语言,类似的语言有C++;而 JavaScript是客户端脚本语言,它称为非结构化编程。

56、JavaScript和ASP脚本相比,哪个更快?

JavaScript更快。JavaScript是一种客户端语言,因此它不需要Web服务器的协助就可以执行;ASP是服务器端语言,因此它总是比 JavaScript慢,值得注意的是, JavaScript现在也可用于服务器端语言( Node. js)

57、什么是负无穷大?

Infinity代表了超出 JavaScript处理范围的数值。也就是说, JavaScript无法处理的数值都是 Infinity.实践证明, JavaScript所能处理的*大值( Number. MAX VALUE)是17976931348623157e+308,超过该数则为正无穷大;而*小值( Number. MIN VALUE)

是5e-324,小于该数则为0.所以负无穷大代表的是小于- Number MAX VALUE的数字, JavaScript中对应静态变量 Number NEGATIVE INFINITY

58、如何将 JavaScript代码分解成几行?

M:在字符串语句中可以通过在*行末尾使用反斜杠“\”来完成,例如, document. write(”This is \a program”)。

如果不是在字符串语句中更改为新行,那么 JavaScript会忽略行中的断点下面的代码是完美的,但并不建议这样做,因为阻碍了调试。

var x=l, y=2,z=X+y;

59、什么是未声明和未定义的变量?

未声明的变量是程序中不存在且未声明的变量。如果程序尝试读取未声明变量的值,则会在运行时遇到错误。未定义的变量是在程序中声明但尚未给出任何值的变量如果程序尝试读取未定义变量的值,则返回未定义的值60.:如何编写可动态添加新元素的代码?

下面给出一段示例代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><tit1e>有课前端网—专业前端技术学习网</tit1e></head><body><p id="ickt">ickt</p><script type="text/javascript">function addNode (){ var p= document. createElement('p');var textNode document, createTextNode('有课前端网')p .appendchild(textNode);document. getElementById('ickt') .appendChild(p)}addNode ()</script></body></html>

61、什么是全局变量?这些变量如何声明?使用全局变量有哪些问题?

全局变量是整个代码中都可用的变量,也就是说,这些变量没有任何作用域var关键字用于声明局部变量,如果省略var关键字,则声明一个全局变量使用全局变量面临的问题是局部变量和全局变量名称的冲突。此外,很难调试和测试依赖于全局变量的代码。

62、解释 JavaScript中定时器的工作,并说明使用定时器的缺点。

定时器用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码这通过使用函数 setTimeout、setInterval和 clearInterva来完成。

setTimeout( function, delay)函数用于启动在所属延迟之后调用特定功能的定时器。

setInterval( function,dlay)函数用于在提到的延迟中重复执行给定的功能,只有在取消时才停止。

clearInterval(id)函数指示定时器停止定时器在一个线程内运行,因此事件可能需要排队等待执行。

63、ViewState和 SessionState有什么区别?

View State特定于会话中的页面;SessionState特定于可在Web应用程序中的所有页面上访问的用户特定数据。

64、什么是===运算符?

===称为严格等式运算符,当两个操作数具有相同的值和类型时,该运算符返回true。

65、说明如何使用 JavaScript提交表单。

要使用 JavaScript提交表单,可以使用以下代码。

document .form [0] .submit();

66、元素的样式/类如何改变?

可以通过以下方式改变元素的样式。

document. getElementById("myText").style. fontsize ="20";

可以通过以下方式改变元素的类。

document. getElementById("myText ").className ="anyclass";

67、JavaScript中的循环结构都有哪些?

for、 while、do.… while、 for in、 for of(ES6新增的)

68、如何在 JavaScript中将base字符串转换为 integer?

parselnt()函数解析一个字符串参数,并返回一个指定基数的整数。parselnt()将要转换的字符串作为其*个参数,第二个参数是给定字符串的转换进制基数。

为了将4F(基数16)转换为整数,可以使用代码 parrent(”4F”,16)。

69、说明“==”和“===”的区别。

“==”仅检查值相等性,而“===”用于更严格的等式判定。如果两个变量的值或类型不同,则后者返回 false。

70、3+2+“7”的结果是什么?

由于3和2是整数,它们将直接相加,同时由于“7”是一个字符串,将会被直连接,因此结果将是57。

71、如何检测客户端机器上的操作系统?

为了检测客户端机器上的操作系统,应使用 navigator.app Version字符串(属性)。

72、JavaScript中的null表示什么?

null用于表示无值或无对象。它意味着没有对象或空字符串,没有有效的布尔没有数值和数组对象

73、delete操作符的功能是什么?

delete操作符用于删除对象中的某个属性,但不能删除变量、函数等。

74、JavaScript中有哪些类型的弹出框?

ua;alert、 confirm和 prompt。

75、void(0)的作用是什么?

void操作符使表达式的运算结果返回 undefined。

void(0)用于防止页面刷新,并在调用时传递参数“0”。

void(0)用于调用另一种方法而不刷新页面。

76、如何强制页面加载 JavaScript中的其他页面?

必须插入以下代码才能达到预期效果。

<script language="JavaScript"  type="text/javascript"><!--location.href="http://newhost/newpath/newfile.html";//--></script>

77、转义字符是用来做什么的?

当使用特殊字符(如单引号、双引号、撇号和&符号)时,将使用转义字符(反斜杠)。在字符前放置反斜杠,使其显示。

下面给出两个示例。

document. write"I m a "good"boy "document. write"I m a\"good\"boy"

78、什么是 JavaScript cookie?

cookie是存储在访问者计算机中的变量。每当一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。可以使用 JavaScript来创建和获取 cookie的值。

79、解释 JavaScript中的pop()方法。

pop()方法与shift()方法类似,但不同之处在于shift()方法在数组的开头工作。此外,pop()方法将*后一个元素从给定的数组中取出并返回,然后改变被调用的数组例如:

var colors = ["red","blue","green"]; colors. pop ();// colors :["red","blue"]
80、在 JavaScript中使用 innerHTML的缺点是什么?
缺点如下:
(1)内容随处可见
(2)不能像“追加到 innerHTML”一样使用。
(3)即使使用+=,如” innerHTML= innerhTML+’htm'”,旧的内容仍然会被HTML替换。

(4)整个 innerHTML内容被重新解析并构建成元素,因此它的速度要慢得多。

(5) innerHTML不提供验证,因此可能会在文档中插入具有破坏性的HTML并将其中断。

81、break和 continue语句的作用是什么?

break语句从当前循环中退出;continue语句继续下一个循环语句。

82、在 JavaScript中, datatypes的两个基本组是什么?

两个基本组是原始类型和引用类型。

原始类型包括数字和布尔类型。引用类型包括更复杂的类型,如字符串和日期。

83、如何创建通用对象?

通用对象可以通过以下代码创建。

var o= new Object ()。

84、typeof是用来做什么的?

typeof是一个运算符,用于返回变量类型的字符串描述。

85、哪些关键字用于处理异常?

try...catch...finally用于处理 JavaScript中的异常。try{执行代码}catch(exp){ 抛出错误提示信息}finally {无论try/catch的结果如何都会执行。}

86、JavaScript中不同类型的错误有几种?

有3种类型的错误。

Load time errors,该错误发生于加载网页时,例如出现语法错误等状况,称为加载时间错误,并且会动态生成错误。

Run time errors,由于在HTML语言中滥用命令而导致的错误。

Logical errors,这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。

87、在 JavaScript中,push方法的作用是什么?

push方法用于将一个或多个元素添加或附加到数组的末尾。使用这种方法,可通过传递多个参数来附加多个元素。

88、在 JavaScript中, unshift方法的作用是什么?

unshift方法就像在数组开头工作的push方法。该方法用于将一个或多个元素添加到数组的开头。

89、如何为对象添加属性?

为对象添加属性有两种常用语法。

中括号语法,比如obj[” class”]=12。

点语法,比如 obj. class=12。

90、获得 CheckBox状态的方式是什么?

alert( document getElement Byld(’checkbox1’) .checked;

如果 CheckBox选中,此警告将返回TRUE。

91、解释一下 window. onload和 onDocumentReady。

在载入页面的所有信息之前,不运行 window. onload。这导致在执行任何代码之前会出现延迟。

window.onDocumentReady在加载DOM之后加载代码。这允许代码更早地执行(早于 window. onload)。

92、如何理解 JavaScript中的闭包?

闭包就是能够读取其他函数内部变量的函数。

闭包的用途有两个,一是可以读取函数内部的变量,二是让这些变量的值始终保持在内存中。

93、如何把一个值附加到数组中?

可以在数组末尾处添加成员arr[ arr length]= value;或者调用push方法 arr.push(value)。

94、解释一下for-in循环。

for-in循环用于循环对象的属性。

for-in循环的语法如下。

for (var iable name in object){}

在每次循环中,来自对象的一个属性与变量名相关联,循环继续,直到对象的所有属性都被遍历。

95、描述一下 JavaScript中的匿名函数。

被声明为没有任何命名标识符的函数称为匿名函数。一般来说,匿名函数在声明后无法访问。

匿名函数声明示例如下。

var anon=function(){alert('I am anonymous' );anon();

96、和DOM事件流的区别是什么?

区别如下。

(1)执行顺序不一样

(2)参数不一样。

(3)事件名称是否加on不一样。

(4)this指向问题不一样。

97、阐述一下事件冒泡。

Java Script允许DOM元素嵌套在一起。在这种情况下,如果单击子级的处理程序,父级的处理程序也将执行同样的工作。

98、JavaScript里函数参数 arguments是数组吗?

在函数代码中,使用特殊对象 arguments,开发者无须明确指出参数名,使用下标就可以访问相应的参数。

arguments虽然有数组的性质,但其并非真正的数组。它只是一个类数组对象,并没有数组的方法,不能像真正的数组那样调用 .join()、, .concat()、.pop()等方法。

99、什么是构造函数?它与普通函数有什么区别?

构造函数是一种特殊的方法,主要用来创建对象时初始化对象,经常与new运算符一起使用,创建对象的语句中构造函数的名称必须与类名完全相同。

与普通函数相比,区别如下

(1)构造函数只能由new关键字调用

(2)构造函数可以创建实例化对象

(3)构造函数是类的标志。

100、请解释一下 JavaScript和CSS阻塞。

JavaScript的阻塞特性是所有浏览器在下载 JavaScript代码的时候,会阻止其他一切活动,比如其他资源的下载,内容的呈现等,直到 JavaScript代码下载、解析、执行完毕后才开始继续并行下载其他资源并渲染内容。

为了提高用户体验,新一代浏览器都支持并行下载 JavaScript代码,但是 JavaScript代码的下载仍然会阻塞其他资源的下载(例如图片、CSS文件等)。

为了防止 JavaScript修改DOM树,浏览器需要重新构建DOM树,所以就会阻塞其他资源的下载和渲染。

嵌入的 JavaScript代码会阻塞所有内容的呈现,而外部 JavaScript代码只会阻塞其后内容的显示,两种方式都会阻塞其后资源的下载。也就是说,外部脚本不会阻塞外部脚本的加载,但会阻塞外部脚本的执行。

CSS本来是可以并行加载的,但是当CSS后面跟着嵌入的 JavaScript代码的时候,该CSS就会阻塞后面资源的下载。

而当把嵌入的 JavaScript代码放到CSS前面时,就不会出现阻塞的情况了(在IE6下CSS都会阻塞加载)。

根本原因是因为浏览器会维持HTML中CSS和 JavaScript代码的顺序,样式表必须在嵌入的 JavaScript代码执行前先加载、解析完。而嵌入的 JavaScript代码会阻塞后面的资源加载,所以就会出现CSS阻塞资源加载的情况。

本文完~

CSS面试题(附答案)

 

CSS部分的面试题主要考察应试者对CSS基础概念模型的理解,例如文档流、盒模型、浮动、定位、选择器权重、样式继承等。很多应试者认为CSS很简单,没多少内容,面试就是面试 JavaScript部分的内容,这些观点是错误的,面试的*关往往会考察应试者对CSS的掌握情况。因此,CSS也常常是应试者掉入的*个陷阱。

1、CSS有哪些基本选择器?它们的权重是如何表示的?

CSS基本选择器有类选择器、属性选择器和ID选择器。

CSS选择器的权重预示着CSS选择器样式渲染的先后顺序,元素样式渲染时,权重高的选择器样式会覆盖权重低的选择器样式。

通常将权重分为4个等级,可用0.0.0.0来表示这4个等级。

!important关键字优先级*高。

注意:!importont井非选择器,而是针对选择器内的单一样式设置的。当然,不同选择器内应用 !important的权重也是不一样的,例如,在id选择器内的!important关键字权重要高于类选择器内的 !important关键字权重,即下面所说的选择器权重组合。

内联样式(非元素器)的优先级可看成1.0.0.0。

ID选择器的优先级为0.1.0.0。

类属性选择器、属性选择器、伪类的优先级为0.0.1.0。

元素选择器、伪元素选择器的优先级为0.0.0.1。

通配符选择器对特殊性没有任何贡献值。

当把选择器组合使用的时候,相应的层级权重也会递增,例如# id .class的权重为0.1.1.0。

2、CSS的引入方式有哪些?ink和@ import的区别是什么?

CSS有3种引入方式。

  • 行内式是指将样式写在元素的 style属性内。
  • 内嵌式是指将样式写在 style元素内。
  • 外链式是指通过link标签,引入CSS文件内的样式。

通过link标签引入样式与通过@ import方法引入样式有如下区别。

(1)加载资源的限制。

link是 XHTML的标签,除了加载CSS文件外,还可以加载RSS等其他事务,如加载模板等。

@ import只能加载CSS文件。

(2)加载方式。

如果用link引用CSS,在页面载入时同时加载,即同步加载。

如果用@ import引用CSS,则需要等到网页完全载入后,再加载CSS文件,即异步加载。

(3)兼容性。

link是 XHTML的标签,没有兼容问题。

@ import是在CSS2.1中提出的,不支持低版本的浏览器。

(4)改变样式

link的标签是DOM元素,支持使用 JavaScript控制DOM和修改样式;@ import是种方法,不支持控制DOM和修改样式。

3、浮动元素引起的问题和解决方法是什么?

引起的问题有如下几个。

(1)父元素的高度无法被撑开,影响与父元素同级的元素。

(2)与元素同级的非浮动元素会紧随其后(类似遮盖现象)。

(3)如果一个元素浮动,则该元素之前的元素也需要浮动;否则,会影响页面显示的结构(即通常所说的串行现象)。

解决方法如下:

(1)为父元素设置固定高度。

(2)为父元素设置 overflow:hidden即可清除浮动,让父元素的高度被撑开。

(3)用 clear:both样式属性清除元素浮动。

注意:如果只有左浮动或只有右浮动,可以单独设置 clear:left或 clear:right,但是设置clear:both则都可以解决,所以此方法在工作中用得更多。

(4)外墙法是指在父元素外面,添加“一道墙”,设置属性 clear:both

(5)内墙法是指在父元素内部,浮动元素的*后面,添加“一道墙”,设置属性 clear:both

(6)伪元素是指为了少创建元素,对父元素添加afer伪元素,设置属性 content:””;display :block;clear:both。

注意:这里所说的少创建元素,实际上并没有少创建,添加的伪元素也是元素,只不过没有写在HTML文档中而已。

(7)使用通用类 clearfix, clearfix的实现如下:

clearfix:after {  content " ";display:block;clear:both;}
注意:推荐以上这种方式,因为 clearfix已经应用在各大CSS框架(如 Bootstrap等)中,并成为行业的默认规范。
4、position的值分别是相对于哪个位置定位的?
relative表示相对定位,相对于自己本身所在正常文档流中的位置进行定位。absolute表示*对定位,相对于*近一级(从直接父级元素往上数,直到根元素)定位,相对于 statIc的父元素进行定位。
fixed用于生成*对定位,相对于浏览器窗口或 frame进行定位。
statIc是默认值,没有定位,元素出现在正常的文档流中。
sticky是生成黏性定位的元素,容器的位置根据正常文档流计算得出。
注意:CSS3的新增属性有点类似于 relative与 fixed的结合体。如果目标区域在屏幕中可见,表现为 relative;如果目标区域在屏幕中不可见,表现为fixed。
5、请说明 position:absolute和float属性的异同。
共同点是对内联元素设置float和 absolute属性,可以让元素脱离文档流,并且可以设置其宽高。
不同点是float仍可占据位置,不会覆盖在另一个BFC区域上,浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止, absolute会覆盖文档流中的其他元素,即遮盖现象。
6、CSS选择器(符)有哪些?
(1)id选择器(#myld)。
(2)类选择器( .my ClassName)。
(3)标签选择器(div,p,h1)
(4)相邻选择器(h1+p)
(5)子选择器(ul>li)
(6)后代选择器(li  a)
(7)通配符选择器(*)
(8)属性选择器( button[disabled=”true”])。
(9)伪类选择器( a:hover、 li:nth- child)表示一种状态。
(10)伪元素选择器(li:before、“:after”、“:first- letter”、“:first-line”、“;selecton”)表示文档某个部分的表现。
注意:在CSS3规范中,为了区别伪元素和伪类,CSS3建议伪类用单冒号“:”,伪元素用双冒号”::”。
7、CSS的哪些样式可以继承?哪些不可以继承?
可继承的样式有font- size font-family color, UL LI DL DD DT。
不可继承的样式有 border、 padding, margin, width、 height。
注意:为了方便辨识,与字体相关的样式通常可以继承,与尺寸相关的样式通常不能继承。
8、CSS优先级如何排序?
优先级如下:
!important>style(内联)>ld(权重100)> class(权重10)>标签(权重1)。同类别的样式中,后面的会覆盖前面的。
9、HTML是什么?CSS是什么?JavaScript是什么?
(1)HTML( Hyper Text Markup Language,超文本标记语言)是做网站时使用的些文本标记标签,比如div、span等
(2)CSS( Cascading Style Sheet,层叠样式表)是做网站时为美化网站而为标签添加的样式,比如 background(背景)、 color(字体颜色) height(高度)、widh(宽度)等。
(3) JavaScript是网站中实现前后台交互效果、网页动画效果的一种开发语言,比如鼠标单击( click)事件、前后台数据请求(Ajax)等。
10、为什么要初始化CSS?
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没有初始化CSS,往往会导致页面在不同浏览器之间出现差异。
当然,初始化样式有时会对SEO产生一定的影响,但鱼和熊掌不可兼得,所以在力求影响*小的情况下初始化CSS。
*简单的初始化方法就是:*{ padding:0;margin:0;}
11、如何居中div?如何居中一个浮动元素?
确定容器的宽高,例如宽400px、高200px的div.设置层的外边距。
div{ float:leftwidth:400px;height:200px;margin:-100px 0 0-200px;/*注意,由于左上外边距优先级高于右下外边距优先级,因此,还可以简化设置 margin:-150px-250px;*/position:relative;left50%;top:50%;/*为方便看效果,添加一种背景色*/background-color:pink}
12、构成CSS的基本语句是什么?
构成CSS的基本语句如下。
选择器{属性名称1:属性值1;属性名称2:属性值2;}
例如
div{ margin-top:20px;border:2px solid #red;}
13、display有哪些值?说明它们的作用。
display的值有 block、none, inline、 inline- block、list-item、 table和 inherit。其作用如下。
block是指块类型。默认宽度为父元素宽度,可设置宽高,换行显示。   none是指元素不会显示,已脱离文档流。
inline是指行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
inline- block是指默认宽度为内容宽度,可以设置宽高,同行显示。
list-item是指像块类型元素一样显示,并添加样式列表标记。
注意:例如,用div模拟li元素<ul>< div style=” display:list-item:”>有课前端网</d></ul>。
table是指此元素会作为块级表格显示。
inherit是指从父元素继承 display属性的值。
14、简要描述块级元素和行内元素的区别。
块级元素的前后都会自动换行。默认情况下,块级元素会独占一行。例如<p><h1-h6><div>都是块级元素,当显示这些元素中间的文本时,都将从新行中开始显示,其后的内容也将在新行中显示。
行内元素可以和其他行内元素位于同一行,在浏览器中显示时不会换行。例如<a><span>等,对于行内元素,不能设置其高度和宽度。
还有一种元素是行内块级元素,比如<img>< input>元素等。这些元素可以和其他行内元素位于同一行,同时可以设置其高度和宽度。
15、如何用DIV+CSS实现3栏布局(左右固定200pX,中间自适应)?
具体代码如下:
html
<div class="container"><div class="main"><h2>有课前端网</h2></div><div class="left">左边内容</div>div class="right" >右边内容</div></dv>

CSS

.container div {height:200px;}.container{ padding:0 200px;}.main,.left,.right{position:relative;float:left;}.left.right{width:200px;}.main{ width:100%;background:yellow;}.left {background:blue:margin-left:-100%;left:-200px;}.right {background:green;margin-left:-200px;left:200px;}
16、解释浮动及其工作原理。
浮动的元素可以向左或向右移动,直到它的外边缘碰到包含元素(父元素)或另一个浮动元素的边框为止。要想使元素浮动,必须为元素设置一个宽度( width)。虽然浮动元素已不在文档流中,但是它浮动后所处的位置依然在浮动之前的水平方向上。
因为浮动元素不在文档流中,所以文档流中的块元素表现得就像浮动元素不存在一样,下面的元素会填补原来的位置。
有些元素会在浮动元素的下方,但是这些元素的内容并不一定会被浮动的元素遮盖。当定位内联元素时,要考虑浮动元素的边界,围绕浮动元素放置内联元素。也可以把浮动元素想象成被块元素忽略的元素,而内联元素会关注的元素。
17、解释一下 CSS Sprite,以及如何在页面或网站中使用它。
CSS Sprite其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“ background- image”“ background- repeat”“ background- position”的组合进行背景定位, background- position可以用数字精确地定位出背景图片的位置。
注意:在高级浏览器中,可以基于图片的bose64编码存储,将图片与其他类型的文件打包。
18、在书写高效CSS时有哪些问题需要考虑?
(1)样式,从右向左解析一个选择器
(2)类型选择器的速度,ID选择器*快, Universal(通配符*)*慢。对于常用的4种类型选择器,解析速度由快到慢依次是ID、 class, tag和 universal。
(3)不要用标签限制ID选择器(如:ul#main- navigation{},ID已经是唯一的,不需要Tag来限制,这样做会让选择器变慢)。
(4)后代选择器*糟糕(换句话说, html body ul li a{}这个选择器是很低效的)。
(5)想清楚你的需求,再去书写选择器。
(6)CSS3选择器(如nth- child)能够漂亮地定位我们想要的元素,又能保证CSS整洁易读。然而,这些神奇的选择器会浪费很多的浏览器资源。
(7)我们知道ID选择器的速度*快,但是如果都用ID选择器,会降低代码的可读性和可维护性等。在大型项目中,相对于使用ID选择器提升速度,代码的可读性和可维护性带来的收益更大。
19、说出几种解决IE6  Bug的方法。
解决方案如下:
(1)双边距问题,是使用fLoat引起的。
解决方法是使用 display:inline。
(2)3像素问题,是使用float引起的。
解决方法是使用 margin- right:-3px。
(3)超链接 hover伪类样式,单击后失效。
解决方法是使用以下正确的书写顺序:L→V→H→A(link, visited, hover., active)。
(4)z- index问题。
解决方法是给父级添加 position:relative
(5)PNG图片半透明问题。
解决方法是使用 JavaScript代码库,或使用IE滤镜
注意:在使用E滤镜解决PNG图片透明度的时候,在1E6中,会对事件产生影响。
20、页面重构怎样操作?
编写CSS,让页面结构更合理化,提升用户体验,达到良好的页面效果并提升性能
21、display:none和 visibility:hidden的区别是什么?
display:none隐藏对应的元素,在文档流中不再给它分配空间,它各边的元素会合拢,即脱离文档流。
visibility:hidden隐藏对应的元素,但是在文档流中仍保留原来的空间。
22、内联元素可以实现浮动吗?
在CSS中,任何元素都可以浮动。不论浮动元素本身是何种元素,都会生成个块级框。因此,对于内联元素,如果设置为浮动,会产生和块级框相同的效果。

23、简要描述CSS中 content属性的作用。

content属性与:before及:after伪元素配合使用,用来插入生成的内容,可以在元素之前或之后放置生成的内容。可以插入文本、图像、引号,并可以结合计数器,为页面元素插入编号。比如,查看如下代码。

body{counter-reset:chapter;} h1:before{ content:"第" counter( chapter)"章"}h1{counter-increment:chapter:}<h1></h1><h1></h1><h1></h1>

使用 content属性,并结合 :before选择器和计数器 counter,可以在每个<h1>元素前插入新的内容。

24、如何定义高度很小的容器?

因为有一个默认的行高,所以在IE6下无法定义小高度的容器。

两种解决方案分别是 overflow:hidden或font-size:容器高度px

25、如何在图片下方设置几像素的空白间隙?

定义img为 display:block,或定义父容器为font-size:0。

26、如何解决IE6双倍 margin的Bug?

使用 display:inline

27、如何让超出宽度的文字显示为省略号?

输入 overflow:hidden;width:xxx;white-space:nowrap;

text-overflow:ellipsis。

28、如何使英文单词发生词内断行?

输入word-wrap:break-word。

29、如何实现IE6下的 position:fxed?

具体代码如下:

html_{overflow:hidden;} body_{overflow:auto;height:100%:}.fixed{position:fixed;_position:absolute;left:0top:0padding:10pxbackground:#000}

30、如何让min- height兼容IE6?

具体代码如下。

.min-height{min-height:100px;_height:100px;background:red;}

31、已知高度的容器如何在页面中水平垂直居中?

具体代码如下。

<style type=text/css"># box {width:200px;height:200px;background:red;position:absolute;left:50%;top:50%;margin:-100px 0 0-100px;/*或者 marion:-100px*/}</style><div id="box“></div>

32、px和em的区别是什么?

px和em都是长度单位,两者的区别是:px的值是固定的,指定为多少就是多少,计算比较容易;em的值不是国定的,是相对于容器字体的大小,并且em会继承父级元素的字体大小。

浏览器的默认字体高都是16px,所以未经调整的浏览器都符合lem=16px,那么12px=0.75em,10px=0.625em。

与cm对应的另一个长度单位是rem,是指相对于根元素(通常是HTML元素)字体的大小。

33、什么叫优雅降级和渐进增强?两者有什么区别?

优雅降级 graceful degradation是指一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

渐进增强 progressive enhancement是指针对低版本浏览器构建页面,保证*基本的功能,然后再针对高级浏览器进行效果、交互等改进并追加功能,以达到更好的用户体验。

两者的区别如下。

(1)优雅降级从复杂的现状开始,并试图减少用户体验的供给。

(2)渐进增强则从一个非常基础并且能够起作用的版本开始,并不断扩充,以适应未来环境的需要。

(3)降级(功能衰减)意味着往回看,而渐进增强则意味着朝前看,同时保诬其根基处于安全地带。

34、网页制作会用到哪些图片格式?

用于网页制作的主流图像格式有JPG、PNG、GIF等。

JPG:压缩率高,文件小,*常用。

PNG:支持无损压缩,色彩损失小,保真度高,文件稍大。

GIF:支持动画显示,但只支持256色显示,目前已经被Fash大量取代。

35、CSS的 content属性有什么作用?有什么应用?

CSS的 content属性专门应用在 before/after伪元素上,用于插入生成的内容*常见的应用是利用伪类清除浮动。

36、对行内元素设置 margin-top和 margin- bottom是否起作用?

不起作用(需要注意行内元素的替换元素img、 Input,它们是行内元素,但是可以设置它们的宽度和高度,并且 margin属性也对它们起作用, margin-op和 margin- botton有着类似于 inline- block的行为)

37、div+css的布局较table布局有什么优点?

(1)改版的时候更方便,只须改动CSS文件。

(2)页面加载速度更快、结构清晰、页面简洁。

(3)表现与结构分离。

(4)搜索引擎优化(SEO)更友好,排名更靠前。

38、如果设置<p>的font-sze为10rem,那么当用户重置或拖曳浏览器窗口时,它的文本会不会受到影响?

不会

39、谈谈你对BFC规范的理解。

BFC( Block Formatting Context)指块级格式化上下文,即一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中,两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin会发生折叠。

BFC决定元素如何对其内容进行布局,也决定与其他元素的关系和相互作用。

40、谈谈你对C规范的理解。

IFC( Inline Formatting Context)指内联格式化上下文,IFC的线框( line box)高度由其包含行内元素中*高的实际高度计算而来(不受竖直方向的 padding/margin的影响)。IFC中的线框一般左右都贴紧整个IFC,但是会被foat元素扰乱。同一个IFC下的多个线框高度不同。

IFC中是不可能有块级元素的,当插入块级元素时(如在p中插入div),会产生两个匿名块,两者与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。

41、谈谈你对GFC规范的理解。

GFC( GridLayout Formatting Context)指网格布局格式化上下文,即当把一个的 display值设为grid的时候,此元素将会获得一个独立的渲染区域。可以通过在网格容器( grid container)上定义网格定义行( grid definition row)和网格定义列(grid definition column),在网格项目( grid item)上定义网格行( grid row)和网格列(grid column)来为每一个网格项目定义位置和空间。

42、谈谈你对FFC规范的理解。

FFC( Flex Formatting Context)指自适应格式化上下文,即 display值为fex或lne-flex的元素将会生成自适应容器。伸缩容器中的每一个子元素都是一个伸缩单元。伸缩单元可以是任意数量的。伸缩单元内和伸缩容器外的一切元素都不受影响。简单地说, Flexbox定义了伸缩容器内伸缩单元的布局。

43、访问超链接后 hover样式就不出现的原因是什么?应该如何解决?

因为访问过的超链接样式覆盖了原有的 hover和 active伪类选择器样式,解决方法是将CSS属性的排列顺序改为L→V→H→A(link, visited, hover, active)。

44、什么是外边距重叠?重叠的结果是什么?

外边距重叠就是 margin- collapse在CSS中,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式称为折叠,因此而结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则。

(1)当两个相邻的外边距都是正数时,折叠的结果是它们两者中较大的值

(2)当两个相邻的外边距都是负数时,折叠的结果是两者中*对值较大的值。

(3)当两个外边距一正一负时,折叠的结果是两者相加的和。

45、rgba0和 opacity的透明效果有什么不同?

rgba()和 opacity都能实现透明效果,但它们*大的不同是 opacity作用于元素,并且可以设置元素内所有内容的透明度;而 rgba()只作用于元素的颜色或其背景色(设置rgba透明的元素的子元素不会继承透明效果)。

46、CSS中可以让文字在垂直和水平方向上重叠的两个属性是什么?

垂直方向的属性是 line-height.水平方向的属性是 letter-spacing。

47、你知道哪些关于 letter- spacing的妙用?

可以用于消除 inline- block元素间的换行符空格间隙

48、有什么方式可以对一个DOM设置它的CSS?

有以下三种方式。

  • 外链式,即通过link标签引入一个外部CSS文件中。
  • 内嵌式,即将CSS代码写在 style标签内。
  • 行内式,即将CSS代码写在元素的 style属性中。

49、在CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?

*基本的方式如下。

设置 display属性为none,或者设置 visibility属性为 hidden技巧性的方式如下。

设置宽高为0,透明度为0,设置z- index位置为-1000。

50、常用的块属性标签及其特征有哪些?

常用块标签有div、hl、h6、ol、ul、li、d、 table、p、br、form。块标签的特征有独占一行,换行显示,可以设置宽、高,块可以套块和行。

51、常用的行内属性标签及其特征有哪些?

行标签有span、a、img、var、em, strong、 textarea、 select、 option、 input.行标签的特征有在行内显示,内容撑开宽、高,不可以设置宽、高(img, input、 textarea等除外),行只能套用行标签。

52、浏览器标准模式和怪异模式之间的区别是什么?

它们的区别是盒子模型的渲染模式不同。

可以使用 window. top document compatMode判断当前模式为何种模式结果为 Back Compat,表示怪异模式结果为 CSSICompat,表示标准模式。

53、如何避免文档流中的空白符合并现象?

空白符合并是标准文档流的特征之一,可以通过设置 white-spac修改这一特征,属性值如下。

pre表示不会合并空白符,渲染换行符,不会自动换行,相当于pre元素。

pre-wrap表示不会合并空白符,渲染换行符,自动换行pre-line表示合并空白符,渲染换行符,自动换行。

nowrap表示合并空白符,不会渲染换行符,不会自动换行。

normal表示默认值,按照文档流特点渲染,合并空白符,不会渲染换行符,自动换行。

54、常见的兼容性问题有哪些?

PNG24位的图片在IE6浏览器上出现背景,解决方案是改成PNG8,也可以引段脚本进行处理浏览器默认的 margin和 padding不同。解决方案是用一个全局的*{ margin:0 padding:0;}来统一它们。

IE6双边距Bug是指在块属性标签float后又有横行的 margin时,在IE6中显示的margin比设置的大浮动IE产生的双倍距离(IE6的双边距问题是指在IE6下,如果对元素设置了浮动,同时又设置了 margin-left或 margin- right, margin的值会加倍)

#box{ float:left;width:10px;margin:00 100px;}

这种情况下IE会产生20px的距离,解决方案是在float的标签样式控制中加入display:inline,将其转换为行内属性(这个符号只会被IE6识别)。

用渐进识别的方式,从总体中逐渐排除局部。

首先,巧妙地使用“\9”这一标记,将IE浏览器从所有情况中分离出来。然后,再次使用“+”将IE8和I7、IE6分离开,这样IE8就能被独立识别。

CSS

.bb{background-color:#f1ee18;/所有识别*/ background- color:#00deff\9;/IE6、7、8识别”/+ background- color:#a200ff;/*E6、7识别*/ background- color:#1e0bdl;/"IE6识别”/}

怪异模式问题是指漏写DTD声明, Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式。为避免怪异模式给我们带来不必要的麻烦,*好养成书写DTD声明的好习惯。现在可以使用[hml5]

推荐的写法是'< doctype html>’上下 margin重合的问题IE和FF中都存在,相邻两个div的 margIn-et和 margin- right不会重合,但是margin-top和 margin- bottom会重合。

解决方法是养成良好的代码编写习惯,同时采用 margin-top或者同时采用 margin- bottom。

55、透明度具有继承性,如何取消透明度的继承?

使用rgba给元素的背景设置透明度的方式,来替代使用opacity设置元素透明度的方式,解决子元素继承父元素透明度的问题。

56、CSS中,自适应的单位都有哪些?

自适应的单位有以下几个

  • 百分比:%
  • 相对于视口宽度的单位:ww
  • 相对于视口高度的单位:vh
  • 相对于视口宽度或者高度(取决于哪个小)的单位:Vm
  • 相对于父元素字体大小的单位:em
  • 相对于根元素字体大小的单位:rem

57、说说rem和em的区别。

它们都是相对单位

  • rem表示相对于根元素的字体大小。
  • em表示相对于父元素的字体大小

58、什么是FOUC?如何避免FOUC?

FOUC即无样式内容闪烁( Flash Of Unstyled Content),是在IE下通过 @import方式导入CSS文件引起的,如:< style type=” text/css” media=”all”@ Dimporturl(‘demo.css);</style>

IE会首先加载整个HTML文档的DOM,然后再导入外部的CSS文件。因此,在页面DOM加载完成到CSS导入完成中间,有一段时间页面上的内容是没有样式的,这段时间的长短跟网速和电脑速度都有关系。

解决方法是在<head>之间加入一个<link>或< script>标签

59、说说 display:none和 visibility:hidden的区别。

display:none隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢,就当它从来都不存在。

visibility:hidden隐藏对应的元素,但是在文档布局中仍保留原来的空间。

本文完~

常见的HTML5面试题(附答案)

     HTML5为我们提供了更多的语义化标签、更丰富的元素属性,以及更让人欣喜的功能。但在面试中,HTML5部分的面试题主要考察应试者对HTML5API的掌握情况,这是HTML5的重点,也正是这些API推动了前端的发展。
这些新技术早已应用在很多大型项目中。
有些人认为HTML5只是新增了一些语义化HTML标签,或者HTML5只是对HTML做了拓展,我们只须了解HTML相关知识的观点是不正确的。
今天我们将跟大家分享42道HTML5的相关面试题。
1、HTML5有哪些新特性?移除了哪些元素?
HTML5的新特性如下:
  • 拖放( Drag and drop)APIl
  • 语义化更好的内容标签( header、nav、 footer、 aside、 article、 section)
  • 音频、视频( audio、 video)API
  • 画布( Canvas)API
  • 地理( Geolocation)APl
  • 本地离线存储( localStorage),即长期存储数据,浏览器关闭后数据不丢失。
  • 会话存储( sessionStorage),即数据在浏览器关闭后自动删除
  • 表单控件包括 calendar、date、time、 email、url、 search。
  • 新的技术包括 webwork、 websocket、 Geolocation
移除的元素如下:
  • 纯表现的元素,包括 basefont,big、 center、font、s, strike,t、u
  • 对可用性产生负面影响的元素,包括 frame、 frameset、 Noframes
2、如何处理HTML5新标签的浏览器兼容问题?
IE8、IE7、IE6支持用 document. create Element产生标签,可以利用这一特性让这些浏览器支持HTML5新标签。浏览器支持新标签后,还需要添加标签默认的样式(*好的方式是直接使用成熟的框架,使用*多的是 html5shim框架),可以用 IE hack引入该框架
<!--[if 1t IE 9]><script>src="http://html5shim.googlecode.com/svn/trunk/htm15.js</script><![end if]-->

3、如何区别HTML和HTML5?

用 DOCTYPE声明新增的结构元素和功能元素来区别它们。

4、什么是HTML5?

HTML5是*新的HTML标准,它的主要目标是提供所有内容,而不需要任何Flash、 SilverLight等的额外插件,这些内容来自动画、视频、富GUI等

HTML5是万维网联盟(W3C)和网络超文本应用技术工作组( WHATWG)合作输出的。

5、新的HTML5文档类型和字符集是什么?

HTML5文档类型是<!doctype html>。

HTML5使用的字符集< meta charset=”UTF8″>。

6、HTML5 Canvas元素有什么作用?

Canvas元素用于在网页上绘制图形,该元素标签的强大之处在于可以直接在HTML上进行图形操作。

7、HTML5新增了哪些功能AP?

新增的功能API包括 Media APl、 Text Track API、 Application Cache API、User Interaction、 Data Transfer API、 Command API、 Constraint Validation API、 History API

8、HTML5的离线存储有哪些?

有以下离线存储localStorage,可长期存储数据,即浏览器关闭后数据不丢失session Storage,数据在浏览器关闭后自动删除,

9、HTML5的form如何关闭自动补全功能?

将不想要提示的frm元素下的 Input元素的 autocomplete属性设置为off

10、如何在HTML5页面中嵌入音频?

HTML5包含了嵌入音频文件的标准方式,支持的格式包括MP3、Wav和Ogg等,嵌入方式如下。

<audio controls><source src="icketang.mp3" type="audio/mpeg">Your browser does'nt support audio embedding feature.</audio>

11、如何在HTML5页面中嵌入视频?

和嵌入音频文件一样,HTML5定义了嵌入视频的标准方式,支持的格式包括MP4、WebM和Ogg等,嵌入方式如下。

< video width=”450” height=”340” contro1s><source src="icketang.mp4"  type="video/mp4">Your browser does'nt support video embedding feature.</video>

12、HTML5引入了哪些新的表单属性?

新增表单属性包括 datalist、 datetime、 output、 keygen、date、 month、week、time、 number、 range、 emailurl

13、如何显示我们自己画的一个弹框?

可以用一个简单的方法,在页面上单击一个按钮,弹出一个弹框,而弹框也是自己写的一个div。单击前,先把弹框隐藏, onclick事件发生之后就会显示出来

14、HTML5应用缓存和常规的HTML浏览器缓存有什么差别?

HTML5应用缓存*关键的就是支持离线应用,可获取少数或者全部网站内容,包括HTML、CSS、图像和 JavaScript脚本并存在本地。该特性提升了网站的性能,可通过如下方式实现。

<!doctype html><html manifest="example. appcache">......</html>

与传统的浏览器缓存比较,该特性并不强制要求用户访问网站。

15、为什么HTML5里面不需要DTD( Document Type Definition,文档类型定义)?如果不放入<!doctype html>标签,HTML5还会工作吗?

HTML5没有使用SGML或者 XHTML,它是一个全新的类型,因此不需要参考DTD。对于HTML5,仅须放置下面的文档类型代码,让浏览器识别HTML5文档。

如果不放入<!doctype html>标签,HTML5不会工作。浏览器将不能识别出它是HTML文档,同时HTML5的标签将不能正常工作。

16、哪些浏览器支持HTML5?

几乎所有的浏览器(如 Safari、 Chrome、 Firefox、 Opera、IE)都支持HTML5

17、本地存储和会话(事务)存储之间的区别是什么?

本地存储数据持续永久,但是会话存储在浏览器打开时有效,在浏览器关闭时会话重置存储数据。

18、HTML5中的应用缓存是什么?

HTML5应用缓存的*终目的是帮助用户离线浏览页面。换句话说,如果网络连接不可用,打开的页面就来自浏览器缓存,离线应用缓存可以帮助用户达到这个目的。

应用缓存可以帮助用户指定哪些文件需要缓存,哪些不需要

19、如果把HTML5看成一个开放平台,它的构建模块有哪些?

如果把HTML5看成一个开放平台,它的构建模块至少包括以下几个,如<nav><header><section><footer>。

≤nav>标签用来将具有导航性质的链接划分在一起,使代码结构在语义化方面更加准确

< header>标签用来定义文档的页眉。

< section>标签用来描述文档的结构。

< footer>标签用来定义页脚。在典型情况下,该元素会包含文档作者的姓名、文档的创作日期和联系信息

20、HTML5为什么只需要写<!doctype htm>?

HTML5不基于SGML,因此不需要对DTD进行引用,但是需要 DOCTYPE来规范浏览器的行为(让浏览器按照它们的方式来运行)。而HTM4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的类型。

21、HTML5应用程序缓存为应用带来什么优势?

应用程序缓存为应用带来3个优势。

(1)离线浏览,让用户可在应用离线时(网络不可用时)使用它们。

(2)速度,让已缓存资源加载得更快。

(3)减少服务器负载,让浏览器将只下载服务器更新过的资源。

22、与HTML4比较,HTML5废弃了哪些元素?

废弃的元素包括 frame、frameset、 noframe、 applet、big、 center和 basefont。

23、HTML5标准提供了哪些新的API?

HTML5提供很多新的AP1,包括 Media APl、 Text Track API、 Application Cache API、 User InteractionAPI、 Data Transfer API、 Command APl、 Constraintion Validation API和 History API

24、请你说一下 Web Worker和 WebSocket的作用。

Web Worker的作用如下:

(1)通过 worker= new Worker(url)加载一个 JavaScript文件,创建一个 Worker,同时返回一个 Worker实例

(2)用 worker.postMessage(data)向 Worker发送数据

(3)绑定 worker.onmessage接收 Worker发送过来的数据

(4)可以使用 worker.terminate()终止一个 Worker的执行。

WebSocket的作用如下。

它是Web应用程序的传输协议,提供了双向的、按序到达的数据流。它是HTML5新増的协议, WebSocket的连接是持久的,它在客户端和服务器之间保持双工连接,服务器的更新可以及时推送到客户端,而不需要客户端以一定的时间间隔去轮询。

25、如何实现浏览器内多个标签页之间的通信?

在标签页之间,调用 localstorge、 cookies等数据存储,可以实现标签页之间的通信

26、如何让 Websocket兼容低版本浏览器?

使用 Adobe Flash Socket、 ActiveX HTMLFile(E)、 multipart编码发送XHR

与长轮询发送XHR等,可以实现不支持 WebSocket API的浏览器对 Web Socket的兼容。

27、HTML5为浏览器提供了哪些数据存储方案?

在较高版本的浏览器中,提供了 sessionStorage:和 globalStorage。在HTML5规范中,用 localStorage取代 globalStorage 。

HTML5中的 Web Storage包括两种存储方式,分别是 sessionStorage和 localStorage。

sessionStorage用于在本地存储一个会话( session)中的数据,这些数据只有同一个会话中的页面才能访问,当会话结来后,数据也随之销毀。因此 sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

localStorage和 sessionStorage都具有相同的操作方法,例如 setItem、 getItem和removeltem等

28、请描述一下 sessionStorage和 localStorage的区别。

sessionStorage用于在本地存储一个会话中的数据,这些数据只有同一个会话中的页面才能访问,当会话结束后,数据也随之销毀。因此 sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

而 localstorage用于持久化本地存储,除非主动删除数据,否则数据是永远不会过期的。

29、localStorage和 cookie的区别是什么?

localStorage的概念和cookie相似,区别是 localStorage是为了更大容量的存储设计的。cookie的大小是受限的,并且每次请求一个新页面时, cookie都会被发送过去,这样无形中浪费了带宽。另外, cookie还需要指定作用域,不可以跨域调用。

除此之外, localStorage拥有 setlten, getItem、 removeltem、 clear等方法, cookie则需要前端开发者自己封装 setCookie和 get Cookie。但 cookie也是不可或缺的,因为 cookie的作用是与服务器进行交互,并且还是HTP规范的一部分,而 localStorage仅因为是为了在本地“存储”数据而已,无法跨浏览器使用。

30、请你谈谈 cookie的特点。

cookie虽然为持久保存客户端数据提供了方便,分担了服务器存储的负担,但是有以下局限性。

(1)每个特定的域名下*多生成20个 cookie。

(2)IE6或更低版本*多有20个 cookie。

(3)IE7和之后的版本*多可以有50个 cookie。

(4) Firefox*多可以有50个 cookie。

(5) Chrome和 Safari没有做硬性限制。

IE和 Opera会清理近期*少使用的 cookie, Firefox会随机清理 cookie。

cookie*大为4096字节,为了兼容性,一般不能超过4095字节。

IE提供了一种存储方式,可以让用户数据持久化,叫作 userdata,从IE5.0就开始支持此功能。每块数据*多128KB,每个域名下*多1MB。这个持久化数据放在缓存中,如果缓存没有被清理,就会一直存在。

优点如下:

(1)通过良好的编程,控制保存在 cookie中的 session对象的大小。

(2)通过加密和安全传输技术(SSL),降低 cookie被破解的可能性。

(3)只在 cookie中存放不敏感数据,即使被盗也不会有重大损失。

(4)控制 cookie的生命周期,使之不会永远有效。数据偷盗者很可能得到一个过期的 cookie。

缺点如下:

(1)“ cookie”的数量和长度有限制。每个 domain*多只能有20条 cookie,每个cookie的长度不能超过4KB,否则会被截掉。

(2)安全性问题。如果 cookie被别人拦截了,就可以取得所有的 session信息。即使加密也于事无补,因为拦截者并不需要知道 cookie的意义,他只要原样转发 cookie就可以达到目的。

(3)有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果把这个计数器保存在客户端,那么它起不到任何作用

31、cookie和 session的区别是什么?

区别如下:

(1) cookie数据存放在客户的浏览器上, session数据存放在服务器上。

(2) cookie不是很安全,别人可以分析存放在本地的 cookie并进行 cookie欺骗。考虑到安全问题应当使用 session。

(3) session会在一定时间内保存在服务器上。当访问增多时,会占用较多服务器的资源。为了减轻服务器的负担,应当使用 cookie。

(4)单个 cookie保存的数据不能超过4KB,很多浏览器都限制一个站点*多保存20个 cookie。

所以个人建议可以将登录信息等重要信息存放在 session中,其他信息(如果需要保留)可以存放在 cookie中。

32、什么是SVG?

SVG即可缩放失量图形( Scalable Vector Graphics)。它是基于文本的图形语言,使用文本、线条、点等来绘制图像,这使得它轻便、显示迅速。

33、Canvas和SvG的区别是什么?

两者的区别如下:

(1)一旦 Canvas绘制完成将不能访问像素或操作它;任何使用SVG绘制的形状都能被记忆和操作,可以被浏览器再次显示。

(2) Canvas对绘制动画和游戏非常有利;SVG对创建图形(如CAD)非常有利。

(3)因为不需要记住以后事情,所以 Canvas运行更快;因为为了之后的操作,SVG需要记录坐标,所以运行比较缓慢。

(4)在 Canvas中不能为绘制对象绑定相关事件;在SVG中可以为绘制对象绑定相关事件。

(5) Canvas绘制出的是位图,因此与分辨率有关;SvG绘制出的是矢量图,因此与分辨率无关。

34、如何使用 Canvas和HTML5中的SVG画一个矩形?

使用SVG绘制矩形的代码如下:

<svg xmlns=http://www.w3.org/2000/svg  version="1.1"><rect style="fill:rgb(255,100,0);"height=200"  width="400"></rect></svg>

使用 Canvas绘制矩形的代码如下。

<canvas id="myCanvas" width=500" height="500"></canvas>var canvas=document.getElementById('mycanvas');var ctx= canvas.getContext('2d'); ctx.rect(100,100,300,200);ctx fillstyle = 'pink 'ctx. fill()

35、本地存储的数据有生命周期吗?

本地存储的数据没有生命周期,它将一直存储数据,直到用户从浏览器清除或者使用 JavaScript代码移除。

36、HTML5中如何实现应用缓存?

首先,需要指定“ manifest”文件,” manifest”文件帮助你定义缓存如何工作以下是“ manifest”文件的结构。

CACHE MANTEEST # version 1.0/demo. css/demo. js/demo.png所有 manifest文件都以” CACHE MANIFEST"语句开始。#(散列标签)有助于提供缓存文件的版本。manifest文件的内容类型应是"text/ cache- manifest”。

创建一个缓存 manifest文件后,在HTML页面中提供 manifest链接,代码如下所示。

<html manifest=”icketang. appcache”>

*次运行以上文件时,它会添加到浏览器应用缓存中,在服务器宕机时,页面从应用缓存中获取数据。

37、如何刷新浏览器的应用缓存?

应用缓存通过变更“#”标签后的版本号来刷新,如下所示:

CACHE  MANIFEST # version 2.0/icketang.css/icketang.js/icketang. pngNETWORK: login. php

38、应用缓存中的回退是什么?

应用缓存中的回退会帮助你指定在服务器不可访问时,显示某文件。例如在下面的manifest文件中,如果用户输入了“/home”,同时服务器不可到达,“404htm”文件应送达。

FALLBACK:/home//404. html

39、应用缓存中网络命令的作用是什么?

网络命令描述不需要缓存的文件,例如以下代码中“ login.php”始终都不应该缓存或者离线访问。

NETWORK login. php

40、什么是 Websql?

Websql是一个在浏览器客户端的结构关系数据库,是浏览器内的本地 RDBMS(关系型数据库管理系统),可以使用SQL查询。

41、Websql是HTML5的一个规范吗?

不是,许多人把它标记为HTML5,但是它不是HTML5规范的一部分,这个规范是基于 SQLite的

42、HTML5如何实现跨域?

在服务器端设置允许在其他域名下访问,例如允许所有域名访问以下内容。

response.setHeader("Access-Control-Allow-Origin""*");response.setHeader ("Access-Control-Allow-Methods""POST");response.setHeader("Access-Control-Allow-Headers""x-requested-with, content-type");

本文完~

【前端面试题】有关前端工程化的面试题(附答案)

随着前端技术的发展,前端工程化变得越来越重要。前端工程化部分的面试题主要考察应试者对工程化的理解与运用,如何通过工程化来提高代码质量、编译代码、优化代码;如何提高网站性能,保障网站安全,提升用户体验;如何将开发的代码按照理想的方式发布和上线等。

当然,一些新技术的实现(诸如 EMAScript 6、 typescript、jsx、 Less、Sass、 Stylus等)都离不开前端工程化。

1、谈谈你对 WebPack的认识。

WebPack是一个模块打包工具,可以使用 WebPack管理模块依赖,并编译输岀模块所需的静态文件。它能够很好地管理与打包Web开发中所用到的HTML、 JavaScript 、CSS以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源, WebPack有对应的模块加载器。Web Pack模块打包器会分析模块间的依赖关系,*后生成优化且合并后的静态资源。

WebPack的两大特色如下。

(1)代码切割( code splitting)

(2) loader可以处理各种类型的静态文件,并且支持串行操作WebPack以 CommonJS规范来书写代码,但对 AMD/CMD的支持也很全面,方便对项目进行代码迁移。

WebPack具有 require.js和 browserify的功能,但也有很多自己的新特性,

(1)对 CommonJS、AMD、ES6的语法实现了兼容。

(2)对 JavaScript、CSS、图片等资源文件都支持打包

(3)串联式模块加载器和插件机制,让其具有更好的灵活性和扩展性,例如提供对CoffeeScript、 EMAScript 6的支持

(4)有独立的配置文件 webpack.config. js。

(5)可以将代码切割成不同的块,实现按需加载,缩短了初始化时间。

(6)支持 SourceUrls和 SourceMaps,易于调试。

(7)具有强大的 Plugin接口,大多是内部插件,使用起来比较灵活

(8)使用异步I/O,并具有多级缓存,这使得 WebPack速度很快且在增量编译上更加快。

2、在使用 WebPack时,你都做些什么?

用来压缩合并CSS和 JavaScript代码,压缩图片,对小图生成base64编码,对大图进行压缩,使用 Babel把 EMAScript 6编译成 EMAScript 5,热重载,局部刷新等。在 output中配置出口文件,在 entry中配置入口文件。

使用各种 loader对各种资源做处理,并解析成浏览器可运行的代码。

3、你用Gulp都实现了哪些功能?

我之前写的一个 Angular项目就是使用Gulp构建的。使用task制定各种任务,将通过 bower安装的第三方插件复制到开发和生产目录中。复制Less并将它编译成CSS然后合并到一个文件中并压缩。

将JS目录下所有的 JavaScript文件合并并压缩成一个JavaScript文件。使用 imagemin压缩图片,使图片变小。

使用open让项目在自动运行时自动打开浏览器。使用 watch监听src目录中代码的变化,并进行实时编译。使用 connect创建一个项目服务器,用来做开发调试。

4、说说 WabPack打包的流程。

具体流程如下。

(1)通过 entry配置入口文件。

(2)通过 output指定输出的文件。

(3)使用各种 loader处理CSS、 JavaScript、 image等资源,并将它们编译与打包成浏览器可以解析的内容等。

5、什么是 WebPack?

Web Pack是一个打包工具, WebPack可以将项目中使用的脚本开发语言CoffeeScript Type Script、样式开发语言Less或者Sass“编译”成浏览器能识别的 JavaScript和CSS文件。

6、WebPack的核心原理是什么?

核心原理如下。

(1)一切皆模块。

正如 JavaScript文件可以是一个“模块”( module)一样,其他的(如CSS、 image或 HTML)文件也可视作模块。因此,可以执行 require(’myJSfile js’),亦可以执行require( ‘myCSSfile.css’)。这意味着我们可以将事务(业务)分割成更小的、易于管理的片段,从而达到重复利用的目的。

(2)按需加载。

传统的模块打包工具( module bundler)*终将所有的模块编译并生成一个庞大的bundle. js文件。但是,在真实的App里, bundle. js文件的大小在10MB到15MB之间,这可能会导致应用一直处于加载状态。因此, WebPack使用许多特性来分割代码,然后生成多个 bundle js文件,而且异步加载部分代码用于实现按需加载。

7、WebPack中 loader的作用是什么?

具体作用如下。

(1)实现对不同格式文件的处理,比如将Scss转换为CSS,或将 TypeScript转化为Javascript。

(2)可以编译文件,从而使其能够添加到依赖关系中。loader是 WebPack*重要的部分之一。通过使用不同的 loader,我们能够调用外部的脚本或者工具,实现对不同格式文件的处理。loader需要在 webpack.config.js里单独用 module进行配置。

8、说说你工作中几个常用的 loader。

常用的 loader如下:

babel- loader:将下一代的 JavaScript语法规范转换成现代浏览器能够攴持的语法规范。因为 babel有些复杂,所以大多数开发者都会新建一个. babelrc进行配置。

css-loader、 style- loader:这两个建议配合使用,用来解析CSS文件依赖。

less- loader:解析less文件。

file- loader:生成的文件名就是文件内容的MD5散列值,并会保留所引用资源的原始扩展名。

url- loader:功能类似于file-loader,但是当文件大小低于指定的限制时,可以返回一个 DataURL。

9、plugins和 loader有什么区别?

它们是两个完全不同的东西。loader负责处理源文件,如CSS、jsx文件,一次处理一个文件。而 plugins并不直接操作单个文件,它直接对整个构建过程起作用。

10、说说 HtmlWebpackPlugin插件的作用。

依据一个简单的 index .html模板,生成一个自动引用你打包后的 JavaScript文件的、新的 index.html文件。

11、说说 WebPack支持的脚本模块规范。

不同项目在定义脚本模块时使用的规范不同。有的项目会使用 Commonjs规范(参考 Node. js);有的项目会使用 EMAScript 6模块规范;有的还会使用AMD规范(参考 Require. js)。WebPack支持这3种规范,还支持混合使用。

12、如何为项目创建 package. json文件?

将命令行切换至根目录下,运行 npm init,命令行就会一步一步引导你建立package. json文件。手动在根目录下创建一个空文件,并命名为 package. json,在文件中填充JSON格式的常规内容。例如初期只需要name和 version字段。

  1. {
  2. “name”“Project”
  3. “version”” 0.0.1″
  4. }

13、WebPack和 gulp/grunt相比有什么特性?

gulp/ grunt是一种能够优化前端的流程开发工具,而 Web Pack是一种模块化的解决方案,由于 WebPack提供的功能越来越丰富,使得 WebPack可以代替 gulp/grunt类的工具。

14、grunt和gulp的工作方式是什么?

在一个配置文件中,指明对某些文件进行何种编译、组合、压缩等任务的具体步骤,当运行这些工具的指令的时候,就可以自动完成这些任务。

15、WebPack的工作方式是什么?

把项目当作一个整体,通过一个给定的主文件(如 index. js), WebPack将从这个文件开始找到你项目的所有依赖,并使用 loader(加载器)来处理它们,*后打包为个浏览器可识别的 JavaScript文件。

16、Babe通过编译能达到什么目的?

能达到以下目的。

(1)使用下一代的 JavaScript标准( EMAScript 6、 EMAScript 7)语法,当前的浏览器尚不完全支持这些标准。

(2)使用基于 JavaScript进行拓展的语言,比如 React的jsx语法。

17、EventSource和 websocket的区别是什么?

区别如下。

EventSource本质仍然是HTTP,仅提供服务器端到浏览器端的单向文本传输,不需要心跳链接,链接断开会持续重发链接。

注意:心跳链接是用来检测一个系统是否存活或者网络链路是否通畅的一种方式。

(2) websocket是基于TCP的协议,提供双向数据传输,支持二进制,需要心跳链接,断开链接时不会重链。

(3) EventSource更简洁轻量, websocket支持性更妤,后者功能更强大一点。

18、在工作中, WebPack工具中常用到的插件有哪些?

常用到的插件如下

(1) HtmlWebpackPlugin:依据一个HTML模板,生成HTML文件,并将打包后的资源文件自动引入。

(2) commonsChunkPlugin:抽取公共模块,减小包占用的内存空间,例如vue的源码、 jQuery的源码等。

(3) css-loader:解析CSS文件依赖,在 JavaScript中通过 require方式引入CSS文件。

(4) style- loader.:通过 style标签引入CSS。

(5) extract-text-webpack- plugin:将样式抽取成单独的文件。

(6)url- loader:实现图片文字等资源的打包,limit选项定义大小限制,如果小于该限制,则打包成base64编码格式;如果大于该限制,就使用file- loader去打包成图片。

(7) hostess:实现浏览器兼容。

(8) babel:将 JavaScript未来版本( EMAScript6、 EMAScript2016等)转换成当前浏览器支持的版本。

(9) hot module replacement:修改代码后,自动刷新、实时预览修改后的效果

(10) ugliifyJsPlugin:压缩 JavaScript代码。

19、WebPack与gulp的区别是什么?

区别如下。

(1)用途不同。gulp是工具链,可以配合各种插件使用,例如对 JavaScript、CSS文件进行压缩,对less进行编译等;而 WebPack能把项目中的各种 JavaScript、CSS文件等打包合并成一个或者多个文件,主要用于模块化开发。

(2)侧重点不同。gulp侧重于整个过程的控制管理(像是流水线),通过配置不同的任务,构建整个前端开发流程,并且gulp的打包功能是通过安装gulp-webpack来实现的;WebPack则侧重于模块打包。

(3) WebPack能够按照模块的依赖关系构建文件组织结构。

20、window对象中,模块间的依赖关系完全由文件的加载顺序决定,这样的模块组织方式出现的弊端是什么?

弊端如下。

(1)全局作用域下容易造成变量冲突。

(2)文件只能按照< script>的书写顺序进行加载

(3)开发人员需要自己解决模块代码库的依赖关系。

(4)在大型项目中这样的加载方式会导致文件冗长而难以管理。

21、如何用 webpack-dev- server监控文件编译?

打开多个控制台,用 webpack–watch实时监控文件变动,并随时编译。

22、如何修改 webpack-dev- server的端口?

用–port修改端口号,如 webpack-dev-server–port888。

23、publicPath是什么?

在 WebPack自动生成资源路径时,比如由于 WebPack异步加载分包而需要独立出来的块,或者打包CSS时, WebPack自动替换掉的图片、字体文件,又或者使用html-webpack-plugin后 WebPack自动加载的入口文件等,这些 WebPack生成的路径都会参考 publicPath参数。不需要关注CDN,需要关注的是,文件发布出来后,应该部署到哪里。如果文件是与页面放到一起的,那么可以按相对路径来设置,比如’./’之类的;而如果 JavaScript、CSS文件用于存放CDN,当然就要填写CDN的域名和路径。

24、export、 export default和 module.export的区别是什么?

export、 export default都属于 EMAScript 6 模块化开发规范。

export和 export default的区别如下。

在同一个文件里面可以有多个 export,一个文件里面只能有1个 export default。

使用 import引入的方式也有点区别。

在使用 export时,用 import引入的相应模块名字一定要和定义的名字一样;而在使用 export default时,用 import引入的模块名字可以不一样。

module. export属于 CommonJS语法规范。

25、当使用Babel直接打包的 JavaScript文件中含有jsx语法的时候会报错,如何解决这个问题?

修改 package. json并添加 react,如以下代码所示。

  1. “babel”:{
  2. “presets”:[
  3. “es2015”,
  4. “react”,
  5. “stage-o”
  6. ],
  7. “plugins” :[
  8. “add-module-exports”
  9. ]
  10. }

26、当使用html- webpack- plugin时找不到指定的 template文件怎么办?

通过以下代码进行解决。

  1. {
  2. test:/ \.html ?$/,
  3. loader : ‘html-loader ‘
  4. }

也就是将以前的file-loader修改为html- loader就可以了。

27、WebPack如何切换开发环境和生产环境?

生产环境与开发环境的区别无非就是调用的接口地址、资源存放路径、线上的资源是否需要压缩等方面。目前的做法是通过在 package. json中设置node的一个全局变量,然后在 webpack. config. js文件里面进行生产环境与开发环境的配置切换。

28、WebPack的特点是什么?

特点如下:

(1)具有丰富的插件,方便程序员进行开发。

(2)具有大量的加载器,包括加载各种静态资源。

(3)支持代码分割,提供按需加载的能力。

(4)它是一个理想的发布工具。

29、WebPack的优势是什么?

优势如下:

(1) WebPack以 CommonJS的形式书写脚本,对 AMD/CMD的支持也很全面,方便对旧项目进行代码迁移

(2)*大部分前端资源都可以模块化。

(3)开发便捷,能替代 grunt/gulp的部分工作,如程序打包、压缩混淆、图片转base64编码等。

(4)扩展性强,插件机制完善,特别是支持 React热插拔功能。

30、图片处理常见的加载器有几种?

有以下几种。

(1)file- loader,默认情况下会根据图片生成对应的MD5散列的文件格式。

(2)url- loader,它类似于file- loader,但是url- loader可以根据自身文件的大小,来决定是否把转化为base64格式的 DataUrl单独作为文件,也可以自定义对应的散列文件名。

(3) image- webpack- loader,提供压缩图片的功能。

31、WebPack命令的– config选项有什么作用?

— config用来指定一个配置文件,代替命令行中的选项,从而简化命令。如果直接执行 WebPack, WebPack会在当前目录下查找名为 webpack. config. js的文件。

本文完〜

前端面试题之前端工程化篇

一、Git

1. git 和 svn 的区别
git 和 svn *大的区别在于 git 是分布式的,而 svn 是集中式的。因此我们不能再离线的情况下使用 svn。如果服务器出现问题,就没有办法使用 svn 来提交代码。
svn 中的分支是整个版本库的复制的一份完整目录,而 git 的分支是指针指向某次提交,因此 git 的分支创建更加开销更小并且分支上的变化不会影响到其他人。svn 的分支变化会影响到所有的人。
svn 的指令相对于 git 来说要简单一些,比 git 更容易上手。
**GIT把内容按元数据方式存储,而SVN是按文件:**因为git目录是处于个人机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
**GIT分支和SVN的分支不同:**svn会发生分支遗漏的情况,而git可以同一个工作目录下快速的在几个分支间切换,很容易发现未被合并的分支,简单而快捷的合并这些文件。
GIT没有一个全局的版本号,而SVN有
**GIT的内容完整性要优于SVN:**GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏

2. 经常使用的 git 命令?
git init // 新建 git 代码库
git add // 添加指定文件到暂存区
git rm // 删除工作区文件,并且将这次删除放入暂存区
git commit -m [message] // 提交暂存区到仓库区
git branch // 列出所有分支
git checkout -b [branch] // 新建一个分支,并切换到该分支
git status // 显示有变更文件的状态

3. git pull 和 git fetch 的区别

git fetch 只是将远程仓库的变化下载下来,并没有和本地分支合并。
git pull 会将远程仓库的变化下载下来,并和当前分支合并。
4. git rebase 和 git merge 的区别
git merge 和 git rebase 都是用于分支合并,关键在 commit 记录的处理上不同:

git merge 会新建一个新的 commit 对象,然后两个分支以前的 commit 记录都指向这个新 commit 记录。这种方法会保留之前每个分支的 commit 历史。
git rebase 会先找到两个分支的*个共同的 commit 祖先记录,然后将提取当前分支这之后的所有 commit 记录,然后将这个 commit 记录添加到目标分支的*新提交后面。经过这个合并后,两个分支合并后的 commit 记录就变为了线性的记录了。
二、Webpack

1. webpack与grunt、gulp的不同?
Grunt**、Gulp是基于任务运⾏的⼯具**: 它们会⾃动执⾏指定的任务,就像流⽔线,把资源放上去然后通过不同插件进⾏加⼯,它们包含活跃的社区,丰富的插件,能⽅便的打造各种⼯作流。

Webpack是基于模块化打包的⼯具: ⾃动化处理模块,webpack把⼀切当成模块,当 webpack 处理应⽤程序时,它会递归地构建⼀个依赖关系图 (dependency graph),其中包含应⽤程序需要的每个模块,然后将所有这些模块打包成⼀个或多个 bundle。

因此这是完全不同的两类⼯具,⽽现在主流的⽅式是⽤npm script代替Grunt、Gulp,npm script同样可以打造任务流。

 

2. webpack、rollup、parcel优劣?

webpack适⽤于⼤型复杂的前端站点构建: webpack有强⼤的loader和插件⽣态,打包后的⽂件实际上就是⼀个⽴即执⾏函数,这个⽴即执⾏函数接收⼀个参数,这个参数是模块对象,键为各个模块的路径,值为模块内容。⽴即执⾏函数内部则处理模块之间的引⽤,执⾏模块等,这种情况更适合⽂件依赖复杂的应⽤开发。
rollup适⽤于基础库的打包,如vue、d3等: Rollup 就是将各个模块打包进⼀个⽂件中,并且通过 Tree-shaking 来删除⽆⽤的代码,可以*⼤程度上降低代码体积,但是rollup没有webpack如此多的的如代码分割、按需加载等⾼级功能,其更聚焦于库的打包,因此更适合库的开发。
parcel适⽤于简单的实验性项⽬: 他可以满⾜低⻔槛的快速看到效果,但是⽣态差、报错信息不够全⾯都是他的硬伤,除了⼀些玩具项⽬或者实验项⽬不建议使⽤。

3. 有哪些常⻅的Loader?
file-loader:把⽂件输出到⼀个⽂件夹中,在代码中通过相对 URL 去引⽤输出的⽂件
url-loader:和 file-loader 类似,但是能在⽂件很⼩的情况下以 base64 的⽅式把⽂件内容注⼊到代码中去
source-map-loader:加载额外的 Source Map ⽂件,以⽅便断点调试
image-loader:加载并且压缩图⽚⽂件
babel-loader:把 ES6 转换成 ES5
css-loader:加载 CSS,⽀持模块化、压缩、⽂件导⼊等特性
style-loader:把 CSS 代码注⼊到 JavaScript 中,通过 DOM 操作去加载 CSS。
eslint-loader:通过 ESLint 检查 JavaScript 代码
注意:在Webpack中,loader的执行顺序是从右向左执行的。因为webpack选择了compose这样的函数式编程方式,这种方式的表达式执行是从右向左的。

4. 有哪些常⻅的Plugin?
define-plugin:定义环境变量
html-webpack-plugin:简化html⽂件创建
uglifyjs-webpack-plugin:通过 UglifyES 压缩 ES6 代码
webpack-parallel-uglify-plugin: 多核压缩,提⾼压缩速度
webpack-bundle-analyzer: 可视化webpack输出⽂件的体积
mini-css-extract-plugin: CSS提取到单独的⽂件中,⽀持按需加载

5. bundle,chunk,module是什么?
bundle:是由webpack打包出来的⽂件;
chunk:代码块,⼀个chunk由多个模块组合⽽成,⽤于代码的合并和分割;
module:是开发中的单个模块,在webpack的世界,⼀切皆模块,⼀个模块对应⼀个⽂件,webpack会从配置的 entry中递归开始找出所有依赖的模块。

6. Loader和Plugin的不同?
不同的作⽤:

Loader直译为”加载器”。Webpack将⼀切⽂件视为模块,但是webpack原⽣是只能解析js⽂件,如果想将其他⽂件也打包的话,就会⽤到 loader 。 所以Loader的作⽤是让webpack拥有了加载和解析⾮JavaScript⽂件的能⼒。
Plugin直译为”插件”。Plugin可以扩展webpack的功能,让webpack具有更多的灵活性。 在 Webpack 运⾏的⽣命周期中会⼴播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
不同的⽤法**?*

Loader在 module.rules 中配置,也就是说他作为模块的解析规则⽽存在。 类型为数组,每⼀项都是⼀个 Object ,⾥⾯描述了对于什么类型的⽂件( test ),使⽤什么加载( loader )和使⽤的参数( options )
Plugin在 plugins 中单独配置。 类型为数组,每⼀项是⼀个 plugin 的实例,参数都通过构造函数传⼊。
7. webpack的构建流程**?**
Webpack 的运⾏流程是⼀个串⾏的过程,从启动到结束会依次执⾏以下流程:

初始化参数:从配置⽂件和 Shell 语句中读取与合并参数,得出*终的参数;
开始编译:⽤上⼀步得到的参数初始化 Compiler 对象,加载所有配置的插件,执⾏对象的 run ⽅法开始执⾏编译;
确定⼊⼝:根据配置中的 entry 找出所有的⼊⼝⽂件;
编译模块:从⼊⼝⽂件出发,调⽤所有配置的 Loader 对模块进⾏翻译,再找出该模块依赖的模块,再递归本步骤直到所有⼊⼝依赖的⽂件都经过了本步骤的处理;
完成模块编译:在经过第4步使⽤ Loader 翻译完所有模块后,得到了每个模块被翻译后的*终内容以及它们之间的依赖关系;
输出资源:根据⼊⼝和模块之间的依赖关系,组装成⼀个个包含多个模块的 Chunk,再把每个 Chunk 转换成⼀个单独的⽂件加⼊到输出列表,这步是可以修改输出内容的*后机会;
输出完成:在确定好输出内容后,根据配置确定输出的路径和⽂件名,把⽂件内容写⼊到⽂件系统。
在以上过程中,Webpack 会在特定的时间点⼴播出特定的事件,插件在监听到感兴趣的事件后会执⾏特定的逻辑,并且插件可以调⽤ Webpack 提供的 API 改变 Webpack 的运⾏结果。

8. 编写loader或plugin的思路?
Loader像⼀个”翻译官”把读到的源⽂件内容转义成新的⽂件内容,并且每个Loader通过链式操作,将源⽂件⼀步步翻译成想要的样⼦。

编写Loader时要遵循单⼀原则,每个Loader只做⼀种”转义”⼯作。 每个Loader的拿到的是源⽂件内容(source),可以通过返回值的⽅式将处理后的内容输出,也可以调⽤ this.callback() ⽅法,将内容返回给webpack。 还可以通过this.async() ⽣成⼀个 callback 函数,再⽤这个callback将处理后的内容输出出去。 此外 webpack 还为开发者准备了开发loader的⼯具函数集——loader-utils 。

相对于Loader⽽⾔,Plugin的编写就灵活了许多。 webpack在运⾏的⽣命周期中会⼴播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。

9. webpack的热更新是如何做到的?说明其原理?
webpack的热更新⼜称热替换(Hot Module Replacement),缩写为HMR。 这个机制可以做到不⽤刷新浏览器⽽将新变更的模块替换掉旧的模块。

原理:

%title插图%num

⾸先要知道server端和client端都做了处理⼯作:

第⼀步,在 webpack 的 watch 模式下,⽂件系统中某⼀个⽂件发⽣修改,webpack 监听到⽂件变化,根据配置⽂
件对模块重新编译打包,并将打包后的代码通过简单的 JavaScript 对象保存在内存中。

第⼆步是 webpack-dev-server 和 webpack 之间的接⼝交互,⽽在这⼀步,主要是 dev-server 的中间件 webpack- dev-middleware 和 webpack 之间的交互,webpack-dev-middleware 调⽤ webpack 暴露的 API对代码变化进⾏监 控,并且告诉 webpack,将代码打包到内存中。
第三步是 webpack-dev-server 对⽂件变化的⼀个监控,这⼀步不同于第⼀步,并不是监控代码变化重新打包。当我们在配置⽂件中配置了devServer.watchContentBase 为 true 的时候,Server 会监听这些配置⽂件夹中静态⽂件的变化,变化后会通知浏览器端对应⽤进⾏ live reload。注意,这⼉是浏览器刷新,和 HMR 是两个概念。
第四步也是 webpack-dev-server 代码的⼯作,该步骤主要是通过 sockjs(webpack-dev-server 的依赖)在浏览器端和服务端之间建⽴⼀个 websocket ⻓连接,将 webpack 编译打包的各个阶段的状态信息告知浏览器端,同时也包括第三步中 Server 监听静态⽂件变化的信息。浏览器端根据这些 socket 消息进⾏不同的操作。当然服务端传递的*主要信息还是新模块的 hash 值,后⾯的步骤根据这⼀ hash 值来进⾏模块热替换。
webpack-dev-server/client 端并不能够请求更新的代码,也不会执⾏热更模块操作,⽽把这些⼯作⼜交回给了webpack,webpack/hot/dev-server 的⼯作就是根据 webpack-dev-server/client 传给它的信息以及 dev-server 的配置决定是刷新浏览器呢还是进⾏模块热更新。当然如果仅仅是刷新浏览器,也就没有后⾯那些步骤了。
HotModuleReplacement.runtime 是客户端 HMR 的中枢,它接收到上⼀步传递给他的新模块的 hash 值,它通过JsonpMainTemplate.runtime 向 server 端发送 Ajax 请求,服务端返回⼀个 json,该 json 包含了所有要更新的模块的 hash 值,获取到更新列表后,该模块再次通过 jsonp 请求,获取到*新的模块代码。这就是上图中 7、8、9 步骤。
⽽第 10 步是决定 HMR 成功与否的关键步骤,在该步骤中,HotModulePlugin 将会对新旧模块进⾏对⽐,决定是否更新模块,在决定更新模块后,检查模块之间的依赖关系,更新模块的同时更新模块间的依赖引⽤。
*后⼀步,当 HMR 失败后,回退到 live reload 操作,也就是进⾏浏览器刷新来获取*新打包代码。
10. 如何⽤webpack来优化前端性能?
⽤webpack优化前端性能是指优化webpack的输出结果,让打包的*终结果在浏览器运⾏快速⾼效。

压缩代码:删除多余的代码、注释、简化代码的写法等等⽅式。可以利⽤webpack的 UglifyJsPlugin 和 ParallelUglifyPlugin 来压缩JS⽂件, 利⽤ cssnano (css-loader?minimize)来压缩css
利⽤CDN加速: 在构建过程中,将引⽤的静态资源路径修改为CDN上对应的路径。可以利⽤webpack对于 output 参数和各loader的 publicPath 参数来修改资源路径
Tree Shaking: 将代码中永远不会⾛到的⽚段删除掉。可以通过在启动webpack时追加参数 –optimize-minimize 来实现
Code Splitting: 将代码按路由维度或者组件分块(chunk),这样做到按需加载,同时可以充分利⽤浏览器缓存
提取公共第三⽅库: SplitChunksPlugin插件来进⾏公共模块抽取,利⽤浏览器缓存可以⻓期缓存这些⽆需频繁变动的公共代码
11. 如何提⾼webpack的打包速度**?**
happypack: 利⽤进程并⾏编译loader,利⽤缓存来使得 rebuild 更快,遗憾的是作者表示已经不会继续开发此项⽬,类似的替代者是thread-loader
外部扩展(externals): 将不怎么需要更新的第三⽅库脱离webpack打包,不被打⼊bundle中,从⽽减少打包时间,⽐如jQuery⽤script标签引⼊
dll: 采⽤webpack的 DllPlugin 和 DllReferencePlugin 引⼊dll,让⼀些基本不会改动的代码先打包成静态资源,避免反复编译浪费时间
利⽤缓存: webpack.cache 、babel-loader.cacheDirectory、 HappyPack.cache 都可以利⽤缓存提⾼rebuild效率缩⼩⽂件搜索范围: ⽐如babel-loader插件,如果你的⽂件仅存在于src中,那么可以 include: path.resolve(__dirname,‘src’) ,当然*⼤多数情况下这种操作的提升有限,除⾮不⼩⼼build了node_modules⽂件
12. 如何提⾼webpack的构建速度?
多⼊⼝情况下,使⽤ CommonsChunkPlugin 来提取公共代码
通过 externals 配置来提取常⽤库
利⽤ DllPlugin 和 DllReferencePlugin 预编译资源模块 通过 DllPlugin 来对那些我们引⽤但是*对不会修改的npm包来进⾏预编译,再通过 DllReferencePlugin 将预编译的模块加载进来。
使⽤ Happypack 实现多线程加速编译
使⽤ webpack-uglify-parallel 来提升 uglifyPlugin 的压缩速度。 原理上 webpack-uglify-parallel 采⽤了多核并⾏压缩来提升压缩速度
使⽤ Tree-shaking 和 Scope Hoisting 来剔除多余代码
13. 怎么配置单⻚应⽤?怎么配置多⻚应⽤?
单⻚应⽤可以理解为webpack的标准模式,直接在 entry 中指定单⻚应⽤的⼊⼝即可,这⾥不再赘述多⻚应⽤的话,可以使⽤webpack的 AutoWebPlugin 来完成简单⾃动化的构建,但是前提是项⽬的⽬录结构必须遵守他预设的规范。 多⻚应⽤中要注意的是:

每个⻚⾯都有公共的代码,可以将这些代码抽离出来,避免重复的加载。⽐如,每个⻚⾯都引⽤了同⼀套css样式表
随着业务的不断扩展,⻚⾯可能会不断的追加,所以⼀定要让⼊⼝的配置⾜够灵活,避免每次添加新⻚⾯还需要修改构建配置
三、其他
1. Babel的原理是什么**?**
babel 的转译过程也分为三个阶段,这三步具体是:

解析 Parse: 将代码解析⽣成抽象语法树(AST),即词法分析与语法分析的过程;
转换 Transform: 对于 AST 进⾏变换⼀系列的操作,babel 接受得到 AST 并通过 babel-traverse 对其进⾏遍历,在此过程中进⾏添加、更新及移除等操作;
⽣成 Generate: 将变换后的 AST 再转换为 JS 代码, 使⽤到的模块是 babel-generator。

%title插图%num

服务器常见硬盘接口及分类

存储领域的磁盘介质是*关键的设备,所有数据和信息都要存放在磁盘介质上。而数据的读取速度则是由磁盘介质的连接接口决定的。以往我们都是通过SCSI或者SATA接口及硬盘来完成数据存储工作。不过近些年一个新型技术越来越得到中小企业甚至是大型企业的青睐。就是SAS技术以及与之相对应的SAS硬盘。今天我们就从无到有的来了解下什么是SAS技术以及使用SAS硬盘的优势。

一、常见磁盘技术与接口类型优劣:

网络存储设备目前大致可分为三大类,即高端中端和近端(Near-Line)。高端存储设备主要是光纤通道为主,由于光纤通道传输速度很快,所以高端存储光纤设备大部分应用于任务级关键数据的大容量实时存储上。中端存储设备主要是SCSI设备,他的历史也很悠久,应用于商业级的关键数据的大容量存储。近端是近年来新出现的存储领域,其产品主要是串行ATA(Serial ATA,缩写为SATA),应用于非关键数据的大容量存储,目的是替代以前使用磁带的数据备份。 如图

光纤通道存储设备的*大优势就是传输速度快,但是他的价格很高,维护起来也相对麻烦;而SCSI设备存取速度相对比较快,价格位于中等位置,但是他的扩展性稍微差一点,每个SCSI接口卡*多只能连接15个(单通道)或者30个(双通道)设备。如图

SATA则是近几年飞速发展的技术,他的*大优势就是价格便宜,而且速度并不比SCSI接口慢多少,随着技术的发展SATA的数据读取速度正在接近并赶超SCSI接口。另外由于SATA的硬盘价格越来越低,容量越来越大,逐渐可以用于数据备份。

因此传统的企业级存储由于考虑到性能和稳定性,以SCSI硬盘和光纤通道为主要存储平台,ATA则多用于非关键性资料或桌面个人计算机上,不过随着SATA技术的兴起与SATA设备的成熟,这个模式正在被改变,越来越多的人都开始关注SATA这种串行数据存储连接方式。

二、什么是SAS技术?

正因为SATA技术的飞速发展以及多方面的优势,才会让更多的人考虑能否存在一种方式可以将SATA与SCSI两者相结合,这样就可以同时发挥两者的优势了。在这种情况下SAS应运而生。

SAS是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,提供与串行ATA(Serial ATA,缩写为SATA)硬盘的兼容性。

SAS的接口技术可以向下兼容SATA。SAS系统的背板(Backplane)既可以连接具有双端口、高性能的SAS驱动器,也可以连接高容量、低成本的SATA驱动器。因为SAS驱动器的端口与SATA驱动器的端口形状看上去类似,所以SAS驱动器和SATA驱动器可以同时存在于一个存储系统之中。但需要注意的是,SATA系统并不兼容SAS,所以SAS驱动器不能连接到SATA背板上。由于SAS系统的兼容性,IT人员能够运用不同接口的硬盘来满足各类应用在容量上或效能上的需求,因此在扩充存储系统时拥有更多的弹性,让存储设备发挥*大的投资效益。说白了SAS接口技术就是使用串行接口的SCSI硬盘,他和SATA硬盘是兼容的,我们可以在SAS接口上安装SAS硬盘或者SATA硬盘。

三、SAS技术的优势:

正如前面所说SAS技术与SAS硬盘是在人们希望发挥SATA与SCSI接口共同优势的基础上诞生的。那么集中两者优势形成的SAS到底在哪些方面存在过人之处呢?

(1)SAS技术降低了磁盘阵列的成本:

以往不管使用SCSI接口还是FC光纤接口,当一个厂商生产磁盘阵列柜时需要的技术是非常高的,成本也很高,因为存储设备厂商目前投入相当多的成本以支持包括光纤通道阵列、SATA阵列等不同的存储设备。而SAS技术具备简化内部连接设计的优势,可以通过共用组件降低设计成本。这样就可以花更少的钱享受SCSI接口的性能。

(2)串行接口让传输性能提高:

串行SCSI是点到点的结构,可以建立磁盘到控制器的直接连接。通过点到点技术为每个设备提供了专用的信号通路来保证*大的带宽,并且每个传输通道都是在全双工方式下进行的。总的说来他的性能要比传统SCSI更高。

(3)更好的扩展性能:

上面笔者也提到了SCSI接口的扩展性能一般,*多只能连接15个(单通道)或者30个(双通道)设备。而经过改良后的SAS接口则大大不同,SAS结构有非常好的扩展能力,*多可以连接16384个磁盘设备。

(4)安装更简单:

SAS接口使用更细的电缆搭配更小的连接器,一方面节约了服务器或存储设备的空间,另一方节省了空间,从而提高了使用SAS硬盘服务器的散热、通风能力。而传统的SCSI接口使用较大的并行电缆,这会带来部分电子干扰,采用SAS的电缆结构就不会出现此问题。另外每个SAS电缆有四根电缆,两根输入两根输出。SAS可以同时进行数据的读写,全双工的数据操作提高数据的吞吐效率。

(5)更好的兼容性:

正如上文所说我们在SAS接口卡上安装SATA设备也是可以正常工作的,这样就让我们的存储系统应用更加灵活,可以根据实际需求选择SAS磁盘或者SATA磁盘,降低了成本的同时也保证了性能。对于对数据读取速度要求不高的地方可以使用SATA设备替代SAS设备。

总的来说SAS技术是结合了SATA与SCSI两者的优点而诞生的,同时串行SCSI(SAS)是点到点的结构,因此除了提高性能之外,每个设备连接到指定的数据通路上提高了带宽,从而为数据传输与存取提供了必要保障。

开源SIP服务器OpenSIPS简介

一:OpenSIPS简介

OpenSIPS是一个成熟的开源SIP服务器,除了提供基本的SIP代理及SIP路由功能外,还提供了一些应用级的功能。OpenSIPS的结构非常灵活,其核心路由功能完全通过脚本来实现,可灵活定制各种路由策略,可灵活应用于语音、视频通信、IM以及Presence等多种应用。同时OpenSIPS性能上是目前*快的SIP服务器之一,可用于电信级产品构建。凭借其可扩展、模块化的系统架构,OpenSIPS提供了一个高度灵活的、用户可配置的路由引擎,可以为voice、video、IM和 presence等服务提供强大高效的路由、鉴权、NAT、网关协议转化等功能。由于其稳定高效等特点,OpenSIPS已经被诸多电信运营商应用在自己的网络体系中。其 主要功能如下:

SIP注册服务器/代理服务器(lcr、dynamic routing、dialplan)/重定向服务器
SIP presence agent
SIP B2BUA
SIP IM Server
SIP to SMS/XMPP网关
SIP to XMPP网关
SIP 负载均衡
SIP NAT traversal
二:OpenSIPS开源官网

OpenSIPS开源官网,如下图所示:

%title插图%num

OpenSIPS开源网址:http://www.opensips.org/

 

三:OpenSIPS系统架构

OpenSIPS的架构开放灵活,其核心功能控制均可通过脚本控制实现,各个功能也通过模块加载的方式来构建。采用lex和yacc工具构建的配置文件分析器是其架构设计中的重要部分之一。通过这个分析器,opensips设计了自己的语法规则,使得我们可以适合SIP规范的语言来进行配置文件中的脚本编写,从而达到简化程序以及方便代码阅读的目的。同时这样的设计也使opensips.cfg配置文件的执行速度达到了C语言的级别。其体系结构大体如下图:

%title插图%num

OpenSIPS框架的*上层是用于实现sip消息路由逻辑的opensips.cfg脚本配置,在配置文件中,可以使用Core提供的Parameter和Function,也可以使用众多Modules提供的Function。比如在之前的负载均衡示例中,is_method(“INVITE”)就属于textops模块提供的功能,src_ip和src_port都属于Core提供的参数。下层,提供了网络传输、sip消息解析等基本功能。在左侧,通过相应的数据库适配器,可是使用多种数据库存取数据。在这样的体系结构下,我们就可以方便地通过增加功能module来添加我们需要的功能,而不会对原有系统造成影响。除了以上所述的OpenSIPS的优点,OpenSIPS还提供了一系列的管理维护命令的接口。我们可以通过Core和Module提供的MI管理接口,方便的监控系统以及模块的状态。比如,通过Core的fifo ps命令,可以获取当前进程的状态;通过Core的fifo get_statistics命令,可以获得当前共享内存以及各进程私有内存的使用情况等等。通过MI管理接口,我们还可以方便地在运行时修改部分参数,比如,对于load_balancer模块,我们可以通过fifo lb_reload命令,更新目标组的配置信息,可以通过fifo lb_status命令激活或关闭某个目标,这些命令在实际应用中都非常实用。

搭建sip服务器方法

在基于sip协议进行voip通话时,首先需要搭建sip服务器,本文以ubuntu 14.04平台为例进行说明搭建sip服务器的过程:

1.首先安装如下软件

apt-get install perl libdbi-perl libdbd-MySQL-perl libdbd-pg-perl libfrontier-rpc-perl libterm-readline-gnu-perl libberkeleydb-perl

2.打开网址http://opensips.org/pub/opensips/下载*新的稳定版本,我选择的是2.2.0.下载完之后,需要解压.

tar zxf opensips-2.2.0_src.tar.gz

3. 如果需要修改程序的安装路径等其它信息,可以进入到解压文件夹的根目录后,执行make menuconfig,会显示菜单配置界面,
%title插图%num

我修改了安装路径为/home/xqzhan/opensis/。

4.执行make && make install。

5.修改安装目录下的etc/opensips/opensips.cfg文件:

我对应修改的是/home/xqzhan/opensis/etc/opensips/opensips.cfg

将listen=udp:127.0.0.1:5060   # CUSTOMIZE ME

修改为:listen=udp:10.0.149.240:5060   #这里的的ip就是你需要作为sip服务器的ip,也就是你当前本机ip。

6.进入到安装目录下的sbin/,我的目录为/home/xqzhan/opensip/sbin,执行

sudo ./opensipsctl start

如果后面修改了服务器的配置,需要重启opensipsctl进程,可以执行

sudo ./opensipsctl restart

不需要在服务器上去添加新用户,在客户端就可以直接注册用户了。使用sudo opensipsctl ul show可以查看注册用户的情况。

例如,我在客户端注册一个用户,在服务器上可以看到注册用户信息如下:

xqzhan@xqzhan-Lenovo-Product:~/opensip/sbin$ sudo ./opensipsctl ul show
[sudo] password for xqzhan:
Domain:: location table=512 records=2
AOR:: 111ttt
Contact:: sip:111ttt@10.0.251.6:36977;transport=udp Q=
Expires:: 2337
Callid:: 413c194228499f172cb44414a439482d@10.0.251.6
Cseq:: 8575
User-agent:: SIPAUA/0.1.001
State:: CS_NEW
Flags:: 0
Cflag:: 0
Socket:: udp:10.0.149.240:5060
Methods:: 4294967295
从上面信息可以看出,对应的注册用户名为111ttt,注册用户的客户端ip为10.0.251.6,使用的端口号为36977,采用udp协议传输数据.

另外,在ubuntu软件中心中,搜索sip可以找到一个twinkle软件,它是一个图形界面程序,可进行sip拨号测试.

海康sip服务器是什么意思_sip协议端口有什么作用?sip端口号详解

sip协议端口有什么作用?sip端口号详解

sip协议端口有什么作用?sip协议端口一般用来生成、修改和终结一个或多个参与者之间的会话.这些会话包括因特网多媒体会议,因特网(或任何IP网络)电话呼叫和多媒体发布.会话中的成员能够通过多播或单播联系的网络来通信.

sip协议端口的功能实体及工作流程

sip协议端口采用C\S模式,利用消息机制建立并管理会话.按逻辑功能,SIP系统可分为四大功能实体:SIP用户代理、SIP代理服务器、SIP重定向服务器和SIP注册服务器,它们共同构成了sip协议端口的基本模型.

sip协议端口用户代理(SIP UA):又称为SIP终端,是SIP系统中的*终用户,在RFC3261中将它们定义为一个应用.根据它们在会话中扮演的角色的不同,又可分为用户代理客户机(UAC)和用户代理服务器(UAS)两种.其中前者用于发起呼叫请求,后者用于当接到SIP请求时联系用户,并代表用户返回响应.

sip协议端口代理服务器(SIP Proxy Server):是一个中间元素,它既是一个客户机又是一个服务器,能够代理前面的用户向下一跳服务器发出呼叫请求.SIP代理服务器除了路由能力外,也可以集成防火墙、radius(AAA)等功能.

sip协议端口重定向服务器(SIP Redirect Server):是一个规划SIP呼叫路径的服务器,在获得了下一跳的地址后,立刻告诉前面的用户,让该用户直接向下一跳地址发出请求而自己则退出对这个呼叫的控制.

sip协议端口注册服务器(SIP Register Server):用来完成对UAS的登录,在SIP系统的网元中,所有UAS都要在某个登录服务器中登录,以便UAC通过服务器能找到它们.注册服务并不做请求的身份认证的判定.在SIP中授权和认证可以通过建立在基于请求/应答的模式上的上下文相关的请求来实现,也可以使用更底层的方式来实现.

sip协议端口*底层是语法和编码.它的编码使用增强Backus-Nayr形式语法(BNF)来规定.用于发起会话,可以用来建立、修改以及终结多个参与者参加的多媒体会话进程.参与会话的成员可以通过组播方式、单播连网或者两者结合的形式进行通信.为提供多媒体业务,还需要结合不同的标准和协议,如需要RTP确保媒体传输,RSVP确保语音质量,RADIUS鉴权用户等.

SIP重定向服务器设计

如何利用OpenSIPs快速搭建一个重定向服务器
利用OpenSIPs自带的脚本处理可以实现重定向服务器,例如通过脚本接口函数调用进行,但是在大多数
重定向服务器开发通常需自行编码实现,本文介绍通过:sl模块+mysql实现的一种重定向服务器方式。
实现如下:
1.在sl模块中增加db_mysql模块的加载处理,并在脚本中增加db_mysql.so的load;
2.当有新的呼叫或查询报文,在调用w_sl_send_reply处将从mysql localtion表中加载的AOR对应信息
存放在已经定义的类对象或结构体中,以便传入至w_sl_send_reply函数;
3.修改sl模块导出的sl_send_reply函数:在sl模块中定义了
{“sl_send_reply”, (cmd_function)w_sl_send_reply, 2, fixup_sl_send_reply, 0,
REQUEST_ROUTE | ERROR_ROUTE }
此时修改w_sl_send_reply函数使其能够兼容发送响应报文中,在msg_translator.c函数中有构造响应
报文的处理,可在对应增加contact字段,并将重定向结果通过contact字段携带给业务发起端。

%title插图%num

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速