金山笔试JS开发工程湿

        呵呵,呵呵,呵呵呵,对于奔波五六个小时参加伟大金山的笔试,我只有用呵呵来总结自己了,唉,别的不说,笔试题型少,质量一般,还好我今天下午看到的,老子也跪了,吐槽完毕,还是来好好说这份笔试题还有附上偶的答案吧····

       题型一、简答

      1请给出异步加载js的方案思路,1种即可(bo猪我下午刚刚看到这个异步加载和同步加载的文章,却在笔射的时候,单膝跪下了)
      这里我就在整理一下js中异步加载和同步加载相关的问题吧
   1同步加载
   我们平时最常使用的就是这种同步加载形式: 
   <script src="http://yourdomain.com/script.js"></script> 
   同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执      行。 
    js 之所以要同步执行,是因为 js 中可能有输出 document 内容、修改dom、重定向等行为,所以默认同步执行才是安全的。 
   以前的一般建议是把<script>放在页面末尾</body>之前,这样尽可能减少这种阻塞行为,而先让页面展示出来。 
   简单说:加载的网络 timeline 是瀑布模型,而异步加载的 timeline 是并发模型。
  2. 常见异步加载(Script DOM Element)
 
(function() { 
var s = document.createElement('script'); 
s.type = 'text/javascript'; 
s.async = true; 
s.src = 'http://yourdomain.com/script.js'; 
var x = document.getElementsByTagName('script')[0]; 
x.parentNode.insertBefore(s, x); 
})(); 
异步加载又叫非阻塞,浏览器在下载执行 js 同时,还会继续进行后续页面的处理。 
这种方法是在页面中<script>标签内,用 js 创建一个 script 元素并插入到 document 中。这样就做到了非阻塞的下载 js 代码。 
async属性是HTML5中新增的异步支持,见后文解释,加上好(不加也不影响)。 
此方法被称为 Script DOM Element 法,不要求 js 同源。 
将js代码包裹在匿名函数中并立即执行的方式是为了保护变量名泄露到外部可见,这是很常见的方式,尤其是在 js 库中被普遍使用。 
例如 Google Analytics 和 Google+ Badge 都使用了这种异步加载代码: 
(function() { 
var ga = document.createElement('script'); 
ga.type = 'text/javascript'; ga.async = true; 
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 
})(); 

(function() 
{var po = document.createElement("script"); 
po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js"; 
var s = document.getElementsByTagName("script")[0]; 
s.parentNode.insertBefore(po, s); 
})(); 

但是,这种加载方式在加载执行完之前会阻止 onload 事件的触发,而现在很多页面的代码都在 onload 时还要执行额外的渲染工作等,所以还是会阻塞部分页面的初始化处理。

(function() { 
function async_load(){ 
var s = document.createElement('script'); 
s.type = 'text/javascript'; 
s.async = true; 
s.src = 'http://yourdomain.com/script.js'; 
var x = document.getElementsByTagName('script')[0]; 
x.parentNode.insertBefore(s, x); 
} 
if (window.attachEvent) 
window.attachEvent('onload', async_load); 
else 
window.addEventListener('load', async_load, false); 
})(); 

这和前面的方式差不多,但关键是它不是立即开始异步加载 js ,而是在 onload 时才开始异步加载。这样就解决了阻塞 onload 事件触发的问题。 
补充:DOMContentLoaded 与 OnLoad 事件 
DOMContentLoaded : 页面(document)已经解析完成,页面中的dom元素已经可用。但是页面中引用的图片、subframe可能还没有加载完。 
OnLoad:页面的所有资源都加载完毕(包括图片)。浏览器的载入进度在这时才停止。 
这两个时间点将页面加载的timeline分成了三个阶段。 
4.异步加载的其它方法 
由于Javascript的动态特性,还有很多异步加载方法: 
XHR Eval 
XHR Injection 
Script in Iframe 
Script Defer 
document.write Script Tag 
还有一种方法是用 setTimeout 延迟0秒 与 其它方法组合。 
XHR Eval :通过 ajax 获取js的内容,然后 eval 执行。 
var xhrObj = getXHRObject(); 
xhrObj.onreadystatechange = 
function() { 
if ( xhrObj.readyState != 4 ) return; 
eval(xhrObj.responseText); 
}; 
xhrObj.open('GET', 'A.js', true); 
xhrObj.send(''); 
(。。。。。还未完成,洗澡要紧。。。。。)
2.问var=a ;delete a;typeof a的结果(不解释)
3写出结果一下函数
 for(var d=0;d<3;d++){
setTimeout(function(){console.log(d);},100);
经过运行之后,老子发现,答案居然射三个3,干,这里我就来解射下为什么吧;
首先我们得知道console.log()这个是用于输出结果的,跟着setTimeout()函数,这个怎么说呢,它可以用于延时,在这道题中,延时为100ms,那么对于计算机的计算能力,100ms可以计算很多,那么这个循环早就在100ms以内结束了,这样的话,循环结束的条件d=3;而如果你看了我上篇javascript入门的话,你就知道了在js中函数是不能重载的,那意味着在延迟结束前,console.log(d)已经执行了三次,这意味这被重载了,那么后面的函数会覆盖掉前面的,那么最终循环三次的三次输出便均为3了;博主我学识浅薄,错了的话,麻烦各位指正了,请小喷哦TT

二、程序题
1.判断一个字符串中出现次数最多的字符,统计次数(博猪觉得我蠢得可以,居然用栈来做这个题,而且赶脚不知道对于错,就不放上来恶心大家了,下面偶直接百度的答案,暂时还没有时间去解释为什么这样做,因为偶要赶着去洗澡)
//将字符串的字符保存在一个hash table中,key是字符,value是这个字符出现的次数
var str = "abcdefgaddda";
var obj = {};
for (var i = 0, l = str.length; i < l; i++) {
var key = str[i];
if (typeof obj[key] == 'undefined') {
obj[key] = 1;
} else {
obj[key]++;
}
}
/*遍历这个hash table,获取value最大的key和value*/
var max = -1;
var max_key = "";
var key;
for (key in obj) {
if (max < obj[key]) {
max = obj[key];
max_key = key;
}
}
alert("max:"+max+" max_key:"+max_key);



2网页中实现一个计算当年还剩下多少时间的倒数计时程序,要求格式X年还剩XX天XX时XX分XX秒(我选择用一个动态的来告诉大家)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>倒计时</title>
</head>
<body>
<input type="text" value="" id="input" size="1000"/>
<script type="text/javascript">
function counter() {
var date = new Date();
var year = date.getFullYear();
var date2 = new Date(year, 12, 31, 23, 59, 59);
var time = (date2 - date)/1000;
var day =Math.floor(time/(24*60*60))
var hour = Math.floor(time%(24*60*60)/(60*60))
var minute = Math.floor(time%(24*60*60)%(60*60)/60);
var second = Math.floor(time%(24*60*60)%(60*60)%60);
var str = year + "年还剩"+day+"天"+hour+"时"+minute+"分"+second+"秒";
document.getElementById("input").value = str;
}
window.setInterval("counter()", 1000);
</script>
</body>
</html>



最后一题是关于seo优化问题,这个我就不好意思说了,好了,偶要去洗澡,这里面如果有问题的话,大家请指正了哦,写得不好也不要喷偶,偶智商抓急,寨见!!!(弱弱的说句,金山的笔试,我看到有人拿手机查了,我我我,当场就粪怒了)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值