【前端面试题】关于一些js的一些面试题(金融行业),我和面试官扯了三个小时

39 阅读5分钟

// 函数节流

var canRun = true;

document.getElementById("throttle").onscroll = function(){

if(!canRun){

return

}

canRun = false

setTimeout( function () {

console.log("函数节流")

canRun = true

}, 500)

}

用一个flag让该函数在500ms内只执行一次.

2.如何判断一个自然数能否被2^n整除?整除返回true,不能整除返回false。

这个问题是他们二面的金融技术主管直接问的,我当时回答的两种方法发现死活绕不过去次幂的问题,就只好放弃了。这里梳理一下。

方法一:二进制法

function check(num){

return (num > 0) && ((num & (num - 1)) == 0);

}

通过二进制的方法可以判断一个数num是不是2的n次方幂,规律可知,只要是2的次方幂,必然是最高位为1,其余为0,当num-1时,则最高位是0,其余是1.

按位与运算:  1&1=1  0&1=0 0&0=0 1&0=0

2     --->   10                   3    --->   11

4     --->   100                 6    --->   110

8     --->   1000               7    --->   111

例子:

8   的二进制   1000      8-1 的二进制  0111    按位与运算      1000&0111    -->  0000    所以8是2的n次方幂。

9   的二进制   1001      9-1 的二进制  1000    按位与运算      1001&1000   ---> 1000   所以9不是2的次方幂。

24  的二进制  11000     24-1 的二进制  10111  按位与运算    11000&10111  ---> 10000  所以24不是2的次方幂。

可以通过num.toString(2)来写出num的二进制。

读一些源码的话,发现上面的是最优解。

方法二:取余法

function check(num){

if(num != 1){

while(num != 1){

if(num%2 == 0){

num = num / 2;

}else{

return false;

}

}

return true;

}else{

return true;

}

}

如何判断一个数是否是2的n次方幂,其简单判断方法就是这个数num直接除2,若余数为0,则num/2再除2,再判断是不是余数是不是0,是的话继续按上一步来,直到最后为num=1。

比如:

2  2%2=0  (2/2)=1                                                                             是

4  4%2=0  (4/2)%2=0  (4/2/2)=1                                                       是

6  6%2=0  (6/2)%2=1                                                                       不是

7  7%2=1                                                                                         不是

24 24%2=0   (24/2)%2=0   (24/2/2)%2=0   (24/2/2/2)%2=1            不是

 

3.递归实现1到100的和?

我当时都忘记递归的形式了,直接用了for循环,他一面面试我,我又重新给他说了一个递归的实现。

方法一:递归

function num(n){

if(n==1) return 1;

return num(n-1)+n;

}

num(100);

方法二:for循环

var sum = 0;

for(i=0;i<=100;i++){

sum +=i;

}

console.log("sum="+sum);

4.有一个数组【1,2,3,4,1,2】去掉其中的重复数字变为【3,4】.

我当时直接用的一个for循环,然后两个两个比较,有相同的就加个判断,都给她移除,最后就会剩下【3,4】。最后他给我剖析了一下,如果有三个相同的数字怎么搞?说我的思维不对,我日了狗了。不过对于这个题,程序确实没毛病。

方法一:优化遍历数组法

获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique1(array){

var r = [];

for(var i = 0, l = array.length; i<l; i++){

for(var j = i + 1; j < l; j++)

if(array[i] == array[j]) j == ++i;

r.push(array[i]);

}

return r;

}

//测试代码:

var arr=[1,2,3,4,5,1,2];

var rel=unique1(arr);

console.log(rel);

方法二:对象键值对法

新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。

//注意点: 判断 是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。

//速度最快, 占空间最多(空间换时间)

function unique(array){

var n = {}, r = [], len = array.length, val, type;

for (var i = 0; i < array.length; i++) {

val = array[i];

type = typeof val;

if (!n[val]) {

n[val] = [type];

r.push(val);

} else if (n[val].indexOf(type) < 0) {

n[val].push(type);

r.push(val);

}

}

return r;

}

//测试代码:

var arr=[1,2,3,4,5,1,2];

var rel=unique(arr);

console.log(rel);

5.1rem,1em,1vh,1px的含义

这个问题平时开发都会用到,也知道啥意思,书面表达可能写不好,这里整理一下。

rem

rem是全部的长度都相对于根元素元素。通常做法是给html元素设置一个字体大小,然后其他元素的长度单位就为rem。

em

子元素字体大小的em是相对于父元素字体大小

元素的width/height/padding/margin用em的话是相对于该元素的font-size

vw/vh

全称是 Viewport Width 和 Viewport Height,视窗的宽度和高度,相当于 屏幕宽度和高度的 1%,不过,处理宽度的时候%单位更合适,处理高度的 话 vh 单位更好。

px

px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。

一般电脑的分辨率有{1920*1024}等不同的分辨率

1920*1024 前者是屏幕宽度总共有1920个像素,后者则是高度为1024个像素

 

6.calc,support,media的含义及用法?

答:  calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度。比如说,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。为何说是动态值呢?因为我们使用的表达式来得到的值。不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度。

.elm{

/Firefox/

-moz-calc(expression);

/chromesafari/

-webkit-calc(expression);

/Standard/

calc();

}

.box{

background:#f60;

height:50px;

padding:10px;

border:5pxsolidgreen;

width:90%;/写给不支持calc()的浏览器/

基础学习:

前端最基础的就是 HTML , CSS 和 JavaScript 。

网页设计:HTML和CSS基础知识的学习

HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。

CSS样式是表现。就像网页的外衣。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为表现。

动态交互:JavaScript基础的学习

JavaScript是用来实现网页上的特效效果。如:鼠标滑过弹出下拉菜单。或鼠标滑过表格的背景颜色改变。还有焦点新闻(新闻图片)的轮换。可以这么理解,有动画的,有交互的一般都是用JavaScript来实现的。

开源分享:docs.qq.com/doc/DSmRnRG…