Web前端5道面试题

JavaScript05

Web前端5道面试题,第1张

1.请说明ECMAScript,JavaScript,Jscript之间的关系?

ECMAScript提供脚本语言必须遵守的规则、

细节和准则,是脚本语言的规范。

比如:ES5,ES6就是具体的一js版本。

JavaScript是ECMAScript的一个分支版本,

JavaScript实现了多数ECMA-262中

描述的ECMAScript规范,但存在少数差异。

JScript是微软公司对ECMA-262语言规范的

一种实现,除了少数例外(这是为了保持向后兼容),

微软公司宣称JScript完全实现了ECMA标准.

关系:

JavaScript和JScript都是ECMAScript的版本分支,

二者在语法上没有多大的区别

只不过一个是NetScape公司的,一个是微软的

IE系列默认是JScript,其它的则反之用JavaScript。

2.页面加载过程中可能触发哪些事件?它们的顺序是?

页面加载时,大致可以分为以下几个步骤:1)开始解析HTML文档结构2)加载外部样式表及JavaScript脚本3)解析执行JavaScript脚本4)DOM树渲染完成5)加载未完成的外部资源6)页面加载成功

执行顺序:1)documentreadystatechange事件2)documentDOMContentLoaded事件3)windowload事件

3.函数中在声明变量a前使用a会产生错误吗?为什么?

不会,JS中能够进行变量作用域提升,

把所有变量、函数的声明提升到当前

作用域的最前面,但不进行赋值操作

所以可能造成获取的值是undefined。

4.什么是hash,以及hashchange事件?

先了解下什么是hash:hash即URL中"#"字符后面的部分。

a)使用浏览器访问网页时,

如果网页URL中带有hash,

页面就会定位到id(或name)

与hash值一样的元素的位置

b)hash还有另一个特点,

它的改变不会导致页面重新加载

c)hash值浏览器是不会随请求发送到服务器端的

d)通过window.location.hash属性获取和设置hash值。

window.location.hash值的变化会直接

反应到浏览器地址栏(#后面的部分会发生变化),同时,浏览器地址栏hash值的变化也会触发

window.location.hash值的变化,

从而触发onhashchange事件。

再来了解下什么是hashchange事件:

a)当URL的片段标识符更改时,

将触发hashchange事件(跟在#符号后面的URL部分,包括#符号)b)

hashchange事件触发时,

事件对象会有hash改变前的URL(oldURL)和hash改变后的URL(newURL)两个属性。

5.什么是CDN,CDN对于网站有什么意义,它有什么样的缺点?

CDN又称为内容分发网络本意在于

尽可能避开互联网上有可能影响数据

传输速度和稳定性的瓶颈和环节,

使内容传输的更快、更稳定。

主要目的:

解决因分布、带宽、服务器性能带来的访问延迟问题,

适用于站点加速、点播、直播等场景。

使用户可就近取得所需内容,解决Internet网络拥挤的状况,

提高用户访问网站的响应速度和成功率。

缺点:

a)实施复杂,投资大

b)目前大部分的CDN还只是对静态内容加速,

对动态加速效果不好

而双线对动态加速的效果跟静态是一样的。

今天小编要跟大家分享的文章是关于2020年Web前端面试题汇总。由于内容较多小编分开为大家介绍,今天首先来和小编一起看一看第一部分的内容,希望这些面试题能够对正准备找Web前端相关工作的小伙伴们有所帮助。

1.说几条写JavaScript的基本规范?

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

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

3)使用对象字面量替代newObject这种形式

4)减少使用全局函数,全局变量

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

6)if语句必须使用大括号

7)for-in循环中的变量

应该使用var关键字明确限定作用域

从而避免作用域全局污染。

2.说说平衡二叉树?

平衡二叉搜索树(Self-balancingbinarysearchtree)

又被称为AVL树。

具有以下性质:

1)它是一棵空树或它的左右两个子树

的高度差的绝对值不超过1,

并且左右两个子树都是一棵平衡二叉树。

2)平衡二叉树必定是二叉搜索树,反之则不一定。

3)平衡二叉树的常用实现方法有红黑树、AVL、

替罪羊树、Treap、伸展树等。

最小二叉平衡树的节点的公式如下:

F(n)=F(n-1)+F(n-2)+1备注:1是根节点,

F(n-1)是左子树的节点数量,

F(n-2)是右子树的节点数量。

3.清除浮动和解决垂直外边距重叠的解决方案?

问题描述:

1)父元素没有设置宽高,尺寸由子元素撑起

子元素一旦浮动,父元素高度会发生塌陷。

2)子元素设置margin-top会作用的父元素的margin-top

此时会造成垂直外边距重叠。

.clearfix::after,.clearfix::before{

content:''

display:table

clear:both

}

4.sessionStorage、localStorage和cookie?

相同点:

都用于浏览器端存储的缓存数据

不同点:

1)存储内容是否发送到服务器端

当设置了Cookie后,数据会发送到服务器端,

造成一定的宽带浪费xxxstorage则会将数据保存

到本地,不会造成宽带浪费

2)数据存储大小不同

Cookie数据不能超过4K,适用于会话标识

xxxstorage数据存储可以达到5M

3)数据存储的有效期限不同

cookie只在设置了Cookid过期时间

之前一直有效,即使关闭窗口或者浏览器

sessionStorage,仅在关闭浏览器之前有效

localStorage,数据存储永久有效

4)作用域不同

cookie和localStorage是在同源同窗口中

都是共享的

sessionStorage不在不同的浏览器窗口

中共享,即使是同一个页面

5.判断一个单词是否是回文?

回文是指把相同的词汇或句子,

在下文中调换位置或颠倒过来,

产生首尾回环的情景,

叫做回文,也叫回环。

比如cacac,redivider。

letcheckPalindrom=(str)=>{

returnstr===

str.split('').reverse().join('')

}

6.不借助临时变量,进行两个整数的交换?

输入a=3,b=1,

输出a=1,b=3

letswap=(a,b)=>{

b=b-a

a=a+b

b=a-b

return[a,b]

}

7.请写出至少5个html5新增的标签,并说明其语义和应用场景?

section:定义文档中的一个章节

nav:定义只包含导航链接的章节

header:定义页面或章节的头部

它经常包含logo、页面标题和导航性的目录。

footer:定义页面或章节的尾部

它经常包含版权信息、法律信息链接和反馈建议用的地址。

aside:定义和页面内容关联度较低的内容,

如果被删除,剩下的内容仍然很合理。

8.get和post请求在缓存方面的区别?

get请求类似于查找的过程,用户获取数据,

可以不用每次都与数据库连接,所以可以使用缓存。

post不同,post做的一般是修改和删除的工作,

所以必须与数据库交互,所以不能使用缓存。

因此get请求适合于请求缓存。

9.如何解决异步回调地狱?

promise、generator、async/await

10.图片的懒加载和预加载?

预加载:提前加载图片,

当用户需要查看时可直接

从本地缓存中渲染。

懒加载:懒加载的主要目的

是作为服务器前端的优化,

减少请求数或延迟请求数。

两种技术的本质:

两者的行为是相反的,

一个是提前加载,

一个是迟缓甚至不加载。

懒加载对服务器前端有一定

的缓解压力作用,

预加载则会增加服务器前端压力。

11.bind,apply,call的区别?

通过apply和call改变函数的this指向,

这两个函数的第一个参数都是一样的,

表示要改变指向的那个对象,

第二个参数,apply是数组,

而call则是arg1,arg2...这种形式。

通过bind改变this作用域

会返回一个新的函数,

这个函数不会马上执行。

12.js怎么控制一次加载一张图片,加载完后再加载下一张?

方法一:

varobj=newImage()

obj.src="#/21.jpg"

obj.onload=function(){

document.getElementById("pic")

.innnerHTML=""

}

加载中

方法二:

varobj=newImage()

obj.src="#/21.jpg"

obj.onreadystatechange=function(){

if(this.readyState=="complete"){

document.getElementById("pic")

.innnerHTML=""

}

}

加载中

以上就是小编今天为大家分享的关于2020年Web前端面试题汇总的文章,希望本篇文章能够对想要参加web前端面试的小伙伴们有所帮助,想要了解更多Web前端相关知识记得关注北大青鸟Web培训官网。最后祝愿小伙伴们面试成功,成为一名优秀的Web前端工程师。

JavaScript面试题:字符串处理

在应聘前端程序员时,在笔试部分经常会考到字符串处理的问题。这些题有一个特点,站在考官的角度去考虑,它考的不是你会不会,而是你能不能在不借用XX手册或者XX指南再或者百度谷歌的情况下,用比较简洁的方式写出答案来。就具体的字符串处理问题,郑州尚学堂给大家分享一下。

1、字符串转换

字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种:

var num= 19// 19

var myStr = num.toString()// "19"

你同样可以这么做:

var num= 19// 19

var myStr = String(num)// "19"

或者,再简单点儿:

var num= 19// 19

var myStr = "" +num// "19"

2、字符串分割

字符串分割,即将一个字符串分割为多个字符串,JavaScript中给我们提供了一个非常方便的函数,如:

var myStr = "I,Love,You,Do,you,love,me"

var substrArray = myStr .split(",")// ["I", "Love", "You", "Do", "you", "love", "me"]

var arrayLimited = myStr .split(",", 3)// ["I", "Love", "You"]

split()的第二个参数,表示返回的字符串数组的最大长度。

3、获取字符串长度

字符串长度是在开发中经常要用到的,非常简单如下:

var myStr = "I,Love,You,Do,you,love,me"

var myStrLength = myStr.length//25

4、查询子字符串

很多人都会忘记这几个JavaScript的自带的方法,或者忘记它们的具体用法,从而导致在做题的时候不得不嵌套for循环来做。

第一个函数:indexOf(),它从字符串的开头开始查找,找到返回对应坐标,找不到返回-1,如下:

var myStr = "I,Love,you,Do,you,love,me"

var index = myStr.indexOf("you")// 7 ,基于0开始,找不到返回-1

第二个函数:lastIndexOf(),它从字符串的末尾开始查找,找到返回对应坐标,找不到返回-1,如下:

var myStr = "I,Love,you,Do,you,love,me"

var index = myStr.lastIndexOf("you")// 14

以上两个函数同样接收第二个可选的参数,表示开始查找的位置。

5、字符串替换

单单查到字符串应该还不会停止,一般题目都还经常会遇到让你查到并替换为你自己的字符串,例如:

var myStr = "I,love,you,Do,you,love,me"

var replacedStr = myStr.replace("love","hate")//"I,hate,you,Do,you,love,me"

默认只替换第一次查找到的,想要全局替换,需要置上正则全局标识,如:

var myStr = "I,love,you,Do,you,love,me"

var replacedStr = myStr.replace(/love/g,"hate")//"I,hate,you,Do,you,hate,me"

6、查找给定位置的字符或其字符编码值

想要查找给定位置的字符,你可以使用如下函数:

var myStr = "I,love,you,Do,you,love,me"

var theChar = myStr.charAt(8)// "o",同样从0开始

同样,它的一个兄弟函数就是查找对应位置的字符编码值,如:

var myStr = "I,love,you,Do,you,love,me"

var theChar = myStr.charCodeAt(8)//111

7、字符串连接

字符串连接操作可以简单到用一个加法运算符搞定,如:

var str1 = "I,love,you!"

var str2 = "Do,you,love,me?"

var str = str1 + str2 + "Yes!"//"I,love,you!Do,you,love,me?Yes!"

同样,JavaScript也自带了相关的函数,如:

var str1 = "I,love,you!"

var str2 = "Do,you,love,me?"

var str = str1.concat(str2)//"I,love,you!Do,you,love,me?"

其中concat()函数可以有多个参数,传递多个字符串,拼接多个字符串。

8、字符串切割和提取

有三种可以从字符串中抽取和切割的方法,如:

第一种,使用slice():

var myStr = "I,love,you,Do,you,love,me"

var subStr = myStr.slice(1,5)//",lov"

第二种,使用substring():

var myStr = "I,love,you,Do,you,love,me"

var subStr = myStr.substring(1,5)//",lov"

第三种,使用substr():

var myStr = "I,love,you,Do,you,love,me"

var subStr = myStr.substr(1,5)//",love"

与第一种和第二种不同的是,substr()第二个参数代表截取的字符串最大长度,如上结果所示。

9、字符串大小写转换

常用的转换为大写或者小写字符串函数,如下:

var myStr = "I,love,you,Do,you,love,me"

var lowCaseStr = myStr.toLowerCase()//"i,love,you,do,you,love,me"

var upCaseStr = myStr.toUpperCase()//"I,LOVE,YOU,DO,YOU,LOVE,ME"

10、字符串匹配

字符串匹配可能需要你对正则表达式有一定的了解,先来看看match()函数:

var myStr = "I,love,you,Do,you,love,me"

var pattern = /love/

var result = myStr.match(pattern)//["love"]

console.log(result .index)//2

console.log(result.input )//I,love,you,Do,you,love,me

如你所见,match()函数在字符串上调用,并且接受一个正则的参数。来看看第二个例子,使用exec()函数:

var myStr = "I,love,you,Do,you,love,me"

var pattern = /love/