接着我之前写的一篇有关前端面试题的总结,分享几道比较经典的题目:
第一题:
考点:作用域,运算符
1.console.log((inner.func,inner.func)())
栗子:
var i=1,k=1;
console.log((i++,k++)) //i,k都会进行运算,但是最后之后输出最后一个也就是k.
*那么(inner.fun,inner.func)其实就是inner.func,而且是个匿名函数,也就是属于window,就输出25
第二和第三个都是类似的,而且作用域是inner,都是输出20
最后一个:(inner.fun=inner.func)其实就是inner.func,而且是个匿名函数,也就是属于window,就输出25
第二题
首先"a" in window 是返回true,因为"a"是始终存在window的,在外面加个!判断是否存在,很明显a永远在window里存在,所有输出undefined
第三题
大家忘记的可以去普及一下,call,apply方法的用法以及适用场景,两个方法都是为了改变this指向,如果第一个参数传入的对象调用者是null
或者undefined的话,call方法将把全局对象(也就是window)作为this的值。所以,不管你什么时候传入null,其this都是全局对象window.
则返回[object window]
第四题
这里实际执行的是a[b.toString()] = 123,当你在同一个key赋值,那么后者会覆盖前者,所以输出456
第五题
doFun1(obj.logName),obj.logName作为参数传入,最后执行(obj.logName)(),匿名函数,this指向window,所以输出"HanMeiMei",
doFun2(obj),obj作为参数传入,最后执行obj.logName(),作用是obj,则输出LiLei
第六题
这里可能很多人一看就觉得是输出1,2,3,4,错误×,
这里其实for循环被放入主线程会先被执行,最后才会去走定时器里面的方法,当输出的时候i就已经是5了,而且是1s输出一次,所以是5,5,5,5。
如果要输出1,2,3,4,只需把var 改成let,let 是ES6的语法,是在括号的才能使用,别处不行
第七题 :什么是闭包,有什么优缺点(重点)
第八题:什么是原型链(重点)
第九题
有一对兔子,从出生后第三个月起每个月都生一对兔子 ,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死 ,问每个月的兔子总数为多少?
考点:递归
算法题目其实挺有意思,最主要是我们先要找规律
月 1 2 3 4 5
每月对应数量 1 1 1+1 1+1+1 1+1+1+1+1 前两个数加起来就是后一个
规律找到了,所以这么写就对了
function fib(n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
fib(100)//随你自己赋值了
总结:就写到这吧,打的手疼。有什么不懂得,大家可以一起在评论下讨论,我知无不言。(* ̄︶ ̄)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。