记一次面试

    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分钟

 

 

你可能感兴趣的:(前端,面试总结)