最近因为在实习,白天没有时间,所以就拖到晚上写,不过昨晚实在太困了,所以就今天把昨天的补上,各位抱歉。首先来四道经典面试题,嘿嘿,做死人不偿命,看你如何接招。
9.在Javascript中什么是伪数组?如何将伪数组转化为标准数组?
伪数组。顾名思义,她就是伪装的数组,不是真正的数组,她就是一个对象,不过是具有了leng这个属性而已,而且可以通过索引取到她的值。比如:
var guiseArr={
'0':"AAA",
'1':"BBB",
'2':"CCC",
length:3
}
她虽然是个对象,但是也拥有数组的length方法,也可以通过索引去到里面的值,但是没有数组的其他方法,push,pop等等。我觉得他存在的意义就是让对象可以通过转换成数组,然后就可以使用数组的方法了,这样就非常简便。用的最多的应该就是arguments和Nodelist了,还有jQuery中。
伪数组转换成数组。
//假设arr是伪数组
//第一种方法,使用slice
Array.prototype.slice.call(arr,0);
//第二种方法,直接使用for循环
var newArr=[];
for(var i=0;i<arr.length;i++){
newArr=arr[i];
}
//第三种方法,使用ES6的Array.from()
var newArr=Array.from(arr);
10.浏览器本地存储
- cookie(小甜饼)
cookie应该是具有悠久的历史了,算是本地存储的老大姐了,不知道为啥叫小甜饼,可能以前对于网站的用途太大了,因为http是无状态的,所以发送请求时无法标识是哪个用户发送的请求,而cookie的出现就成功的解决了这个问题。不过她也有一些缺陷,比如存储大小在每个域名下的数量有限制,存储容量也有限制,大概4095k,不同浏览器不同的规格,而且每次会随着http请求发送到服务端。 - localstorage
这个是HTML出来的新的API,她的出现简直就是解放了cookie的一部分工作啊,他可以在本地进行存储,而且容量比较大,大概5M,下面是一些常用的方法。
//存储
localStorage.setItem(key,value);
//获取
localStorage.getItem(key);
//删除
localStorage.removeItem(key);
sessionStorage
这个和localStorage类似,但是生命周期不同,一旦你关闭了页面,这个存储的数据就不在了,一直没用过这个,不知道效果怎么样。
三者的比较如下图所示:
11.线程与进程的区别?
调度。进程是拥有资源的基本单位,线程是独立调度的基本单位。同一进程中线程切换不会引起进程切换,不同进程中线程切换会引起进程切换。
拥有资源。线程不拥有系统资源,也有一点必不可少的资源,但是线程可以访问进程的系统资源。
并发性。不仅进程之间可以并发执行,而且同一进程内的多个线程之间也可以并发执行。使得操作系统具有更好的并发性。
系统开销。创建进程和撤销进程时,系统都要为其分配资源和回收资源,操作系统付出的开销比较大。而线程切换时,只需保存和设置少量寄存器内容,因此开销很小,由于同一个进程内的多个线程共享进程的地址空间,因此多线程的同步和通信非常容易实现。
12.请说出三种减少页面加载时间的方法。
- 压缩JS,CSS代码,把CSS放在顶部,把JS放在底部,最好把CSS和JS放到外部文件。
- 合并图片,做成雪碧图。
- 标明图片的宽度及高度。
- 使用CDN(Content Delivery Network)网络加速
- 服务器启用gzip压缩功能
- 使用多域名负载网页内的多个文件、图片
重复的HTTP请求数量应尽量减少
【两道思考题】
5.在链接中应该使用诸如“Click here” 一类的笼统词汇吗?
我觉得需要符合Web的语义化,链接的文字就应该是描述这个链接的,而不是“Click here”这一类的。
6.链接是否应该在新窗口打开?
我觉得如果是跳转到别的站点的链接,就应该在新窗口打开,如果是网站本身的页面,就可以直接采用跳转的形式。
【两道编程题】
7. 找出数组 arr 中重复出现过的元素
function duplicates(arr){
var hashArr={};
var result=[];
for(var i=0;i<arr.length;i++){
if(hashArr[arr[i]]){
if(hashArr[arr[i]]==1) {
result.push(arr[i]);
}
hashArr[arr[i]]+=1;
}else{
hashArr[arr[i]]=1;
}
}
return result;
}
8.时间格式化输出
/**
按所给的时间格式输出指定的时间
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
示例1
输入
new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w'
输出
2014-09-05 13:14:20 星期五
**/
//这道题是我最弱的一个点,我自己看得都想吐,估计正则的方法更好,不过我确实不擅长,慢慢补正则去了。
function dateTrans(oDate,sFormation){
var year=oDate.getFullYear()+'',
month=(oDate.getMonth()+1)+'',
date=oDate.getDate()+'',
hour=oDate.getHours()+'',
minute=oDate.getMinutes()+'',
second=oDate.getSeconds()+'',
day=oDate.getDay(),
week=['一','二','三','四','五','六','日'];
sFormation=sFormation.replace('yyyy',year);
sFormation=sFormation.replace('yy',year.substring(2));
sFormation=sFormation.replace('MM',month.length==2?month:'0'+month);
sFormation=sFormation.replace('M',month);
sFormation=sFormation.replace('dd',date.length==2?date:'0'+date);
sFormation=sFormation.replace('d',date);
sFormation=sFormation.replace('HH',hour.length==2?hour:'0'+hour);
sFormation=sFormation.replace('H',hour);
sFormation=sFormation.replace('hh',(parseInt(hour)-12)<10?'0'+(parseInt(hour)-12):(parseInt(hour)-12));
sFormation=sFormation.replace('h',(parseInt(hour)-12));
sFormation=sFormation.replace('mm',minute.length==2?minute:'0'+minute);
sFormation=sFormation.replace('mm',minute);
sFormation=sFormation.replace('ss',second.length==2?second:'0'+second);
sFormation=sFormation.replace('ss',second);
sFormation=sFormation.replace('w',day==0?week[6]:week[day-1]);
return sFormation;
}
9. 斐波那契数列
//用一种非递归的写法来
function fibonacci(n) {
if(n<3){
return 1;
}else{
var first=1,
second=1,
result=0;
for(var i=2;i<=n;i++){
result=first+second;
first=second;
second=result;
}
return result;
}
}
手累~~坚持~!!!!!