乐趣区

2018年阿里社招笔试题分享

以下是 2018 年年初,面阿里时候的笔试题。为啥现在才分享出来,纯粹是因为之前懒。只分享题,没有答案。
1. 请通过代码实现下面的效果
function add(num){
var total = 0;
var curryAdd = function(num){
total = total + num;
return total;
}
return curryAdd;
}

console.log(add(2)(3)); // 结果为 5
console.log(add(2)(3)(4)(5)); // 结果为 14
2. 请回答按钮点击前后,代码中的两个 console.log 在浏览器控制台的输出信息并解释现象背后的原因.
let count = 0;

class MyComponent extends React.Component{
constructor(){
super();
this.state = {
count : count
};
}

componentWillMount(){
this.setState({
count : ++count
});

this.setState({
count : ++count
});

setTimeout(() => {
this.setState({
count : ++count
});

this.setState({
count : ++count
});
}, 1000);
}

componentDidMount(){
this.button.addEventListener(‘click’, this.onClick.bind(this, ‘ 原生浏览器事件 ’), false);
}

onClick(info) {
console.log(info);

this.setState({
count : ++count
});

this.setState({
count : ++count
});
}

render() {
console.log(this.state.count);
return (
<div>
<button type=”button” ref={node => this.button = node} onClick={this.onClick.bind(this, ‘React 事件 ’)}> 生成新计数 </button>
<div>Count : {this.state.count}</div>
</div>
);
}
}

ReactDOM.render(<MyComponent />, mountNode);
3.throttle 的简单实现

function throttle(func, duration) {
// 在这里编写具体实现
}

window.addEventListener(‘scroll’, throttle(func, 50), false);
4. 实现一个深度优先搜索算法(非递归)

function dfs(tree, name){
// 请在这里实现
}

var tree = {
name : ‘ 中国 ’,
children : [
{
name : ‘ 北京 ’,
children : [
{
name : ‘ 朝阳群众 ’
},
{
name : ‘ 海淀区 ’
},
{
name : ‘ 昌平区 ’
}
]
},
{
name : ‘ 浙江省 ’,
children : [
{
name : ‘ 杭州市 ’,
code : 0571,
},
{
name : ‘ 嘉兴市 ’
},
{
name : ‘ 绍兴市 ’
},
{
name : ‘ 宁波市 ’
}
]
}
]
};

var node = dfs(tree, ‘ 杭州市 ’);
console.log(node); // {name: ‘ 杭州市 ’, code: 0571}
5. 编写一个简单的自定义事件处理器: 1. 具备 on 方法绑定事件, 2. 具备 off 方法解绑事件

function EventEmitter () {
// TODO

}

var emitter = EventEmitter();

emitter.on(‘foo’, function(e){
console.log(‘listening foo event 1’, e);
});

emitter.on(‘foo’, function(e){
console.log(‘listening foo event 2’, e);
});

emitter.on(‘bar’, function(e){
console.log(‘listening bar event’, e);
});

// 监听全部事件
emitter.on(‘*’, function(e){
console.log(‘listening all events’);
});

emitter.trigger(‘foo’, {name : ‘John’});
emitter.trigger(‘bar’, {name : ‘Sun’});
emitter.trigger(‘*’, {name : ‘Sun’});
emitter.off(‘foo’);
6. 请用原生 JS 实现 DOM 拖动效果,尽量多考虑兼容以及其他可能的情况

退出移动版