1、 function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
}
}
var fn = fun(0).fun(1)
fn.fun(2)
fn.fun(3)
这个也是很经典的面试题了,首先这个里面考的是闭包的知识。答案是会打印undefined, 0,1,1.下面我们来分析下这个题,首先要能区分fun函数里面的两个fun地方,第一个是函数对象返回的值,是一个名为fun的函数,在这个函数里面返回的fun函数才是这个最外层的fun函数本身。这里由于返回的fun函数引用了参数n,所以这个参数会在保留内存中,而不会被释放掉.
再来看题目. fun(0), 这里传入了一个参数0,所以 n = 0, o = undefined, 所以打印undefined, 介质fun(0).fun(1), 调用函数返回的fun变量,同时传入参数m = 1, 所以最后返回的这样一个函数
fun (1, 0) 这里执行console.log(o), 此时 o 为0, 所以打印0. 然后fn是什么,fn是fun(1, 0)返回的fun变量, 所以fn.fun(2)和fn.fun(3)都是一样会打印1.
2、css选择器(遗忘), 要求写出div后面的p标签的属性 div + p
3、css写出三角形
这里我们是通过css的border属性来写出三角形,之前一直不太理解这个原理,现在用自己的理解来解释这种写法。首先来看border的作用,根据盒模型,border是盒子宽度里面的一部分。
div { width: 5px; height: 5px; border: 5px solid #ccc}
这个时候div实际宽度为10px, 10px。
div { width: 0; height: 0; border: 4px solid #ccc}
这个div为宽高为4px的正方形.
div { width: 5px; height: 5px; border-left: 5px solid #000;border-top: 5px solid #ff0000;border-left: 5px solid #ff0000;border-left: 5px solid #000; }
四个边框颜色不一致的时候,效果就出来了,也就是说我们正常的border: 5px solid #ccc, 其实也是四个部分组成的,这四个边框的具体形状取决于盒子本身的宽度,比如
div{height: 10px;width: 10px;border-left: 10px solid red;border-right: 10px solid red;border-bottom: 10px solid black;border-top: 10px solid black;}
我的理解是这个盒子本身是一个正方形,这个时候给它去添加border,是从某一个边去引申出去的,而它的原则是到这条边的距离是我们设置的10px solid red中的10px, 基于这个原则,最后我们看到的总是一个规则的方形,如果刚好4个距离一致则是正方形,这个原则同时也是基于盒模型的,一个盒子的宽度/宽度= width/height + border + margin + padding。。再来看上面那个当div的宽高为0时,所以div只是一个点,这个时候border就是从这个点引申出去。
在知道了这些的情况下,我们就可以写出一个三角形了, div{height: 0px;width: 0px;border-left: 10px solid transparent;border-right: 10px solid transparent;border-bottom: 10px solid red;}, 只给border-left一个值,将border-top和border-bottom设置值并且将颜色设为透明,这样他们的部分就隐藏掉了。
4、如何从1000万个数里面挑选出前100最大的数
这里涉及到算法方面的问题,因为对算法不是很专业,所以也只是想出了一种类似二分法的解决方案,
(1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数
(2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分
(3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果个数不够,继续(3)操作,如果个数超过100的就重复1操作,直到最后右边只有100个数为止。
5、已知有一个排序好的数组和给定的一个数字x, 要得到其中数组中两个元素,满足这两个元素的和为x,要求算法时间复杂度为O(n), n为数组长度.
var arr = [0, 1,2,3,4,5,6,7]
1、可以直接循环遍历数组arr, 判断arr.indexOf(x - arr[i]) > -1, 这样的话算法时间复杂度最大为O(n)
2、如果不用indexOf内置函数去判断的话怎么做?
因为数组时顺序的,所以可以由前后向中间遍历,一前一后两个指针来找到两个数的和等于x。
6、要求有这样一个后退按钮,从b页面返回到a页面的时候让a页面达到缓存效果。
用keep-alive结合路由中meta设置变量,在b页面监听beforeRouterEnter, 当上一个页面时a页面时改变变量值,在a页面里面activated函数中判断当满足条件时不重新加载数据,否则加载数据。