饥人谷每天一到面试题 - yulilong/resume GitHub Wiki

第一天:写一个execTime函数

写一个execTime函数,参数:时间毫秒数,作用:什么都不做,但执行函数会消耗时间(参数传入的时间)

function execTime(t) {
    // 补全代码
}
console.log(1)	// 输出1
execTime(3000)	// 运行3秒钟
console.log(2)	// 3秒后输出2

// 答案
function execTime(t) {
  var seconds = (new Date()).getTime() + t;
  while ((new Date()).getTime() != seconds){}
}

第二天:写一个函数

写一个execTime函数,参数t:时间毫秒数,参数callback:回调函数

function execTime(t, callback) {
    // 补全代码
}
console.log(1)
execTime(3000, function(){
    console.log(3)
})
console.log(2)
// 上面代码执行结果为:立即输出1和2,3秒手输出3

//答案
function execTime(t, callback) {
  setTimeout(callback, 3000)
}

第三天:写一个对象obj

写一个对象obj,使得obj.obj.obj === obj

也就是说,不管出现多少次.obj,都得到obj

var obj = {}
obj.obj = obj;
obj.obj === obj		// true
obj.obj.obj.obj.obj.obj === obj	// true

第四天:写一个函数fn

写一个函数fn,使得fn满足一下条件:

fn() === fn
fn.fn === fn

// 答案
function fn() {
 this.fn = this;
return fn;
}

第五天: 写一个函数fn

写一个函数fn,使得fn满足一下条件:

  1. fn()打印出a
  2. fn()()打印出b
  3. fn()()()打印出c
function fn() {
    var timer = setTimeout(() => { console.log('a') })
    return () => {
        if (timer) { clearTimeout(timer) }
        timer = setTimeout(() => { console.log('b') })
        return () => {
            if (timer) { clearTimeout(timer) }
            timer = setTimeout(() => { console.log('b') })
        }
    }
}
/*setTimeout最小调用事件会被函数潜逃层数影响,所以不写delay也没关系
*/
function fn() {
    var chr = 'a';
    setTimeout(function() { console.log(chr) })
    return function() {
        chr = 'b';
        return function() {
            chr = 'c';
        }
    }
}
fn()
fn()()
fn()()()

第六天:写一个函数fn

写一个函数fn,使得fn满足一下条件:

  1. fn() == 'a'

  2. fn()() == 'b'

  3. fn()()() == 'c'

function fn() {
    var b = function() { return 'c'}
    b.valueOf = function() { return 'b'}
    var a = function() { return b }
    a.valueOf = function() { return 'a'}
    return a;
}
fn() == 'a'
fn()() == 'b'
fn()()() == 'c'