2019.7.16日 天气:暴热暴晒,撑着伞都顶不住... 今天去面试前端实习生,到公司后就直接开始写笔试题目,然后写完后,与面试官进行交谈,发现自己的一些不足,然后后续自己需要对这些知识进行回顾和加强。 面试的面试官非常的nice,很友好并且还会逐渐指导你,引导你去对一些题的知识进行思考以及扩展知识考查等。
总结一下,自己的js部分还是存在许多问题, 对知识点的理解不够透彻,自己的练习+理解还不够, 还需多加练习,值得一提的是,没有了编译器的自动提示等,自己很蒙蔽,所有就是得多手写代码,自己多练练。 (ps: 回去之后自己得每天20分钟 + 手写js代码练习(┬_┬) )总之,面试一次收获很多,反应自己的许多不足。
举例一些题目:
下面是JavaScript的一个题目:
var a = 10;
var b = 20;
(function(){
var a = b = 100;
var c = 200;
})();
console.log(a);
console.log(b);
console.log(c);
答案分别是: a = 10, b = 100, c输出报错,c未定义
题目:
var a = 100; //全局作用域
function foo(){
// var a 的声明将被提升到函数的顶部
console.log(a); //打印undefined
var a = 200; //local scope, 实际初始化值200只发生在这里
}
foo();
答案: 输出undefined
将var 换成let
var a = 100;
function foo(){
console.log(a);
let a = 200;
}
foo();
答案: 报错 ==> ReferenceError:a undefined
console.log(1);
setTimeout(function(){
console.log(2);
},100)
setTimeout(function(){
console.log(3);
}, 0)
var promise = new Promise(function(resolve, reject){
console.log(4);
resolve(5);
console.log(6);
});
console.log(7);
promise.then(function(value){
console.log(value);
});
输出: 1 4 6 7 5 3 2
JavaScript是单线程运行的,无法同一时候运行多段代码。当某一段代码正在运行的时候,全部兴许的任务都必须等待,形成一个队列
旦当前任务运行完毕,再从队列中取出下一个任务,这也常被称为 “堵塞式运行”。所以一次鼠标点击,或是计时器到达时间点,或是Ajax请求完毕触发了回调函数。这些事件处理程序或回调函数都不会马上运行,而是马上排队。一旦线程有空暇就运行。假设代码中设定了一个 setTimeout,那么浏览器便会在合适的时间。将代码插入任务队列。假设这个时间设为 0,就代表马上插入队列,但不是马上运行,仍然要等待前面代码运行完成。
所以 setTimeout 并不能保证运行的时间。是否及时运行取决于 JavaScript 线程是拥挤还是空暇。
ES6 Promise对象中有三种状态: pending(进行中)、 fulfilled(已成功)、 rejected(已失败)只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和 从pending
变为rejected
。
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise
实例生成以后,可以用then
方法分别指定resolved
状态和rejected
状态的回调函数。
所以这题先输出1, 然后到Promise新建后立即执行, 所以接着输出 4, 6 ,7; 然后,then 方法 指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以接着输出 5; 此时线程已经变为空暇, 轮到setTimeout的输出了, 然后输出3, 2
所以综合输出: 1 4 6 7 5 3 2
1. 桌面上有100枚硬币,两个人在玩游戏,然后每个人轮流取硬币,取硬币数目为 [1, 5],即每个人最少拿一枚硬币, 最多拿5枚硬币,问最后谁取走硬币则谁赢,询问是否有必胜方法等?
答: 在面试官的指导下,逐渐推导出规律和致胜方法; 一开始以为是要手写个数据结构或者是算法,心想当个算法题来思考了,自己蒙了下,还在想着快速排序或者说找出规律,然后写出核心算法什么的.... 实际上考察的是思维逻辑能力和应变能力等吧。
回去再思考了下: 其实就是 最少的 + 最多的数字 = 形成关键数字, 然后再看规则等。
找出关键的数字: 6, 然后推到100枚硬币是逐渐让自己处于6的倍数, 让对方拿,然后自己拿剩下的,就是必胜方法。先手优势很大, 让我想到下五子棋中,无禁手的黑子先手。
2. 自己发现一道有趣的智力题: 一根粗细不均的绳子完全燃烧要一小时, 如何用它来测量75分钟时间?
解决方法:
取来三根绳子,绳子A,B, C;现将 A 绳子的两端同时点燃,需要的时间是半个小时,
然后将B , C绳子点燃,B 绳子点燃两端,C 绳子点燃一端,
等 B 绳子烧完之后时间是半小时, 再点燃 C 绳子的另一端, 等C绳子两端同时燃烧,烧完的时间是15分钟,这样子测的时间是 30 + 45 = 75分钟