前端面试专题提供前端面试的最新资讯内容,帮你更好的了解前端面试。
总结分享一些基于jQuery的前端面试(含移动端常见问题)
web前端没有项目经验怎么面试
前段时间换了份工作,也经历了很多面试,最终通常都会扑在算法上虽说前端是所有程序员中,对于算法的要求最低的一个岗位,但算法依旧是进阶的必修课于是决定记录一下与算法相关的面试题,以后拿去面别人 一、面试题问:有一个一百层的高楼,现在给你两个完全一样的玻璃球,去测出在哪一层楼把球扔出去,刚好能把玻璃球砸碎?答:emmmmmm问:球碎了就没法用了答:那如果没碎呢?问:emmmmmm答:啊哈,那就拿着球从一楼往上,一层一层的试呗~问:好,那现在不限制球的数量,但要求用最少的次数,去找到这个临界点答:二分法!从中间的楼层开始扔球,如果碎了就在下面的楼层中继续找问:没错,二分法是最快的解决方案,但如果遇到最差的情况,需要用几个球呢?答:我数一数问:……答:……问:算了,下一个问题吧 二、二分法使用二分法的前提是,目标数组的元素必须是有序排列的,所以二分法属于有序查找算法二分法又称为“折半查找”,从数组的中间节点开始查找,将数组分为两部分如果目标元素和中间节点不相等,就通过比较两者的大小,确定接下来查找数组的前半部分还是后半部分然后递归查找,直到找到目标元素,或者发现目标元素不在数组内在最坏的情况下,需要的次数为:(log2 n)+1 ,其中 log2n 向下取整function BinarySearch(arr, target) {let s = 0;let e = arr.length - 1;let m = Math.floor((s + e) / 2);let trun = arr[s] <= arr[e]; //确定排序顺序while (s < e && arr[m] !== target) {if (arr[m] > target) {trun ? (e = m - 1) : (s = m + 1)} else {trun ? (s = m + 1) : (e = m - 1)}m = Math.floor((s + e) / 2);}if (arr[m] == target) {console.log('找到了,位置%s', m, t);return m;} else {console.log('没找到', t);return -1;}} 三、问题拓展1. 用二分法遇到最坏的情况,需要 6 次 还是 7 次?2. 如果只有两个球,怎么才能用最少的次数,找到临界点? 
一、面试题问:开发的时候有用到过 Math 吗?答:很多啊。比如生成 GUID 的时候,就会用到 Math.random() 来生成随机数。问:别的呢?比如向下取整、向上取整?答:向下取整是 floor(),向上取整是 ceil()。另外还可以用 round() 方法进行四舍五入的取整。问:如果我需要四舍五入并保留两位小数,应该怎么处理呢?答:可以直接用 toFixed() 方法,然后在方法中传入 2,以保留两位小数。问:那数字 1.335 通过 toFixed(2) 计算后,结果是什么呢?答:1.34 啊。问:哦?那 0.1 + 0.2 等于多少呢?答:阿咧?难道不是 0.3 么...问:emmmmmm...答:......问:js 在处理十进制计算的时候,会先转为二进制,计算之后再转回十进制。如果这个数是浮点数,就很容易出现误差。   答:原来如此!问:在了解了这个情况之后,你能写一个精确计算的方法么? 二、优化 toFixed()由于二进制的原因,如果只是简单的放大缩小倍率,得到的结果都是不完美的比如很多人推荐的:Math.formatFloat = function (f, digit) {var m = Math.pow(10, digit);return Math.round(f * m, 10) / m;}在处理 8716.425 这个数的时候就会出错 经过多次尝试和查阅资料,我强烈推荐 Scott 大神的 toFixed() 方法,原链接:http://www.chengfeilong.com/toFixed可以先手动找到舍入位,如果该位置大于5,则手动进位,并去掉舍入位及其后面的所有字符Number.prototype.toFixed = function(length) {var carry = 0; //存放进位标志var num,multiple; //num为原浮点数放大multiple倍后的数,multiple为10的length次方var str = this + ''; //将调用该方法的数字转为字符串var dot = str.indexOf("."); //找到小数点的位置if(str.substr(dot+length+1,1)>=5) carry=1; //找到要进行舍入的数的位置,手动判断是否大于等于5,满足条件进位标志置为1multiple = Math.pow(10,length); //设置浮点数要扩大的倍数num = Math.floor(this * multiple) + carry; //去掉舍入位后的所有数,然后加上我们的手动进位数var result = num/multiple + ''; //将进位后的整数再缩小为原浮点数/** 处理进位后无小数*/dot = result.indexOf(".");if(dot < 0){result += '.';dot = result.indexOf(".");}/** 处理多次进位*/var len = result.length - (dot+1);if(len < length){for(var i = 0; i < length - len; i++){result += 0;}}return result;}这个方法我暂时没有发现有错误处理的数字。如果有小伙伴发现了,一定留言告诉我在进行浮点数运算的时候,即使计算结果不精确,也可以用这个方法对结果进行四舍五入操作,得到最终结果 三、大数相加在 js 中,对于超大整数的运算,还存在格式问题当数字超出某个范围的时候,数字会自动转为科学计数法这个时候如果还需要输出常规格式,就需要将数字转为字符串,然后实现一个字符串加法function sumNumber(a, b) {var res = '', temp = 0;a = a.split('');b = b.split('');while (a.length || b.length || temp) {temp += ~~a.pop() + ~~b.pop();res = (temp % 10) + res;temp = temp > 9;}return res.replace(/^0+/, '');}来源:https://www.cnblogs.com/kindofblue/p/4672129.html这个方法的入参必须为整型的字符串,然后从个位开始,逐位相加,最后返回字符串 相关:http://0.30000000000000004.com/