2018阿里巴巴春招前端笔试题
1、下列关于JavaScript的AMD模块规范理解正确的是(C)
A. 只要被define()的函数包裹的就是AMD模块
B. AMD模块是同步加载的
C. 运行AMD模块需要浏览器支持该规范
D. AMD模块加载的原理是通过创建script标签来实现的
E. AMD模块要等到执行时才会去加载依赖的模块
F. AMD模块可以自运行,只要在页面上引入就可以了
2、以下关于 Web Worker说法正确的是(B)
A. Web Worker需要服务端支持
B. 把修改DOM的操作放到 Web Worker
C. Web Worker中可以获取站点的Cookie
D. Web Worker中不能发AJAX请求
E. 在一个 Web Worker中可以新建另一个 Web Worker
F. Web Worker中不可以使用Promise
3、以下针对BOM的表述错误的是(C)
A. 通过window.open打开的弹出窗口在不经用户允许的情况下可以关闭自己
B. 通过在全局作用域使用var foo添加的window属性无法通过delete window.foo从window上删除
C. window.location = "http://www.alibaba.com"会在浏览器的历史记录中生成记录
D. window.open属性是只读属性,不能修改
E. 可通过访问navigator.userAgent获取用户浏览器相关信息
F. iframe不允许直接跨域访问
4、对于Koa.js框架Koa1版本和Koa2版本的描述,以下哪些是正确的()
A. Koa1和Koa2都可以直接使用Express.js框架的所有中间件
B. Koa1可以直接使用Koa2的中间件
C. Koa2可以直接使用Koa1的中间件
D. Koa1底层是基于co.js实现"洋葱模型"
E. Koa2底层是基于co.js实现"洋葱模型"
F. Koa2比Koa1多了内置路由中间件
5、对于requireIdleCallback和requireAnimateFrame下面说法正确的是()
A. requireIdleCallback和requireAnimateFrame都是在浏览器空闲的时候执行回调函数
B. requireIdleCallback的回调执行时间一定小于16ms
C. requireIdleCallback和requireAnimateFrame因为是浏览器的机制,所以没有办法模拟
D. requireAnimateFrame比setTimeOut更精确
E. 使用requireAnimateFrame做动画的时候,不可见的元素的动画函数也会执行
F. requireIdleCallback的回调每次一定会在当前的帧的执行空闲期内执行完毕
6、(不定项)根据浏览器同源策略的限制,以下属于跨域的是()
A. 协议不同
B. 一级域名不同
C. 一级域名相同,二级域名不同
D. 端口号不同
E. 路径层级不同
F. 请求使用的HTTP方法不同
7、(不定项)下列关于Node.js和cluster模块理解正确的是()
A. cluster模块是为了更好地利用多核CPU
B. 通过master进程fork出来的worker进程与master进程共享内存
C. master进程与worker进程通过IPC通道进行通信
D. worker进程因异常退出时,master进程无法感知
E. 如果worker进程是一个HTTP服务,则每个worker都会监听一个随机端口
F. 因为master进程是主进程,因此业务逻辑也应该放在master里实现
8、(不定项)以下关于异步的说法正确的是()
A. new Promise(func),func是异步执行的
B. Promise.resolve(1).then(func),func是异步执行的
C. setTimeOut(func, 0),func会被立即执行的
D. setTimeOut(func, 2.5)表示2.5ms后执行func函数
E. Promise.all([promise1,promise2]).then(...) promise2不会等promise1执行完,而是立刻执行
F. setTimeOut(func1, 0);Promise.resolve(1).then(func2);func1会比func2先执行
9、(不定项)以下哪些CSS属性能实现DOM“隐藏”(在可视区域内肉眼看不见)()
A. display: none;
B. visibility: hidden;
C. opacity: 0;
D. background: rgba(255,255,255,0)
E. position: absolute
F. position: fixed
10、(不定项)请分析以下代码,选择关于var person1 = new Person('Bob')和var person2 = Person('Alice')的说法正确的是()
function Person(name) {
this.name = name;
return { name: name };
}
Person.prototype.name = 'Alice'
A. person1 和person2都是Person 的实例
B. person1 .proto指向Person.prototype
C. person2 .proto指向Person.prototype
D. person1 .name的值是Bob
E. person2 .name的值是Alice
F. person2 .proto_为undefined
11、在Web开发中,通常我们需要针对同样的功能为了适配不同端而重复开发了一些功能,现在我们期望可以有这样一种工作方式,只需要写一套代码,可以同时在桌面端和移动端展示和运行,请简述你对这种工作模式下面不同的角色(设计,前端)需要考虑的事情,并给出前端侧的简单实现思路,可基于熟悉的类库或者框架进行描述或者伪代码实现。
答案:
12、请使用JavaScript实现一个getIntersection函数,可获取多个区间的交集,规则如下:
区间使用长度为2的数字数组表示,如[2,5]表示区间2到5(包括2和5);区间不限定方向,如[5,2]等同于[2,5];该方法可接受多个区间,并返回所有区间的交集(用区间表示)表示,并能正确通过以下测试用例:
function getIntersection(...args) {
//your code here
}
getIntersection([1,4],[3,5]); // return [3,4]
getIntersection([5,2],[4,9],[3,6]); //return [4,5]
getIntersection([1,7],[8,9]); //return null
getIntersection(['x',7],[4,9]); //return null
getIntersection([1,2]); //return [1,2]
getIntersection([1,2],[2,3]); //return [2,2]
答案:
13、请使用JavaScript编写一个树的深度优先遍历函数(节点最深的最先访问到,依次类推),满足以下测试用例:
// 假设树的结构如下:
const tree = [
{
id: 1,
name: '张三',
children: [
{
id: 2,
name: '李四',
children: [
{
id: 5,
name: '张五'
}
]
}
]
},
{
id: 6,
name: '玛丽'
}
]
//测试用例:
//1. 生成一棵新树,姜将所有节点的id,加1
console.log(treeMap(tree, node => {
let newNode = { ...node }
newNode.id = node.id + 1
return newNode
}))
//打印的新树,应该与tree的结构一致,只是每个id自增1,老的tree,应该没有任何改动
//2.打印每个节点的id
treeMap(tree, node => {
console.log(node.id)
return node
});
//应打印顺序应该是:5,2,1,6
//3. 对于非法输入,应直接返回第一个入参
console.log(treeMap(null)) //输出null
console.log(treeMap(tree,true/*不是函数*/)) //输出tree
答案: