前端程序员面试分类真题13_第1页
前端程序员面试分类真题13_第2页
前端程序员面试分类真题13_第3页
前端程序员面试分类真题13_第4页
前端程序员面试分类真题13_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前端程序员面试分类真题13简答题1.

请用多种方式获取当前时间的毫秒数。正确答案:有4种方式获取当前毫秒数。其中3种方式要先创建Date对象,然后再使用一元加法运算符、getTime()或valu(江南博哥)eOf()才能得到当前毫秒数,另一种是用Date对象的静态方法now()获取当前时间的毫秒数,具体代码如下所示。

vardate=newDate();

+date;

date.getTime();

date.valueOf();

Date.now();[考点]日期和正则表达式

2.

在网页中实现倒计时,能够动态显示“××天××时××分××秒”。正确答案:先将两个日期对象相减,得到时间间隔的毫秒数;再将毫秒数换算成天、时、分和秒:然后把得到的结果赋给文档中的一个元素,作为它的内容显示;最后用定时器循环执行前面的两步,就能实现倒计时,具体如下所示。

<divid="date"></div>

<script>

varend=newDate("2020-3-1200:00");

//截止日期

functioncountdown(){

varnow=newDate();

varday,hour,minute,second,str,

remainder=end-now;

if(remainder<0){

return;

}

day=Math.floor(remainder/1000/60/60/24);

//天数

hour=Math.floor(remainder/1000/60/60%24);

//小时

minute=Math.floor(remainder/1000/60%60);

//分钟

second=Math.floor(remainder/1000%60);

//秒数

str=day+"天"+hour+"时"+minute+"分"+second+"秒";

document.getElementById("date").innerHTML=str;

setTimeout(countdown,1000);

}

countdown();

</script>[考点]日期和正则表达式

3.

如何判断某一年是闰年?正确答案:因为闰年的二月份有29天,所以只要获得这一年二月份的天数就能判断是否是闰年。在构造函数Date()中,把月份设为3月,也就是2,天数设为0,就能得到上个月的最后一天,代码如下所示。

functionisLeapYear(year){

returnnewDate(year,2,0).getDate()==29;

}[考点]日期和正则表达式

4.

如何计算两个日期相隔的天数?正确答案:两个Date对象相减可以得到日期之间的毫秒数,算出毫秒后,再换算成天,1天有24小时,1小时有60分钟,1分钟有60秒,1秒有1000毫秒,代码如下所示。

functiondateInterval(start,end){

vardiff=Math.abs(start-end),

//取绝对值

days=Math.ceil(diff/1000/60/60/24);

//向上取整

returndays;

}[考点]日期和正则表达式

5.

请编写一个格式化字符串的函数,例如传入“我的名字叫{0}”和“strick”,返回“我的名字叫strick”。正确答案:这个格式化字符串的函数包含2个参数,第一个参数是需要格式化的字符串,第二个参数是一个数组,数组的元素可替换对应的占位符。由于构造函数RegExp()能动态创建正则表达式,因此可方便地实现替换逻辑,具体如下所示。

functionstrFormat(format,args){

if(arguments.length<2){

returnformat;

}

for(varkeyinargs){

varvalue=args[key];

if(undefined!=value){

format=format.replace(newRegExp("\\{"+key+"\\}","gm"),value);

}

}

returnformat;

}[考点]日期和正则表达式

6.

用JavaScript封装一个函数,可实现整数的千分位逗号分隔符(不用考虑小数),例如12345用12,345表示。正确答案:先将整数转换为字符串,再用replace()方法为其添加千分位逗号分隔符,具体如下所示。

functionthousandBitSeparator(num){

returnnum.toString().replace(/(\d)(?=(\d{3})+$)/g,function(match){

returnmatch+",";

});

}

在上面的代码中,正则表达式首先捕获一个数字,再用零宽正向先行断言(?=)自定义匹配条件,匹配的条件是当前数字之后的数字个数是3的倍数。注意,正则表达式中的元字符“$”不能省略,并且零宽断言中匹配到的内容不会被捕获。[考点]日期和正则表达式

7.

编写一个函数,用于清除字符串前后的空格。正确答案:使用String对象的replace()方法,再借助正则表达式来去除字符串前后的空格,代码如下所示。

functiontrim(str){

returnstr.replace(/^\s+|\s+$/g,"");

}

在上面的正则表达式中,元字符“^”匹配行的开始,元字符“$”匹配行的结束;字符类“\s”表示空格;竖线(|)表示子表达式之间“或”的关系;标志字符串“g”表示全局模式匹配,可找到文本中的所有匹配,而不是只匹配第一个。[考点]日期和正则表达式

8.

如何将字符串“get-element-by-id”转化成驼峰表示法的“getElementById”?正确答案:可以使用String对象中的replace()方法执行字符替换,replace()的第二个参数可以定义为一个回调函数,该函数的参数如下表所列。回调函数的参数参数描述match匹配的文本p1、p2...pn分组中匹配的文本,即捕获的文本,p1表示第一个index匹配的文本在原字符串中的索引input被检索的字符串

下面利用这个回调函数,在函数中将连接符和字符的组合(如“-e”、“-b”等)替换为一个大写字符(如“E”、“B”等),如下所示。

varstr="get-element-by-id";

str.replace(/-([a-z])/g,function(match,p1,index,input){

returnp1.toUpperCase();

});[考点]日期和正则表达式

9.

用数组方法把下面数组中的元素加起来,并把得到的和赋给result变量。

vararr=[1,2,3,4,5],result;正确答案:可以使用缩减数组的reduce()方法,这个方法会将数组计算成一个值。此方法接收两个参数,第一个参数是回调函数,第二个参数是初始值(可选),如果没有设置,那么默认会将数组中的第一个元素作为初始值。回调函数有4个参数:累积值、当前元素、当前元素的索引和原始数组。具体实现如以下代码所示。

result=arr.reduce(function(accumulator,current,index,array){

returnaccumulator+current;

});[考点]数组

10.

不用循环语句(for、while等)来创建一个长度为50的数组,每个元素的值等于它的索引。正确答案:先声明一个长度为51的空数组,然后用1把数组衔接为字符串,再将字符串分割为数组,数组中每个元素的值都为字符串“1”,最后用数组的map()方法迭代每个元素,把元素的值改为它的索引,如下所示。

Array(51).join("1").split("").map(function(value,index){

returnindex;

});[考点]数组

11.

设计一个函数来补全整数的前置0,例如为3补全两个前置0,得到的结果为“003”。正确答案:设计的函数有两个参数,第一个参数是待补全的整数,第二个参数是指定的位数,例如补全4位的整数,如果传入1,那么返回“0001”;如果传入123,那么返回“0123”。在函数中,首先创建一个指定长度的空数组,然后将空数组用“0”合并,接着和传入的整数拼接,最后调用String对象的slice()方法,并传入一个负数,用于去除多余的零,具体代码如下所示。

functionprefixZero(integer,digit){

return(newArray(digit).join("0")+integer),slice(-digit);

}[考点]数组

12.

有一个数组,其值为[1,[2,[3,4,2],2],5,[6]],如何才能输出[1,2,3,4,2,2,5,6]?正确答案:利用数组的toString()方法可将数组转换为用逗号衔接的字符串,再用split()方法把字符串用逗号分隔成数组,最后用map()方法把新数组内的每个元素转换成数字,具体实现如下所示。

vararr=[1,[2,[3,4,2],2],5,[6]];

varresult=arr.toString().split(",")

.map(function(value,index,array){

return+value;

});[考点]数组

13.

split()方法与join()方法有哪些区别?正确答案:首先,两者所属的对象不同,split()方法属于String和RegExp对象,而join()方法属于Array对象;其次,两者的功能不同,split()方法能将字符串分割为数组,join()方法能将数组中的元素衔接成一个字符串。[考点]数组

14.

用JavaScript对下面数组进行降序排列,即根据a属性的值从大到小排列。

vararr=[{a:3},{a:2},{a:1},{a:5},{a:4}];正确答案:可以用数组的排序方法sort()实现,该方法能接收一个比较函数。比较函数有两个参数:x和y,也就是数组的两个元素,根据函数的返回值,改变这两个元素在数组中的位置,有如下3种移位规则:

(1)当返回值大于0时,x会被移到y的后面。

(2)当返回值等于0时,x和y的位置不改变。

(3)当返回值小于0时,x会被移到y的前面。

根据上面的规则,可以用下面的代码实现排序。还要注意一点,sort()方法会改变原始数组,所以不用再给arr重新赋值。

arr.sort(function(x,y){

returnx.a>y.a;

});[考点]数组

15.

实现一个isArray()函数,可判断传入的参数是否是数组。正确答案:ECMAScript5为Array对象添加了isArray()方法,专门用于检测对象是否是数组,但并不是所有浏览器都支持。对于那些比较旧的浏览器,需要借助基础对象Object的原型方法toString(),它能返回格式为“[objectType]”的字符串,其中Type是对象的类型,此方法能检测出的对象有Number、Array、Date、RegExp等。调用toString()方法的时候也要注意,不能直接使用,必须使用函数的方法call()或apply()间接调用,因为对象有可能重写了此方法。具体写法如下所示。

functionisArray(obj){

if(Array.isArray){

returnArray.isArray(obj);

}

vartoString=Ototype.toString;

returntoString.call(obj)==="[objectArray]";[考点]数组

16.

如何让数组中的元素能够随机排序?正确答案:要打乱数组内的元素,可以使用Fisher-Yates乱序算法,这是一种经典的洗牌算法。在现实生活中,如果要洗牌,那么最随机的做法就是从牌堆里随便抽一张出来,然后放在一边,之后再从剩下的牌里重复之前的操作,直到所有牌都被抽出来并放到了另一堆中。抽象到代码中,思路与之类似,只是操作细节略有不同。首先随机从数组中取出一个元素,然后把该元素插到最后面,同时把被换走的元素插到刚刚的随机位置。一轮过后,就只需在剩下的n-1个元素中再进行相同的操作,直至第一个,如下所示。

functionshuffle(arr){

varlength=arr.length,

temp,index;

for(vari=length-1;i>=0;i--){

index=Math.floor(Math.random()*i);//向下取整

temp=arr[index];

//取出随机元素

arr[index]=arr[i];

//将最后面的元素放到上步随机元素的位置

arr[i]=temp;

//将随机元素插到最后面

}

returnarr;

}[考点]数组

17.

下面是一个有序的数组,接下来用二分查找搜索某个值,判断它是否在数组中。

vararr=[1,2,3,4,5,6];正确答案:二分查找的前置条件是数组要有序,因为此处已满足这个条件,所以可以省去排序的操作。二分查找是将搜索值与中间位置的元素进行比较,然后以这个元素为分界点,把数组分成左右两部分。如果和当前中间位置的元素匹配,那么就结束查找,否则继续和左边或右边部分中间位置的元素进行比较,再把这部分子数组分成两半。就这样反复比较,反复缩小范围,直至结束。具体的写法如下所示。

functionbinarySearch(target,arr){

varstart=0,

//起始位置

end=arr.length-1,

//结束位置

middle,

element;

while(start<=end){

middle=Math.floor((start+end)/2);

//向下取整

element=arr[middle];

//中间位置的元素

if(target==element)

//目标元素匹配成功

returnmiddle;

elseif(target>element)

//在右边部分查找

start=middle+1;

else

//在左边部分查找

end=middle-1;

}

return-1;

}[考点]数组

18.

下面是一个带重复元素的数组,请将重复的元素只保留一个,多余的全部删除。

vararr=[1,5,4,5,2,6,6,"1"];正确答案:可以用一种空间换时间的方法。先创建一个空对象和空数组,然后遍历带重复元素的数组,把此数组的元素存为对象的属性,并判断对象是否已包含此属性。如果未包含,那么把当前元素插入到空数组中,否则跳过,具体如下所示。

functiondistinct(arr){

varobj={},

//空对象

result=[],

//空数组

length=arr.length;

arr.forEach(function(value,index){

if(!obj[value]){

obj[value]=true;

result.push(value);

}

});

returnresult;

}

在上面代码的if条件语句中,判断依据是对象是否包含指定的属性,当引用对象没有属性时,得到的值是undefined,执行逻辑非返回的结果是true。除此以外,还要注意一点,上面是通过方括号来读取和写入属性的值,而方括号内必须是一个计算结果为字符串的表达式,这就导致一个问题,如果传入一个数字1和一个字符串“1”,那么这两个会被认为是同一个值,有一个会被过滤掉。为了避免出现这个问题,可以在遍历的时候再加一次判断,如下所示。

arr.forEach(function(value,index){

if(!obj[valuel){

obj[value]=true;

result.push(value);

}elseif(result.indexOf(value)==-1){

result.push(value);

}

});[考点]数组

19.

找出下面数组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论