腾讯前端求职训练营第三天

最近因为在实习,白天没有时间,所以就拖到晚上写,不过昨晚实在太困了,所以就今天把昨天的补上,各位抱歉。首先来四道经典面试题,嘿嘿,做死人不偿命,看你如何接招。
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.浏览器本地存储

  1. cookie(小甜饼)
    cookie应该是具有悠久的历史了,算是本地存储的老大姐了,不知道为啥叫小甜饼,可能以前对于网站的用途太大了,因为http是无状态的,所以发送请求时无法标识是哪个用户发送的请求,而cookie的出现就成功的解决了这个问题。不过她也有一些缺陷,比如存储大小在每个域名下的数量有限制,存储容量也有限制,大概4095k,不同浏览器不同的规格,而且每次会随着http请求发送到服务端。
  2. 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;
    }
}

手累~~坚持~!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值