前几天做了阿里实习生的前端笔试题,和大家分享 一下。
下列哪个函数可以合并相邻文字结点?
A normalize();
B merge();
C mix();
D combine();
E append();
F replace();
- normalize(),这个方法唯一的作用就是处理文档树中的文本结点。当在某个节点上调用这个方法时,它就会 在该结点的后代结点中查找,如果遇到空文本结点,直接删除;如果找到相邻的文本结点,将它们合并为一个文 本结点。
- merge(),这个方法JavaScript里没有,在原生JavaScript中合并两个数组使用concat()方法。Jquery中可以 通过这个方法合并和两个数组。 这个题选A
下面这个div容器在文档流中实际占据的高度是多少?
<style type='text/css'>
.box1{
width:180px;
height:180px;
padding:5px 10px;
border:5px 15px;
box-sizing:border-box;
}
</style>
<div class="box1"></div>
A 宽180px 高180px
B 宽230px 高200px
C 宽200px 高190px
D 宽190px 高210px
E 宽190px 高230px
首先说明一个问题 这里的border属性写错了,大概是出题的程序猿哥哥太着急了吧。
这个题目的考点是box-sizing属性。
对于盒子模型来说,W3C标准盒子模型内边距和边框都会影响容器的大小。而设置元素box-sizing: border-box时,此元素的内边距和边框不再会增加它的宽度。
所以实际占据的高度仍为180px,180px,选A
可以获取当前元素([HTML Element el])临近兄弟非文本元素的方法是:
A el.siblings
B el.getElementsByTagName("div")
C el.nextSibling
D el.nextElement
E el.parentNode.children
- siblings() 是jquery方法,找到引用该方法元素的所有匹配对应选择器的兄弟元素。
- getElementsByTagName(),该方法返回带有指定标签名的对象的集合。
- nextSibling(),该方法返回某个元素之后紧跟的兄弟元素。
- nextElement(),该方法不存在。
- el.parentNode.children(),parentNode是指向它的父节点,children方法时找到所有对应的直接子结点,包括el本身。
综上所述,应该选择C
以下哪些属于http请求的返回头(排除自定义http header因素)
A Content-Type
B Cookie
C Host
D Expires
E Last-Modified
F User-Agent
详情参考 HTTP Header 详解 http://kb.cnblogs.com/page/92320/
选择ADE
以下哪些方法够选择到id值为foo的元素:
A document.getElementById("foo")
B document.querySelector("#foo")
C document.querySelectorAll("#foo")[0]
D this.foo
E document.foo
F foo
这个题目前三种大家应该都知道,平时也就是这样使用的。D重点应该是HTML中的id和全局的window之间的关系,可以这样理解,我们在HTML中书写的标签实际上是通过id的值这个变量挂在全局变量上的,当this值为window时,成立。document是window的另外一个变量属性,它和foo没有直接关系。F是为了兼容以前的浏览器而存在的。 所以,应该选A、B、C、D、F
以下针对npm命令和包管理策略描述正确的是:
A npm install babel@^6.5命令可以安装最新版的6.5.X版本的babel
B npm install babel@>=5.6命令可以安装最新5.x.x版本的babel
C npm publish 命令可以覆盖之前发布过的版本
D 安装完A包后再安装B包,如果B包依赖A包,则A包不会多次安装
E require("babel")时,优先查找当前目录下是否有babel这个包
F npm run build 命令可以运行当前目录下的build.sh
A选项参考 https://docs.npmjs.com/misc/semver ^应该是安装6.x.y版本,x大于等于5
B选项中的>=不存在
C npm publish 不能覆盖之前的版本,只能发布一个新的版本
D 在新版的npm中如果版本号一致是对的,在旧版的npm中不管什么条件都要重新安装
E require是优先在当前目录下查找,是对的
F npm run是运行当前目录下的package.json下的scripts下的内容
综合,应该是选E或者DE
请在空白处填写代码,要求输出step1()中的1:
function* step1(){
yield 1;
}
function *step2(){
yield step1();
}
console.log(step2()__________________________);
这个题目考察的是yield语句,遇到yeild语句会暂停后面的操作,并将紧跟着yeild后面的那个表达式的值返回,next方法时继续执行,直到 遇到下一个yeild。所以这里应该是:
step2().next().value.next().value;
请完成一下填空,使得id为loading的div每1秒转1圈并无限循环:
<html>
<head>
<style>
#loading{
width:100px;
height:100px;
position:absolute;
animation:circling _____ linear 0s ______;
}
@______ circling{
from {
transform:_____________;
}
to{
transform:_____________;
}
}
</style>
</head>
<body>
<div id="loading"></div>
</body>
</html>
这个题目重点考察animation动画的实现。
自定义动画的实现
@keyframes 动画名{
from{
初始状态
}
to{
结束状态
}
}
transform属性的使用
这里是旋转一周,从0度到359度,所以初始状态应该是0度,结束状态应该是359度,即:
from{
transform:rotate(0deg);
}
to{
transform:rotate(359deg);
}
animation属性
animation:动画名 持续时间 速度 延时 重复次数
这里应该为:
animation:circling 1s linear 0s infinite;
请实现add函数,是的add(100)(200)(300)(400) == 1000
这个题目考察函数,在JavaScript中函数也是一个值,它是可以通过return返回的,具体实现如下:
var add = function(a){
return function(b){
return function(c){
return function(d){
return a+b+c+d;
}
}
}
}
请用JavaScript实现一个输入框,可以根据用户的输入来实时向服务器请求,并给出搜索结果;
给出完整的HTML结构和JavaScript代码,css可不做要求
需要考虑性能优化
尽量使用原生JavaScript
这个题目是对整体原生js的考察,有一定难度,这里是我的简单实现,仅作参考
<input id="search"></input>
<div id="ans"></div>
<script type="text/javascript">
function debounce(func, wait, immediate) {
var timeout, args, context, timestamp, result;
var later = function() {
var last = new Date().getTime() - timestamp;
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
if (!timeout) context = args = null;
}
}
};
return function() {
context = this;
args = arguments;
timestamp = new Date().getTime();
var callNow = immediate && !timeout;
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
};
var debug = console.log.bind(console);
var $search = document.getElementById('search');
var $ans = document.getElementById('ans');
var getSearchResult = function(keyword){
return new Promise(function(resolve, reject){
setTimeout(function(){
var data = ['11', '12', '22'].filter(function(value){
return value.indexOf(keyword)>-1;
});
resolve(data);
}, 1000)
})};
function searchIt(value){
getSearchResult(value).then(function(data){
var ul = document.createElement('ul');
data.map(function(value){
var li = document.createElement('li');
li.appendChild(document.createTextNode(value));
ul.appendChild(li);
})
ans.innerHTML='';
ans.appendChild(ul)
})
}
$search.addEventListener('input', debounce(function(event){searchIt(event.target.value)}, 1000));
searchIt('');
</script>
分享快乐