嗯,小白的进击之路,继续来补充了... 又看了一些坑,自己第一次疏忽做错的,还是用笔记下来,共同进步

恩,面试系列和排坑会在github更新哦,一起准备秋招的小伙伴路过可以star下,一起进步O(∩_∩)O~: 传送门

JS专项

1. 数组的神奇变化

请问以下输出是什么

var arr1 = "john".split('');
var arr2 = arr1.reverse();
var arr3 = "jones".split('');
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
复制代码

答案:

"array 1: length=5 last=j,o,n,e,s"
"array 2: length=5 last=j,o,n,e,s"
复制代码

是的,发现两个输出一样,先说这道题的核心,再好好想想吧

  • 数组不是简单数据类型(值类型),会保存在堆中(heap)中,当使用var arr1 = arr2赋值时,只是浅拷贝,拿到了arr2的引用,这样带来的问题就是,修改arr1的时候arr2也会收到影响。
  • arr1.push(arr2),这就是为什么有一个函数叫concatpush会直接把整个数组push进去,而不会分开搞 搞清楚以上两点,这个题基本上就解开了。

2.+ - 运算符之惑

以下程序输出是什么?

console.log(1 +  "2" + "2");
console.log(1 +  +"2" + "2");
console.log(1 +  -"1" + "2");
console.log(+"1" +  "1" + "2");
console.log( "A" - "B" + "2");
console.log( "A" - "B" + 2);
复制代码

答案:

"122"
"32"
"02"
"112"
"NaN2"
NaN
复制代码

嗯,核心是以下几点,自己再细细思考

  • - +会隐式转换为Number类型
  • + 作为运算符出现在String类型前时,会认为需要字符串拼接,因此会隐式转换为String
  • Number包含一个特殊的类型NaN,当对非数字进行Number转换时,会变为这个。

第一题: 第二条,认为需要字符串拼接 1被转换为1,答案122 第二题: 注意到第二个2前面的+号,是符合第一条的,因此第二个2被转换为Number类型,答案为32 第三题: 同理,答案02 第五题: 运用(1)(3),显然是NaN2,第六题同理

3.堆栈溢出之谜

下面的代码将会造成栈溢出,请问如何优化,不改变原有逻辑

var list = readHugeList();var nextListItem = function() {var item = list.pop();if (item) {// process the list item...nextListItem();}
};
复制代码

答案:

var nextListItem = function() {var item = list.pop();if (item) {// process the list item...setTimeout(nextListItem,0}
};
复制代码

首先必须搞清楚,堆栈溢出的原因。

在JS中,不小心的操作或者编程习惯,很容易造成堆栈溢出,特别是进行回调或者循环的时候。 引用以下来说明溢出的原因:

原因是每次执行代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,成千上万个此类空间累积起来,自然就超过线程的栈空间了。那么如何解决此类问题?

这里介绍两个思路解决此问题:

  1. 异步
  2. 闭包

显然,这里就是使用的第一种方法,闭包。为什么使用setTimeout就可以解决问题?我们看下与没用之前的差别。如果没有使用setTimeout,那么函数将在大数据前不断的回调,直到最后走到重点,最初的函数才运行结束,释放内存。 但是如果使用了setTimeout,我们知道它是异步的,即使设置了时间为0,它也允许先执行下面的内容,可以释放堆栈,从而避免堆栈溢出的问题。 换言之,加了setTimeout,nextListItem函数被压入事件队列,函数可以退出,因此每次会清空调用堆栈。

闭包 也是一样的道理,因为这道题要求不修改原有逻辑,第一种是最合适的答案,当然用闭包避免的方法就是返回出来一个函数

var nextListItem = function() {var item = list.pop();if (item) {// process the list item...return nextListItem()}
};
复制代码

当然,这样做会改变函数的调用方式,我们就需要不断的调用 nextListItem()()() 为了处理这个办法,可以对其进行进一步的封装

var nextListItem = function() {var item = list.pop();if (item) {// process the list item...return function() {return nextListItem()}}
};function autoRun(fun) {var value = nextListItem();while(typeof value === 'function') {value = nextListItem()}return
}
复制代码

这样,就解决堆栈溢出的问题。 这里闭包的思路来源与堆栈溢出解决方案

4.你真的懂对象(Object)的key吗?

下面函数的输出是什么?

var a={},b={key:'b'},c={key:'c'};a[b]=123;
a[c]=456;console.log(a[b]);
复制代码

答案: 输出是这样的456,不是123,至少我有有点以外...

原因是什么呢? 这里了解ES6新的数据类型map的应该就会意识到了,没错,对象的key值是只允许String类型的,这也是为什么引入了map数据类型了。 好了,那如果把一个对象作为key值,就会调用toString方法了。

Object.prototype.toString(obj)会得到什么呢?没错`[object Object]。 那所以

a[b] ==> a["[object Object"] = 123;
a[b] ==> a["[object Object"] = 456;
复制代码

答案,显而易见

5.回文判断

请做一个回文判断的函数,判断是否是回文

答案: 这是一个很简单、很常规的方法。链表是最好的判断回文的方法,当然得益于JS数组的灵活方法,可以更容易实现。

这里主要考虑了一个健壮性的问题,多了一个正则来检测:

function check(str) {str = str.replace(/\W/g,'').toLowerCase();return str === str.split('').reverse().join()
}
复制代码

前端面试笔试错题指南(二)相关推荐

  1. 前端面试笔试错题指南(四)

    嗯,上次写blog已经是几周前的事情了,其实已经积攒了很多小问题需要记录和分享了.但是在8月底,VK我一次经历了了携程.拼多多.腾讯.网易等多轮面试轰炸,忙得不可开交,有喜有忧的同时,还是赶快记录了不 ...

  2. 前端面试笔试编程题(持续更新中)

    1. 求两个日期中间的有效日期(考虑闰年)(微众银行校招笔试) 如 2015-2-8 到 2015-3-3,返回[2015-2-8 2015-2-9-] 思路:使用毫秒数  一天一天地放进去 // 求 ...

  3. 暑期实习前端面试笔试总结汇总

    一.面试 腾讯2020暑期实习--前端电话面试(1)回顾 腾讯2020暑期实习--前端视频面试(2)回顾 腾讯2020暑期实习--前端视频面试(3)回顾 阿里巴巴2020暑期实习--前端电话面试(1) ...

  4. 前端面试常见逻辑题收集及分析

    前端面试中常出现一些有趣的逻辑题,初见的时候有可能会手足无措,但实际多看几个题之后就会有一定的思考逻辑,有种打通任督二脉的感觉.以下是我个人面试经历以及网络上收集来的一些经典题目. 题目: 1.现有一 ...

  5. C语言--基础编程题(各公司面试笔试真题)

    下面我会给大家分享下各公司的面试笔试当中的真题,我挑出来的算是相对比较简单基础的一些题目,也适合基础水平的在学编程小白进行练习,大家现在,也动动脑,动动手,把下面我给出来的这些题目,大家自己动手做做, ...

  6. 2023年某科技公司前端开发初级岗的面试笔试真题(含选择题答案、问答题解析、机试题源码)

  7. 【思特沃克前端校招笔试、一面、二面】

    思特沃克 1.前端海外岗,四月中旬收到笔试,写完后几天约一面,一面后两周约二面 2.大概两周后收到邮件答复一面过了约二面,结果点约面链接进去没有显示,通过该邮件咨询了下只要等待下次邀约就行. 3.结果 ...

  8. 【千寻位置前端校招笔试、一面、二面】

    千寻位置 面试不难,都答上来了,就是该岗位名额只有一个,竞争大,二面挂 笔试 数组求均值 两个布局还原 用定时器模拟sleep function sleep(ms) {return new Promi ...

  9. 【面试题】1223- 牛客最新前端 JS 笔试百题

    前言 面经部分题目传送门: 牛客最新前端面经面试题汇总(含解析)[1] 前几天空闲时间抓取了牛客最新的笔试题和面试题,想做一下数据统计,展望一下面试中JavaScript的平凡考点和火爆考点,给未来自 ...

最新文章

  1. 可删除任意位置数据的堆
  2. 11、查看及测试网络、配置网络地址、内核及模块管理
  3. python php区别-JAVA、PHP、Python这3种编程语言有什么区别?
  4. [LeetCode]高频算法题
  5. kernel panic 和 kernel Oops
  6. 对于多属性类型系统的数据库设计
  7. 557. 反转字符串中的单词 III golang 数组和字符串反转
  8. 源码包安装mysql5.6_源码包安装mysql5.6
  9. 关于mysql单表支持的最大大小
  10. Android开发笔记(五十七)录像录音与播放
  11. Educational Codeforces Round 9 B. Alice, Bob, Two Teams 前缀和
  12. python爬取拉勾网_python爬虫—爬取拉钩网
  13. hdu1426 Sudoku Killer
  14. 单片机c语言跑马灯实验报告,单片机跑马灯实验报告
  15. MySQL做学生考勤系统_Jsp+Ssh+Mysql实现的Java Web学生考勤管理系统
  16. 网络安全-SQL注入原理、攻击及防御
  17. 计算机网络总是识别不了怎么办,电脑连wifi总是正在识别怎么办
  18. Android蓝牙开发前序知识-经典蓝牙低功耗蓝牙区别
  19. 计算机函数说课ppt,《excel公式与函数》说课稿
  20. 网络摄像机-ISP基础一

热门文章

  1. C练题笔记之:Leetcode-第 85 场双周赛---6157. 二进制字符串重新安排顺序需要的时间
  2. 有这3种情况,你就该离职了!
  3. Nginx网站服务配置(Nginx服务基础,访问状态统计,访问控制,虚拟主机)
  4. c++实现二分查找法和求平方根
  5. 狼性团队五要素:沟通+信任+慎重+换位+快乐
  6. 自学单片机好找工作吗?会单片机能找什么工作?
  7. Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架
  8. Maven的Mirror的详细说明
  9. ie11对象不支持此属性和方法 ie11的缓存问题
  10. 基于APS的供应链计划管理的类型阐述