前端面试笔试题 异步获取数据是什么?异步获取数据怎么理解?怎么实现的?

异步获取数据是什么?异步获取数据怎么理解?怎么实现的呢?

 

你妈妈烧饭的时候让你去打酱油,你出去打酱油的时候,你妈妈等着,啥事儿也不做,这个叫同步。

如果你打酱油的时候,你妈妈做别的事情了,这个叫异步。

就是说一件事做完了再做另一件事,叫同步。几件事同时做,叫异步。类似物理电学的串联并联。

串联(同步)
并联(异步)。

 

你到后台去获取数据是需要时间的,在数据返回来之前,你可以干别的事情。这个就是异步获取数据,如果你同步获取数据,在后台数据返回来之前,页面就是卡住的。

 

   一个问题一个问题解决。学习是按部就班做数学各门科目的作业书。讲义。

 

 

 

 

 

 

 

前端面试题

高级前端面试题

 

 

面试题目一

  1. 跨域的基本概念和解决方法,在项目中的实际应用。
  2. JS事件循环和Node事件循环,两者有何区别。
  3. BFC,块级格式化上下文。
  4. 强缓存和协商缓存,缓存的应用,如何用在页面性能优化上。
  5. ES6新增特性。
  6. async await如何利用generator实现。参考
  7. 移动端点击穿透问题。
  8. Vue2.0与Vue3.0双向绑定,proxy实现。
  9. 爬虫方面问题,反爬如何实现,针对反爬的实现(IP代理等)。
  10. 图片懒加载具体实现方案和思路。
  11. 实习难点,收获。
  12. code review需要注意的点,你做code reivew的话,会重点查看哪里,怎么写出高内聚,低耦合的代码,以实习中遇到的一个通用组件实现举例。
  13. 未来规划,如何学习前端的,自己感兴趣的前端方向是什么。

面试题目二

  1. 常见攻击,CSRF是什么,如何防范,token产生策略。
  2. React Fiber原理。有什么优势。
  3. React生命周期,React16.3版本后变化,为什么要这样做。(结合React Fiber),有哪些不安全的生命周期。
  4. JS事件循环。
  5. 两列布局实现。
  6. 函数防抖,节流实现,不同方案实现。
  7. 二面主要在扯实习的事情,问了Redux原理,实习难点啥的,编程题实现一个EventBus和手写一个深拷贝。

面试题目三

  1. 弱网环境下页面首屏如何快速加载
    1. 方案:1.缓存的使用 2.SSR使用 3.骨架屏使用
  2. 跨域问题和解决方案
  3. 宏任务和微任务区别。
  4. node是IO密集型体现在哪里。
    1. 从node异步的角度来回答这个问题。
    2. 参考点这里➡️ https://www.jianshu.com/p/c28219029c65
  5. http2 http3优化点在哪 https建立连接过程
  6. 函数式编程思想的体现。
  7. 25匹马、5个赛道,怎么用最少的次数决出前三名
  8. CSRF攻击问题。
  9. 目中遇到的问题,重点说了下爬虫遇到的问题,如何解决反爬的。
  10. 实习遇到的问题,如何沟通,解决。
  11. 个人规划。

面试题目四

  1. js实现继承。
  2. 闭包。
  3. js事件循环。
  4. vue双向绑定实现原理。
  5. vue中指令的使用。
  6. vue中nextTick的原理。
  7. 虚拟dom以及diff算法。
  8. 错误监控方法。
  9. 页面加载会触发哪些事件。
  10. babel源码。
  11. setState原理。
  12. 实现一个EventEmitter类,支持事件的on,off,emit,once,setMaxListeners。
  13. document.ready和window.onload的区别。
  14. webpack loader和plugin区别。
  15. 打包gulp.webpack,rollup一些区别。
  16. webpack中循环引用问题,a里面引用了b,b里面引用了a. 
    1. 解决方案 ⬇️
    2. https://blog.csdn.net/gaoqiang1112/article/details/105412329
  17. CICD,如何实现一个自动化部署工具,结合github中的webhook机制。
  18. 全排列算法的实现。
  19. 斐波那契算法。
  20. 实习遇到的困难。实习期间干的事情。

面试题目五

  1. 1px问题。
  2. 浮动解决的方案。
  3. js基础类型,如何判断,有什么方法。
  4. 闭包问题。
  5. node事件循环。
  6. 进程和线程区别。
  7. cpu调度算法。
  8. 2台计算机底层之间如何通信 socket IO通信实现。
  9. 计算机网络中,http地址,在7层协议中,如何一步步向下解析,从应用层到最底层的物理层,每一层处理的事情。
  10. 位图和矢量图的区别。
  11. cookie中常见的字段。
  12. 同源策略。
  13. http中一些常见的响应头和请求头,有什么应用。
  14. 简单请求和非简单请求区别。
  15. 函数式编程思想。
  16. 如何自己实现一个单点登录系统。
  17. ts自己的看法,和应用。
  18. react fiber原理。
  19. http2.0 http3.0分别改进了什么
  20. 手写diff。
  21. 手写Promise.All()
  22. 算法题:版本号比较
    1. https://leetcode-cn.com/problems/compare-version-numbers/
  23. IP地址复原
    1. https://leetcode-cn.com/problems/restore-ip-addresses/


文章就分享到这,欢迎关注“前端大神之路

 
好文要顶 关注我 收藏该文  




 

技术大神   转

随笔 - 317  文章 - 1  评论 - 10  阅读 - 25万

RequireJS入门指导 (转)

最近在百度实习做的一个项目用到了 Require JS 这个库,之前从来没有了解过,经过一番大概的搜索后找到一篇非常不错的文章,看完后能够让你对 Require JS 的运行机制、使用方法以及为什么使用 Require JS 有一个基础的认识。下面我就对这篇文章进行一个简单的翻译,如果有错漏的地方希望指正。

原文链接:http://undefinedblog.com/primer-for-require-js/

谁适合读这篇文章

对 JavaScript 有一定的了解,写过一定规模的 JavaScript 代码,尤其能够掌握 JavaScript 匿名函数、回调等概念,并希望了解 Require JS 的用法、概念、意义等。

一些基本信息

Require JS(官网) 是一个 JavaScript 文件或模块的加载器,它可以根据不同页面对不同模块的需求,按照你的设置依次加载并执行所有的 JavaScript 文件。使用 Require JS 主要有两个目的:

  • 解耦代码,方便代码重用和管理
  • 加速页面加载,内置优化引擎(需服务器支持),自动异步加载依赖项,将所有需要加载的文件自动合并为一个文件,减少 HTTP 请求

Require JS 同时支持整合 jQuery、CommonJS、Node JS 等,而且对浏览器有不错的兼容性(IE 6+,你懂的)。

 

没有 Require JS 的时候

下面我们将以一个没有使用 Require JS 的模块开始,讲讲如何将你的代码解耦并使用 Require JS 来加载:

复制代码
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
    <title>Phase 1</title>
</head>
<body>
    <div>
        <h1>Modular Demo 1</h1>
    </div>
    <div id="messagebox"></div>

    <script src="../Scripts/jquery-1.8.2.min.js" type="text/javascript"></script>

    <script type="text/javascript">

        var baseUrl = '/api/messenger/';

        function ShowMessage(id) {
            $.ajax({
                url: baseUrl + id,
                type: 'GET',
                dataType: 'json',
                success: function(data) {
                    $("#messagebox").html(data);
                }
            });
        }

        var id = 55;
        ShowMessage(id);

    </script>
</body>
</html>
复制代码

 

以上是一个很简单而且很常见的 ajax 请求页面,可以看到这个页面里的代码虽然简单,但是耦合度很高,下面我们将其中的 JavaScript 代码解耦,把不同的模块独立出来。

复制代码
//模块1,全局设置模块  
        var config = (function() {
            var baseUrl = '/api/messenger/';

            return {
                baseUrl: baseUrl
            };
        })();

//模块2,请求数据模块
        var dataservice = (function($, config) {
            var callApi = function (url, type, callback) {
                    $.ajax({
                        url: url,
                        type: type,
                        dataType: 'json',
                        success: function (data) {
                            callback(data);
                        }
                    });
                },
                getMessage = function (id, callback) {
                    url = config.baseUrl + id;
                    callApi(url, 'GET', callback);
                };

            return {
                getMessage: getMessage
            };
        })($, config);

//模块3,封装的一个 messenger 模块,显示 ajax 放回的数据
        var messenger = (function ($, dataservice) {
            var showMessage = function(id) {
                dataservice.getMessage(id, function(message) {
                    $("#messagebox").html(message);
                });
            };

            return {
                showMessage: showMessage
            };
        })($, dataservice);

//模块4,匿名函数,传 id, 调用 messenger 的showMessage() 方法 (直接执行)
        (function (messenger) {
            var id = 55;
            messenger.showMessage(id);
        })(messenger);
复制代码

 

将这些代码放到原来的、没有重构前的页面中去,将实现同样的效果。但是我们将这些功能独立出来后,就可以很好的重复利用部分代码。

下面假设我们将这 4 个模块放到 4 个独立的 js 文件中:

  • 模块1:config.js
  • 模块2:dataservice.js
  • 模块3:messenger.js
  • 模块4:main.js

这样,在我们的 html 页面中,我们需要依次加载这 4 个模块:

复制代码
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
    <title>Phase 1</title>
</head>
<body>
    <div>
        <h1>Modular Demo 1</h1>
    </div>
    <div id="messagebox"></div>

    <script src="../Scripts/jquery-1.8.2.min.js" type="text/javascript"></script>

    <script src="config.js" type="text/javascript"></script>
    <script src="dataservice.js" type="text/javascript"></script>
    <script src="messenger.js" type="text/javascript"></script>
    <script src="main.js" type="text/javascript"></script>

</body>
</html>
复制代码

 

这个时候,代码一样可以工作的非常顺利,没有任何问题。但是需要考虑一个问题:js 文件的加载顺序。当一个模块2需要依赖模块1中的功能时,必须要求模块1加载完成后再执行模块2中的代码。对于简单的代码(如本文涉及的仅4个模块)还好考虑,若有数十个模块需要加载,那么依赖的顺序一旦处理出错,很可能就会报 xxx is undefined 错误。

这个时候就是 Require JS 需要大显身手的时候。

Require JS 的基础操作

定义模块

复制代码
define(['jquery'],  
    function ($) {
        var text = 'I am a module',
            showMessage = function() {
                $("#messagebox").html(text);
            };

        return {
            showMessage: showMessage
        };
    }
);
复制代码

 

可以看到,一个 JavaScript 模块(如上面提到的 config、dataservice、messenger 等),都被一个 define() 函数包起来。

其中 define() 函数接受 3 个参数:

  • 模块名
  • 依赖项,以数组形式传递
  • 模块内容

但是注意,上面的模块定义中,我们并没有传 模块名 这个参数,理由如下:

Require JS 会自动根据文件名(不含后缀名,即不含 ".js")来给定义的模块命名,这样在最后优化(将所有的 js 文件合并为一个)时就能自动调用所有的文件。如果你显示的给定义的一个模块命名了,那么在日后进行修改时(比如改动了文件名或模块名),Require JS 将无法自动加载。因此最佳实践是:不要显式的定义模块名,让文件名成为默认的模块名,方便 Require JS 管理。

说完了第一个参数,再看看第二个参数 依赖项。依赖项我们传递的是一个字符串数组,每个字符串均代表要实现本模块的功能,需要预先加载的其他模块的模块名。如上例中我们的依赖项就是 jquery。

最后一个参数就是我们需要定义的模块内容。在上例中,我们的模块是一个 function,其中函数的形参即为对依赖项的引用。比如我们的模块有两个依赖项:

define(['moduleA','moduleB'],function(a,b){  
        //a.blabla(); b.blabla = ooxx;
});

 

就可以在模块中分别使用形参来调用我们依赖的模块。需要注意的一点是,依赖项的书写顺序和在模块定义的函数中的形参顺序要一致。

另外,Require JS 定义的模块并不一定是 function,也可以是普通的对象,详见 Require JS 文档

将解耦后的代码改写为 Require JS 模块

我们在上面把一个简单的 ajax 调用解耦成 4 个独立的模块,下面我们就把这 4 个模块根据 Require JS 定义模块的风格进行改写。

复制代码
//config.js  
define([],  
    function () {
        var baseUrl = '/api/messenger/';

        return {
            baseUrl: baseUrl
        };
    }
);

//dataservice.js
define(['jquery', 'config'],  
    function ($, config) {
        var
            callApi = function (url, type, callback) {
                $.ajax({
                    url: url,
                    type: type,
                    dataType: 'json',
                    success: function (data) {
                        callback(data);
                    }
                });
            },

            getMessage = function (id, callback) {
                url = config.baseUrl + id;
                callApi(url, 'GET', callback);
            };

        return {
            getMessage: getMessage
        };
    }
);

//messenger.js
define(['jquery', 'dataservice'],  
    function ($, dataservice) {
        var showMessage = function (id) {
            dataservice.getMessage(id, function (message) {
                $("#messagebox").html(message);
            });
        };

        return {
            showMessage: showMessage
        };
    }
);

//main.js
(function() {
    requirejs.config(
        {
            paths: {
                'jquery': '../Scripts/jquery-1.8.2.min'
            }
        }
    );

    require(
        ['messenger'],
        function(messenger) {
            var id = 55;
            messenger.showMessage(id);
        }
    );
})();
复制代码

 

你可能注意到了 main.js 中定义模块的方式似乎不同于其它 3 个模块。没错,因为严格意义上来说,main.js 是调用了其它 3 个模块的功能并最终获得数据。因此下面就要引出怎么在定义了 Require JS 模块后最终设置和调用的问题。

设置和调用模块

Require JS 对于模块的设置和调用提供了两种方式:

1、定义一个 script 标签,并增加 data-main 属性,指向我们的设置文件;同时添加 src 属性,指向 require-js.js 文件(即主库)

<script data-main="main.js" src="require-js.js"></script>

 

2、先引入 Require JS 库,再显式的设置

复制代码
<script src="require-js.js"></script>  
<script>
require({  
        baseUrl : 'scripts', //设置查找所有模块的根目录
        paths:'',//如果在 baseUrl 下没有找到相应的模块,则加上 paths 继续查找
        shim:{},//加载依赖项,传对象
});
require(['dataservice.js']); //加载完上述所有依赖项后,再加载自己编写的模块  
</script>
复制代码

 

详细参数见 Require JS 文档

以上就是 Require JS 的一些简单使用方法和实践,话再说回 iOS 开发……很快回归!

 

 
分类: Require.js
好文要顶 关注我 收藏该文  
0
0
 
 
 
« 上一篇: 我始终相信努力奋斗的意义
» 下一篇: requirejs之demo (转)





 

随笔 - 317  文章 - 1  评论 - 10  阅读 - 25万

我始终相信努力奋斗的意义

圈子里很多朋友如今都会笑着说:“鸡汤,还不就那样,今天激动了,冲动两三天,后面,该吃吃该喝喝,原来那样如今依旧那样。”

 

类似这种情况,很多人提起努力这个词的时候,总是以一种过来人的姿态,嗤之以鼻。

 

或许努力很久很久,也才只有百分之一的可能会获得自己想要的那个结果,但是,扪心自问,你真的努力了吗?

 

我指的努力,不是你嘴上喊着努力,却依旧熬夜追剧看漫画。其实,只有你自己清楚你到底有没有在努力。

 

身边一直有人每天都喊着要学ps,要学网页制作,要学视频剪辑......

 

一个月过去了,两个月过去了,貌似什么变化都没有,依旧睡着懒觉,玩着游戏,追着韩剧。

 

简单的说,我认为努力的第一要素,就是过得不舒服。

 

大概大部分人依旧记得自己高考时的状态吧,我高三的那一年,记忆特别清楚,在当时,我觉得那个时候特别辛苦,有时候自己背书背得会哭起来,是真真正正地哭出来。在深夜两三点,不断地重复记忆那些似乎枯燥的,没意思的历史事件,历史书上,有着各种各样的扩充知识点,蓝红黑三种颜色的记号笔把整本历史书填充的密密麻麻。

 

身边朋友考研,图书馆开门他就去了,图书馆关门他才回来,不带手机,不带电脑,带着的只有一本又一本厚厚的笔记本,陪着他的也只是那些极其枯燥无味,在生活中可能一辈子都用不到的理论。

 

顶着寒风去早读,自然没有躺在被窝里睡懒觉舒服;

 

看那些枯燥无味的理论,自然没有追韩剧,玩游戏舒服;

 

在图书馆呆一天,自然不会比在宿舍玩手机,看小说舒服;

 

跟着网上视频学习自己从来没有接触过的ps,视频剪辑,一定没有刷刷微博,看看段子舒服;

 

你问问自己,是不是因为过得太舒服了,所以才喜欢一路安逸地走下去。

 

早上睡到八九点,去上两节课,然后吃饭,回来玩电脑,打打游戏,时间富裕,再找个妹子谈谈恋爱,逛街吃饭看电影。

 

不满足现状,内心隐隐不安,觉得自己什么都不会,也没什么特长,却又喜欢现在的安逸,不用操心什么,每天吃吃喝喝就过去了。

 

古人说,生于忧患死于安乐,当然是有道理的,生活太安逸,太轻松,一定是会消磨你的斗志的。

 

第二,大概是要找到自己喜欢的东西了

 

说句实话,无论如何,这漫长一生总是会过去的,但是我希望,趁着还有时间,精力的时候,去做那些喜欢的事情。

 

热爱这个东西,真的有意想不到的力量。因为喜欢本身就把所有不舒服的事情变得有意思了。

 

我本人最讨厌熬夜,但是最开始接触音频剪辑的时候,简直没日没夜地剪,一天可以只睡四五个小时,每天都熬夜到两三点,但是第二天依然精神奕奕。

 

身边朋友喜欢写东西,接触到网文的时候,泡到电脑上,一天能码字上万。

 

因为在做喜欢的事情,所以熬夜,早起都不算什么了。

 

在你努力做自己喜欢的事情中,就已经感到开心了,最后得到的成果,反倒是意外之喜了。

 

但是我想很多人,恐怕连自己喜欢的事情都没有找到吧?

 

没关系,没有喜欢的事情,就去找自己感兴趣的事情,不了解,没接触过都不要怕,正是因为不了解,所以才有趣啊。

 

在这未知的世界,努力去做那些喜欢的事情,不要闲下来,把所有的时间都用到自己喜欢的事情上,不要怕没结果,不要怕没成功,最怕你一生碌碌无为,还安慰自己平凡可贵。

 

认真,努力的做某件事情的时候,最后无论结果如何,但你一定真真正正喜欢那种充实感。

 

为了梦想,为了喜欢,拼命去做,那都是相当的可爱。

 

第三,大概你如果不想为自己努力,但是有想过身边的人吗?

 

并不是每个人生下来,就有数不清的人脉圈子,铺好了前进的路,其实我们都清楚,我们只是这个世界上,最普普通通的一个人,不是富二代,也不是官二代,每走一步都要用血和泪去换,有时候或许还没走,就开始倒退。

 

很多人走几步,就不想动了,因为觉得特别累,如果你只是一个人,你当然可以不努力,但是,我们不是一个人,我们还有身边的人。

 

去年春节放假,心里想着要给老妈带点东西,在街上逛着的时候,下狠心买了一件略贵的衣服,拿给老妈的时候,忘记把吊牌撕了。

 

整整被老妈念叨了三四天,总说要拿去退,太贵了。我一脸鄙视的样子,说不能退,让她穿着。

 

整个春节,那件衣服老妈就穿了一次,还是大姨小姨全家来我们家拜年的时候,她们都说衣服好看。老妈则是一脸喜气地说,是我买的,我的眼光好,说这话的时候,眉角止不住地上扬。

 

那时候,不知道为什么,我感觉挺心酸的。

 

放假结束,刚刚回公司,手机短信就提示汇款5000块到账,看见那条短信,我就知道是我妈把钱打给我了。

 

过了一会,我妈的短信就发过来了“在外面上班都挺不容易,别老给我乱花钱了,我在家挺好的,吃得好,喝的好。”

 

国庆回家,发现那件衣服挂进衣柜里,就像没穿过的一样。

 

当时莫名难过了很久,突然就想到小时候,家里挺穷的,爸妈都特别省,我印象里,老妈都没买过新衣服,大姨小姨有时候会拿些旧衣服过来,老妈高兴得和捡了宝一样。

 

这么多年,老妈依旧特别的省,但是对我,却特别舍得用钱,凡是我想要的小玩意,小零食,她总会尽可能给我最好的。

 

不努力奋斗,我又拿什么给她最好的呢?

 

无论最后结果怎样,我都始终相信努力奋斗的意义。

 

你努力了,你就不愧对自己的热血;

 

你努力了,你就不愧对你曾经经受的坚苦日子;

 

你努力了,你就不愧对身边的人。

 

就怕你加班熬夜一次,就嚷嚷着黑心老板,出头无望。

 

就怕你失败一次,就嚷嚷着自己是金子却无处发光。

 

就怕你应酬喝酒吐了几次,就嚷嚷着社会黑暗,没钱没权,就想放弃。

 

世界纷纷扰扰,你过得舒服吗?你真的在为自己喜欢的事情努力吗?

 

如果你被生活磨掉了棱角,你被现实打败了,希望你同样相信努力奋斗的意义,不要辜负自己,更不要辜负身边的人,岂能竟如人意,但求无愧于心。

 
分类: 程序人生
好文要顶 已关注 收藏该文  
« 上一篇: RequireJS进阶(三) 转
» 下一篇: RequireJS入门指导 (转)
 





记拿到鹅厂前端开发暑期实习offer的经历

 

想起来时的路


在真正拿到腾讯实习offer之前,也是看过不少人的面经,心生向往。很早在入前端坑之前,我就想着大四的时候有机会要尝试去腾讯里实习。

大一入门语言就是C++,这让我很无奈,所以我很快的就抛下忘记了,留下的只是一堆基本编程和它的面向对象的概念。那会儿我喜欢听摇滚乐,民谣,组乐队,玩音乐。其实玩音乐的人理想才是最让人崇拜的,那种自由,那种对生活的追求。可是我知道自己并不能上道,于是学会了吉他和一丢丢的架子鼓,就开始回到了编程学习。选前端真是无意中的,我只是随手买了一本HTML5的书,然后觉得CSS也不错,最后才知道有Javascript这个东西。后来随着逐步的深入,已经开始心生喜欢。

我知道有很多书都是骗钱的,于是我去豆瓣,去亚马逊认认真真比较。买了我第一本最重要的书《Javascript高级程序设计》。接下来的整个暑假,我在没有网络的新家里,每日每夜琢磨书上的知识点,因为它真的很奇葩。后来接触到知乎,自己的前端水平的深度和广度的视野也就跟着上来了,就开始知道前端这水非常深。你现在还可以在百度贴吧,看到一堆人求各种JQuery插件,或者一堆问怎么学有没有前途,却始终不肯开始行动的人。我开始知道了前端要解决各种以前从来不会有的问题和各式各样的新技术。例如:

  1. 自动化工程
  2. 模块化加载
  3. Node.js
  4. MV*框架
  5. 预处理器
  6. 还有程序员的各种学科素养,计算机网络,数据结构等

还要学会看书,很多人自学就只能接受看视频。其实也很简单,因为你并不热爱它,所以看书对你来说实在太无聊了。我到现在为止买了很多本书,大部分都是图灵的动物书,很多书我都认真看过,有的还看不懂。图灵有一句话:站在巨人的肩膀上。这是真的,他们留下来很好的经验和最佳实践都在书里,不看就真的是莫大的损失。其实这些都需要你的热情,因为没有热情的人,很难适应前端变化这么快的环境。

我个人是不畏惧新技术的,因为新技术会让我觉得很酷,那种感觉就是你可以和老外的那帮极客一起玩新的东西,不会让我觉得落伍。我也可以和很多还一直认为前台美工是混在一起的"井底之蛙"们,普及一下最新的技术和未来的发展趋势。特别是听到大学老师也逐步开始推荐大家要去尝试了解Javascript,这让我不断坚定自己的想法,做一个很酷的前端。

于是我开始不断开拓自己的视野,不局限前端于酷炫的页面效果。因为学校团队大部分还是以安卓和开发网站为主,他们其实并不能提供我想要的实践项目和前端专业指导。我只能在我闲暇之余,做一些自己想象的App。我用的Node的express框架,从Backbone玩到Angular,不断积累总结踩坑。一路上挺孤独的,因为身边的大部分都是java的程序员,他们很难知道Javascript有怎样的变化。

腾讯面试


一直到现在,我都觉得不可思议。可能因为确实来的比其他人轻松幸运。在4.7号那会儿,一位腾讯的老师说想和我单独聊聊,看看我有没有能力走内推。或许是因为我简历写的很多前端比较前沿的东西,又或者是看到了我在cnblogs里的大半年的积累,还是github里一些自己写的小项目。他给了我第一轮的电话面试,问了很多东西,都是前端我感兴趣也接触过的东西,所以我能发表自己体验经历的感受。比如各个MV*框架,前端模板引擎,自动化工具。但是到最后,问到了web安全方面,关于XSS和CSRF我是不甚了解的。只知道很多特殊的符号要通过转义显示出来,来防止恶意的代码嵌入。基本上是一问三不知~T.T。但是面试官很好人,他说让我好好写一份简历,应该是交给二轮面试官。

我之前知道二轮面试一般来说,都是技术面,如果遇到很苛刻的人,可能会劈头盖脸一堆算法和脑筋急转弯的题目。我也是揪心了很久,看了很多之前写的递归算法和排序算法。可是幸运的是,二轮面试官yg老师并不是这样的,他希望听到我对前端开发的见解,他想知道我是否喜欢并了解这个岗位。他和我说:“实习生,我更希望他们会思考”。后来yg老师出了个任务给我,让我尝试一下,一个多人web聊天室搭建的整个过程。我需要一个人,前端后台数据库的全栈开发。我当时其实心里,只是大概知道该用什么技术来做这个webApp。但是我和他说,简陋的聊天室,我需要用一个星期的时间。后来想想,这个简直是我在逼我自己

后来我选用了meteor框架搭建,我并没有用过它,但是因为它是基于Node.js架构的,MongoDB做数据库,是一个有socket.io的实时平台,所以我打算借此机会练练手。我推掉了团队一个星期的工作,一边上课,一边抽时间专研meteor。至于学习meteor的过程我就忽略不说了,基本上就是百度,stack overflow,这样子下来的。因为之前做过Backbone,对Meteor的View上的数据渲染和事件绑定都是比较清楚的。搭过express,对路由和模板渲染,Mongo数据库的使用也是挺清楚的。唯一让我花费了很多时间去理解的,便是本地数据库与远程数据库之间的关系。有兴趣学Meteor的同学,也可以关注一下,绝对大开眼界。

总之,我之前自己做的小玩意儿,自己踩过的各种小坑,这一会儿都多多少少派的上用场。后来用了4天的时间,我就做完了最基本的需求,登陆用户,单人会话,发起多人群聊。后来我给我女朋友看的时候,她对我说这个和微信差不多啊,没什么特别的,哈哈哈。在这个期间,每天向面试官报告进度的时候,面试官也是挺满意的~我知道自己已经离机会不远了。

后来的Hr电话面试也是在轻松愉快的氛围中结束的,过了一个星期,我就接到了电子offer。正式宣布我靠我的运气和一丢丢的实力,拿到了腾讯暑期实习的offer。

接下来的安排


我找回第一轮的面试官,田老师。我说感谢他给了个机会我。他就开始分配实习前的任务给我,主要是关于Node.js的。

  1. 熟悉Node.js
  2. 掌握异步编程,了解并区别async,promise,Generator
  3. 看实现Generator迭代的库co的源代码

我听到之后,非常开心,因为确实也只有非常好的平台才会给我机会去实践这些Js前沿技术。我现在也在不断学习中,希望到时候暑期实习时,可以得到更多更宝贵的东西。

后记


不得不说,运气也是一种实力。

谢谢4月份走运的我。

我需要更努力来证明自己并不仅仅是因为运气,哈哈。

 
分类: nothing
好文要顶 关注成功 收藏该文  
 
 
« 上一篇: Javascript事件处理进阶
» 下一篇: (翻译)异步编程之Promise(1):初见魅力




巽秋

 

腾讯2018日常实习一面(电话面试)

 

以此文纪念笔者人生中的第一次面试,也就是腾讯日常实习的远程面试。说实话,是真的紧张,到现在都还有点懵。

回过神来,决定记录下这次面试的过程,以便日后的回顾。

 

首先,我是在腾讯招聘官网投递的简历。简历状态变更,到给我发消息约定面试时间这个过程大概过了五天左右。

面试时间是询问我后,约定在次日的晚上九点。由于在笔者的学校这里没有腾讯的面试点,所以是远程面试。而也如前辈们的经验一样,远程面试的一面一般都是电话面试。

在晚上八点五十左右,笔者找了一间空教室,坐等面试官的电话。我大概等了十几分钟,九点十分左右接到了面试官的电话。(等的时候慌得一匹。。)

下面进入正题,即面试问了什么

 


 

1.首先面试官让我介绍了一下学过什么内容,这里就自己回答自己会的,而且比较有把握的方向。(因为后面的面试问题基本上都是围绕你所回答的这些东西来问的)这里笔者回答了基础的HTML、CSS、JS之外就说了node.js、Vue、和Bootstrap。

2.在回答了这个问题后,面试官的问题是“请你介绍一下你对html5,和css3这些新的内容的了解。”笔者就回答了htlm5的script标签上的crossorigin属性,并大概解释了一下这个属性是干嘛的。然后又说css3的动画,子类选择器等(nth)。

3.面试官又接着问:“那你对Js的新规范有所了解吗?比如ES6、ES7等”我说了解过一些,就举了箭头函数和promise,我说了promise过后面试官就问我是怎么处理promise的嵌套的,我说用.then的方式(这里感觉应该是回答错方向了),面试官又问那你怎么处理promise中的if,else 我当时有点慌,因为我对promise的理解不是很深,做过的项目中也基本没用到这个(汗颜)他一深问,我就有点慌。再加上确实也不太了解,思索了一会过后我就只能说确实不太了解,在遇到这种情况的时候一般都不是用promise解决的,都是用递归判断情况这样子。面试官哦了一下,说了解了。(就是从这里笔者开始慌了,感觉后面回答的问题逻辑性都不是很强,目测会凉凉)

4.然后面试官的下一个问题是“你做过移动端的项目吗?是怎么调试的。”这个问题很尴尬的又快要涉及到笔者的知识盲区了,我只能说没怎么做过,但是我做PC端响应式的时候,是用浏览器的模拟器调试的,然后他又问“如果你发现一个页面,在移动设备上的展示效果和模拟器的效果不一致,这个时候你又是怎么调试的?”我是真没做过移动端,然后只能尴尬的说我不太了解这方面。

5.在上面那个尴尬的问题后,面试官接着问“你平时开发中,是怎么调试代码的?”这里笔者脑子有点短路,他问的时候强调了开发过程中,我就没有说下意识想回答的浏览器调试工具,我以为他想问的是怎么捕获页面上的错误等。我就说用一些错误捕获机制,将页面上的错误上传到服务器,然后我再去看服务器的日志这样子。虽然我回答偏了,但是面试官这个时候没有说我回答偏了,而是在这个基础上继续深问。“那你是用什么方式捕获页面上的错误的?”我就说用window.onerror,try catch 捕获js运行时错误,然后用object.onerrer,performance.entriec捕获资源加载错误。这里回答过后,面试官才接着问“你平时难道写代码都不用控制台的吗?”这个时候笔者才意识到刚才的回答跑题了,然后才说用啊,列举了一些基本的功能过后。面试官又问“那怎么在调试工具中,查看内存占用等信息?”我告诉他在哪里看后,他似乎问了个内存方面的问题,我说我对这个了解的不深,只在一次写排序算法的时候内存溢出,才知道内存在哪看来着。他表示明白过后就进入了下一个问题。

6.这一次面试官问我“你了解一些提升页面性能的方法吗?”我说了解,并且回答说在不花钱的情况下,我认为提升页面性能最好的方式是资源压缩,并且向面试官说明了原因。然后又说除此之外还可以JS异步加载,使用浏览器缓存,dns加速。这里停了一下,歇了口气时。面试官又问还有吗?我就说还有的就是要花钱的cdn加速了。然后面试官又问那你觉得那种方式提升最大,我回答的是cdn加速。在页面性能这个问题上,应该还是回答的比较完善了(个人感觉)

7.这里回答了页面性能后,面试官问的就是跟项目相关的一些问题了,比如用什么检测代码逻辑异常等(JSlint)我当时知道,但一着急忘了,硬是没想起。然后问了Vue的数据绑定是怎么实现的我说了是用object的definepropertise()中的get和set。然后面试官又问,还有其他的实现方法吗?我就说了个angular的脏检测,因为我也不是很了解,当他再问还有没有时,我就说应该还有只是实现起来应该没有这两种这么方便。然后他问我知不知道有个代理的方法,我说是不是proxy,他说是你知道怎么用吗?我这是真的不知道,因为这个函数我是在翻文档时看到过,能记得有这个东西就不错了,谁还记得这个东西应该怎么使用。。。。

8.然后最后的问题是关于我的上一个实习的,我就老实说了。问了一些比如遇到问题怎么解决啊之类的。我回答的是查文档,查博客如果两个都找不到就只能自己尝试。面试官似乎对这个回答不太满意,一直追问有没有其他解决方式。我是真的没想到,然后憋了一个如果身边有知道的就问身边的人这样。

 

这次面试到这里就结束了,大概40分钟的样子。我个人感觉不太好,写这篇文章的时候还没收到消息,感觉凉凉,虽然说感觉不好但没收到确切结果之前。心里还是有点小期待的。

 


总的来说,个人感觉就一句话 不要紧张!不要紧张!!不要紧张!!!(重要的事情说三遍) 

 
标签: 前端面试
好文要顶 关注成功 收藏该文  
 
 
« 上一篇: 基于nodemailer使用阿里云企业邮箱发送邮件(526错误的解决)
» 下一篇: Vue过渡mode属性踩坑
posted @ 2018-09-06 09:55  巽秋  阅读(6944)  评论(2)  编辑  收藏  举报
 

 
#1楼 2018-11-27 12:44 tequilaaaaa
楼主我也是推的日常实习,10月底一面官网更新状态为进入复试,但至今没有给我复试消息,求交流经验啊:qq 447224041
#2楼 [楼主] 2018-11-27 13:06 巽秋
@ tequilaaaaa
你好,我加你qq了




实习生4面美团Java岗,已拿offer!(框架+多线程+集合+JVM)

美团技术一面 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3、找到单链表的三等分点,如果单链表是有环的呢 用快慢指针,一个走一步,一个走三步。如果有环,先判断环在哪,找最后一个节点,然后用之前的无环的做法 4、讲一下项目的架构 我重点讲了MVC 5、说一下你熟悉的设计模式 我重点讲了单例、工厂方法、代理 5、有没有配置过服务器啥啥啥 这个我真不知道,都没听过呢,只能诚实说没有,毕竟都没法扯。 一面挺匆忙的,我估计面试官刚开完会还没吃饭呢。他说让我等,可能再找一个同事面我,可能就直接告诉我结果了。从一面面试官的声音和口吻,我判断他一定是个部门老大,问的设计偏多,后面hr告诉我他就是我要去的部门的老大。哈哈。 美团技术二面 跟一面比起来,二面面试官的声音听起来就像是搞技术开发的,果不其然,一个小时的纯技术电话面试!面的特别全面! 1、Spring:有没有用过Spring,Spring IOC、AOP机制与实现,Spring MVC 其实我挺不想被问到Spring的细节的,框架这些我都没有复习不太记得了。所以我对面试官说Spring里面的一些比较重要的机制我理解的还不错,然后我用一个实际的例子把我对IOC、AOP理解讲了一下,他听了说对,理解的不错(难得遇到一个边面试边能给反馈的面试官,好开心) Spring MVC其实我用过,我就对面试官讲了我的项目中用到的Servlet,jsp和javabean实现的MVC,以及MVC各个模块职责以及每个模块是怎么联系到一起的,最后我补充了一句我想SpringMVC的思想其实跟这个是一样的(他说对的,嘿嘿有反馈真好) 2、多线程:怎么实现线程安全,各个实现方法有什么区别,volatile关键字的使用,可重入锁的理解,Synchronized是不是可重入锁 这里我就主要讲了Synchronized关键字,还有并发包下面的一些锁,以及各自的优缺点和区别。volatile关键字我主要从可见性、原子性和禁止JVM指令重排序三个方面讲的,再讲了一下我在多线程的单例模式double-check中用到volatile关键字禁止JVM指令重排优化。 3、集合:HashMap底层实现,怎么实现HashMap线程安全 我讲了一下HashMap底层是数组加单链表实现,Node内部类,add的过程,Hash冲突解决办法,扩容,三种集合视图。HashMap线程安全的实现方式主要讲了HashTable、ConcurrentHashMap以及Collections中的静态方法SynchronizedMap可以对HashMap进行封装。以及这三种方式的区别,效率表现。 4、JVM内存管理,GC算法,HotSpot里面的垃圾回收器、类加载 JVM内存主要分为五个区,哪些是线程共享的,哪些是线程独享的,每个区存放什么。GC方面:怎么判断哪些对象需要被GC,GC的方法,Minor GC与Full GC。HotSpot GC算法以及7种垃圾回收期,主要讲了CMS和G1收集器。类加载:类加载的过程,Bootstrap classloader-ExtClassloader-AppClassloader,父类委托机制。 5、进程和线程的区别 从调度、并发性、拥有的资源和系统开销四个方面回答的。 6、HTTP有没有状态,我说无状态,怎么解决HTTP无状态 怎么解决HTTP无状态其实就是怎么进行会话跟踪,有四种方法:URL重写、隐藏表单域、Cookie、Session。 7、Java IO,NIO,Java中有没有实现异步IO Java IO实现的是同步阻塞,它是怎么实现同步阻塞的。我拿了read()方法举例来讲的。NIO实现的是同步非阻塞,我详细讲了一下Selector中的select()方法轮询说明它是如何实现多路复用IO的。然后对比了一下他们的效率。面试官可能看我对这一块比较了解,又继续问我Java中有没有实现异步IO,我感觉好像没有,但面试官说有,让我想想,其实这里我并不清楚啦,所以我就对面试官讲了一下我对Unix中异步IO模型的理解,然后说至于Java里面有没有我真的不太清楚。(他居然笑了!说你理解是对的,Java里面有没有不重要!哈哈) 8、前端会不会,Ajax是什么,Ajax实现原理 前端我只是会用一些js而已,用过jquery框架,问我Ajax全称是啥,我猜是异步的js和xml。Ajax实现原理其实我也不懂,我就只简单讲了一下它通过XMLHttpRequest对象进行异步查询,Ajax引擎在客户端运行,减少了服务器工作量。 9、让我设计一个线程池 因为我简历中有写到我对多线程、并发这一块理解比较好。所以他老问这方面的题。这个问题因为我之前看过ThreadPoolExecutor的源代码,所以我就仿照那个类的设计思路来想的,详细讲了一下核心池、创建线程可以用工厂方法模式来进行设计、线程池状态、阻塞队列、拒绝策略这几个方面。设计的还算比较周全。 10、讲几个设计模式,哪些地方用到了,为什么要用 单例模式,jdk中的getRuntime();工厂方法模式,ThreadPoolExcutor用到ThreadFactory;观察者模式:java.util包下面的Observable和Observer。最后主要讲了一下工厂方法模式的使用场景。 11、Mysql优化、索引的实现 我从数据库设计优化和查询优化两方面讲的。索引B+树实现,InnoDB和MyISAM主键索引的实现区别,一个聚集一个非聚集。 12、事务的隔离级别 四种隔离级别,可能会出现哪些异常,mysql中默认级别。 13、有没有用过Hibernate、mybatis、git 这个简单讲一下就好,分别是干什么的 14、Linux 我说这个本科学过,但是很久没用,命令忘光了。他说没事,考你几个简单的:cd、ls、dir(真的是简单的) 15、算法题 1、从10万个数中找最小的10个,时间复杂度分析(最大堆,考虑内存)2、从一个有正有负数组中找连续子数组的最大和,时间复杂度分析(动态规划)3、满二叉树第i层有多少个节点,n层的满二叉树共有多少个节点 终于到我提问环节了 1、你们是什么部门(他说是核心部门,大数据研发) 2、我对高并发和负载均衡挺有兴趣的,但是我平时在学校也没有这个环境让我在这方面有所体验,那你建议我目前可以怎么学呢(他说这确实是不太好学,只能看些理论和别人的博客,以后工作中才能慢慢学) 3、中间件具体是做什么的,是解决高并发和负载均衡吗(他说差不多是的,然后他说我们这个部门不是中间件,是大数据部门啊,我说恩我知道) 最后没啥问题了,他让我保持电话畅通。 这一面面完,口干舌燥,我一度怀疑他可能不知道我是在应聘实习生的岗位。有太多要总结的了,放在总结的地方一起讲吧。 美团技术三面 面试官说是他是另外一个部门的,需要进行交叉面试。 1、MySql优化 2、说下项目做了些什么,架构之类的 3、在collabedit上在线写代码,题目很简单是编程之美上的原题,一个有序的整数数组,输出两个数,使它们的和为某个给定的值。之前做过很快写好,然后给他讲思路。他继续问如果数组无序怎么办,先排序。 4、两个文件,每个文件中都有若干个url,找出两个文件中相同的url(用HashMap) 这一面挺简单的,只是增加之前面试没有过的在线写代码环节,collabedit后来我才了解,像facebook一些互联网公司远程面试都会用这个在线编辑器写代码,就是文本文档写,没有提示,不能编译运行,跟白板写一样。平时练练手就好。 美团技术HR四面 三面面试官说他那就是终面,说我过了等hr联系我。万万没想到半小时后的hr面居然也是技术。 1、自我介绍,都四面了还自我介绍?!我还以为是单纯的hr面,所以介绍的都是我的性格和生活方面的,结果并不是。 2、问项目,问的特别特别细,技术细节,还有遇到什么问题,怎么解决的,做项目有没有人带,怎么跟别人沟通的。 3、数据库优化,如果数据库一个表特别大怎么办 数据库优化我就讲了之前讲过很多遍的点,他问一个表特别大怎么办:大表分小表,怎么实现:使用分区表 4、问研究生的科研题目,为什么选这个题,看了一些什么论文(细到问我那些论文是发表在什么期刊上的,作者是哪所学校的),为什么要选这个算法,怎么优化的,实验结果怎么跟别人作对比的,为什么比别人的算法好(一个个问题不断砸过来,我猜我说的那些专业名词他应该不太懂,只是判断一下是不是我做的而已。。) 5、确定实习时间 这一面确实让我感到有压迫感,项目是本科做的,挺久了,一些技术细节上也没太总结,所以问细了我只能连想带编,嘿嘿。科研方面倒还好,上个学期都在弄这个,一些算法的实现和改进、对比都还记得比较清楚,回答的挺流畅的,可能这真的就是技术型的hr面吧。 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!
 
标签: JavaJava面试题
好文要顶 关注成功 收藏该文  
« 上一篇: 一线大厂Java面试必问的2大类Tomcat调优
» 下一篇: 为什么要使用MQ消息中间件?这3个点让你彻底明白!




Ajax的技术原理

 

昨天问道ajax是。我回答到不就是jquery框架提供的一个异步通信方法么。当再问原理时我傻逼了。ajax技术其实我只在实习时用到了。感到很方便的东西它不需要每次更新都刷新页面。可以异步请求服务器。利用回调函数进行处理程序。

在jquery API文档中我们可以看到一个简单的demo

$.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
});


可以看到这个代码的意思大概是利用post请求some.php这个方法。传入参数是用 name=John&location=Boston这么写的。data参数也能用{foo:["bar1", "bar2"]}这样的表现形式。但在发送时会自动转换成前面的样子。

那么这样一个ajax请求用js怎么做到的呢?

这里时利用了XMLHttpRequest对象进行实现的。但不同的浏览器获取这个对象和该对象的方法不同。

可以看到这里有open方法啊、send方法啊。还有个onreadystatechange这个属性。这个属性其实就是让你设置回调函数的。你可以写匿名函数也可以写函数名。如果要向服务器发参数可以用setRequestHeader方法设置key value。回调函数中我们也能获取到状态码、信息等等。例如success的状态码是200.重定向是302.失败是404之类的。利用这些东西我们就能写一个简单的实现。

function CreateXmlHttp() {

    //非IE浏览器创建XmlHttpRequest对象
    if (window.XmlHttpRequest) {
        xmlhttp = new XmlHttpRequest();
    }

    //IE浏览器创建XmlHttpRequest对象
    if (window.ActiveXObject) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
            try {
                xmlhttp = new ActiveXObject("msxml2.XMLHTTP");
            }
            catch (ex) { }
        }
    }
}

function Ustbwuyi() {

    var data = document.getElementById("username").value;
    CreateXmlHttp();
    if (!xmlhttp) {
        alert("创建xmlhttp对象异常!");
        return false;
    }

    xmlhttp.open("POST", url, false);

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            document.getElementById("user1").innerHTML = "数据正在加载...";
            if (xmlhttp.status == 200) {
                document.write(xmlhttp.responseText);
            }
        }
    }
    xmlhttp.send();
}


这里引用的是网上的代码。我们简单分析一下。首先我们获取到了XMLHttpRequest对象。这里判断了一下是什么浏览器。用了几个if else。然后我们设置请求方式、url、传输方式。false是同步、true是异步。然后我们写了个回调函数。告诉这个回调函数。我们只有在交互完成状态为4时候才做以下代码。这里面我们又判断了一下返回状态码。说只有success时候我们才执行以下代码。这里貌似忘记用xmlhttp.setRequestHander("username",data);设置请求时候的key-value了。

 

 
分类: JAVA
好文要顶 关注成功 收藏该文  
« 上一篇: java反射
» 下一篇: 2015百度校招笔试杭州站





 

2017年6月百度前端实习生面试问题

 

主题: 百度前端实习生面试

面试时间: 2017年6月

一面:问基础

当时我正在与我的工作流技术(大三的一门很坑很坑的课)决一死战,结果突然就打电话过来面试,我当时整个人都蒙了而且最坑的是我的外卖刚跟我说到楼下了,然后就来面试了。。结果,我的外卖被偷了!!!!重点了一份。
问的问题如下:

  1. css动画有哪些以及区别(animation,transition)
  2. 实现一个loading动画
  3. 如果动画卡顿了怎么办(使用translate)
  4. 要放置一个200X200的图片,图片大小最好要多大
  5. 实现一个三列布局,左边固定大小,其他两列占据剩余空间的50%(使用flex或者使用float)
  6. DOM事件模型
  7. js继承的几种方式
  8. 异步编程的几种方式
  9. 问我项目,有一个登录注册功能,问我过程,以及是否安全(https)
  10. 有过什么模块化工具(我答nodejs的commonjs,打包工具用webpack,对AMD了解一点点,然后他居然就不问下去了!居然就不问了!我还想着要扯一些CMD是同步加载,ADM是异步加载的什么鬼东西呢)
  11. 性能优化

然后一面就到此为止了,当时面试完就赶紧下去拿外卖,得知外卖被偷之后,就默默重点了外卖,然后开始新的复习之旅。

二面:问项目(2017/6/26 15:38)

  1. 自我介绍
  2. 根据我项目问问题,比如
    2.1 你用过angularjs是吧,那你当时是为什么选择angular的呢?只是因为它是最流行的框架吗?
    2.2 你有用过vue吗,那你说说vuejs和angular的差别
    2.3 你觉得angularjs的controller是干嘛的
    2.4 一个HTTP有哪些常见的状态码
    2.5 发起一个HTTP请求,从客户端到服务器,会有延迟吗?有的话,在哪里出现?
    答:
    2.5.1 我首先想到的是DNS解析所用的时间,因为你输入一个域名之后,首先是需要DNS解析器来将域名 转换为IP地址
    2.5.2 发起HTTP请求,就涉及到包之间的传输了,从HTTP应用层到物理层,就有一个封装以及加上头部的过程(比如加上TCP头部,IP头部),之后将包发送出去,就会分发到不同的路由器,并且经过漫长的路程最终到达服务器。由于在传输过程中需要时间,所以传输时间是肯定必不可少的。如果当时网络情况不好的话,还可能有丢包情况,需要重发。
    2.5.3 TCP/IP 建立连接首先需要三次握手。握手成功后才能发出请求。
    2.6 你做的某某项目后,让你觉得最难的地方是哪里?
  3. 我的问题就到哪里~你有什么想问的吗?
    当时就主要了问了我去了的话,主要是做什么的。以及百度前端架构体系是怎样的。

然后二面就结束了二面总共用了17分钟,问的问题我觉得还是挺有意思的,而且也是挺符合实际的,比如你项目的框架选型,你总不能随随便便就说这个流行就用吧。以及框架之间的对比,还问到了计网方面的知识,这让我想起了当时面试今日头条的时候,也问到了很多计网方面的东西当时问的好像主要是网络阻塞:如果发生丢包了的话,当前网络特别阻塞,有什么好的策略去解决它(TCP有一个 拥塞避免机制,然后就说了一下它的一些相关机制)

以上,就是此次百度前端面试中,我记得的所有内容(应该大多数都在上面)

 
好文要顶 关注我 收藏该文  
« 上一篇: js事件循环
» 下一篇: css加载会造成阻塞吗?




2017年6月百度前端实习生面试问题

 

转载于http://www.cnblogs.com/chenjg/p/7081214.html 

主题: 百度前端实习生面试

面试时间: 2017年6月

一面:问基础

当时我正在与我的工作流技术(大三的一门很坑很坑的课)决一死战,结果突然就打电话过来面试,我当时整个人都蒙了~而且最坑的是~我的外卖刚跟我说到楼下了,然后就来面试了。。结果,我的外卖被偷了!!!!重点了一份。
问的问题如下:

  1. css动画有哪些以及区别(animation,transition)
  2. 实现一个loading动画
  3. 如果动画卡顿了怎么办(使用translate)
  4. 要放置一个200X200的图片,图片大小最好要多大
  5. 实现一个三列布局,左边固定大小,其他两列占据剩余空间的50%(使用flex或者使用float)
  6. DOM事件模型
  7. js继承的几种方式
  8. 异步编程的几种方式
  9. 问我项目,有一个登录注册功能,问我过程,以及是否安全(https)
  10. 有过什么模块化工具(我答nodejs的commonjs,打包工具用webpack,对AMD了解一点点,然后他居然就不问下去了!居然就不问了!我还想着要扯一些CMD是同步加载,ADM是异步加载的什么鬼东西呢)
  11. 性能优化

然后一面就到此为止了,当时面试完就赶紧下去拿外卖,得知外卖被偷之后,就默默重点了外卖,然后开始新的复习之旅。

二面:问项目(2017/6/26 15:38)

  1. 自我介绍
  2. 根据我项目问问题,比如
    2.1 你用过angularjs是吧,那你当时是为什么选择angular的呢?只是因为它是最流行的框架吗?
    2.2 你有用过vue吗,那你说说vuejs和angular的差别
    2.3 你觉得angularjs的controller是干嘛的
    2.4 一个HTTP有哪些常见的状态码
    2.5 发起一个HTTP请求,从客户端到服务器,会有延迟吗?有的话,在哪里出现?
    答:
    2.5.1 我首先想到的是DNS解析所用的时间,因为你输入一个域名之后,首先是需要DNS解析器来将域名 转换为IP地址
    2.5.2 发起HTTP请求,就涉及到包之间的传输了,从HTTP应用层到物理层,就有一个封装以及加上头部的过程(比如加上TCP头部,IP头部),之后将包发送出去,就会分发到不同的路由器,并且经过漫长的路程最终到达服务器。由于在传输过程中需要时间,所以传输时间是肯定必不可少的。如果当时网络情况不好的话,还可能有丢包情况,需要重发。
    2.5.3 TCP/IP 建立连接首先需要三次握手。握手成功后才能发出请求。
    2.6 你做的某某项目后,让你觉得最难的地方是哪里?
  3. 我的问题就到哪里~你有什么想问的吗?
    当时就主要了问了我去了的话,主要是做什么的。以及百度前端架构体系是怎样的。

然后二面就结束了~二面总共用了17分钟,问的问题我觉得还是挺有意思的,而且也是挺符合实际的,比如你项目的框架选型,你总不能随随便便就说这个流行就用吧。以及框架之间的对比,还问到了计网方面的知识,这让我想起了当时面试今日头条的时候,也问到了很多计网方面的东西~当时问的好像主要是网络阻塞:如果发生丢包了的话,当前网络特别阻塞,有什么好的策略去解决它(TCP有一个 拥塞避免机制,然后就说了一下它的一些相关机制)

以上,就是此次百度前端面试中,我记得的所有内容(应该大多数都在上面)

 
分类: html
好文要顶 关注我 收藏该文  
 
 
« 上一篇: [原]浅谈vue过渡动画,简单易懂
» 下一篇: vue用js部分控制动画实现





 

自己想要的要自己给自己。这是一个独立的人的思维。

 

 

 

 

 

 

 






 

答寒冬winter面试题 

 
前几天在微博上看到@winter寒冬老师的发的几道题,挺有意思, 答来看看。也是对自己最近实习所学的东西做下梳理。
以下是题目:
 
谈谈你对CSS布局的理解

讲讲输入完网址按下回车,到看到网页这个过程中发生了什么。

谈谈你对Web前端组件化的理解,Web Component会带来怎样的影响

谈谈你对前端资源下载性能优化的经验和思考

现在有很多的MV*框架,你对它们有什么看法

iOS体验好在哪里,Web能赶上么?

网页游戏怎么做?

Hybrid技术应当如何应用?

你最爱的前端框架是什么,为什么?

讲讲输入完网址按下回车,到看到网页这个过程中发生了什么。

输完网址到看到网页,首先浏览器会解析url,浏览器会分别通过浏览器缓存、系统缓存、DNS服务器缓存、DNS服务器找到url对应的唯一IP地址,并解析IP地址搜索服务器并发送请求,服务器根据请求返回编译后的HTML字符串,浏览器开始进行解析。

浏览器通过“状态机”对HTML进行解析,生成DOM Tree。

解析HTML的过程中遇到CSS和JS资源的标签会立即开始请求资源或执行,这里提一下出于JS脚本可能会有样式操作的考虑,CSS文件的下载会阻塞JS文件的加载,由于开发者希望JS脚本能在引用的地方立即执行,JS文件的加载和执行会阻塞HTML的解析。所以一般建议优先或者异步加载CSS,在body底部再加载js.

CSS下载好会生成CSS Rule Tree,代表CSS的映射规则, CSS Rule Tree会比照HTML DOM Tree生成Render Tree。

Render Tree生成好后,变开始了浏览器的渲染过程。主要是以下4个步骤:

样式计算:计算每个渲染对象的样式属性

布局:基于流的模型对元素进行布局,简单说就是计算宽度和位置

绘制:基于以上两个步骤的结果将元素显示到屏幕上

层级组合:根据z坐标将不同层级组合起来,z-index或translate3d可以改变元素的层级,也就是z坐标,z坐标越小的元素越优先绘制。

此外对于有动画效果的页面,被改变的CSS属性不同,触发的渲染步骤也不同(参照),尽量触发靠后的渲染步骤或者缩小受影响的元素可以减少页面性能消耗。合理利用translate3d分层可以减小受影响的元素并利用GPU加速,尽量用translate代替left和top进行位置变换进行也是同理。

Web前端组件化

在前端开发中会有很多相同的组件需求,例如我们经常用到的input、select,这些是浏览器原生的组件。可是浏览器提供的组件十分有限,大部分时候无法满足我们的需求,需要我们自己开发这些功能,比如幻灯片、手机上的滚动条、日历等功能,都是很常用的功能。。于是我们就把这些常用的功能提取出来,作为组件,这些组件抽象封装后就是我们所谓的插件,插件有一些弊端:大多数插件的接口和调用方式并不兼容,当我们想替换插件的时候有学习成本,有时候甚至需要修改代码逻辑

插件内外并没有隔离,插件存在可能会被页面其他部分影响(如样式属性),也有影响页面其他部分的可能。

Web Components提出了组件定义方式的规范化。目前包括四个部分,templateShadow DomCustom ElementImport

template是指我们可以通过<template>元素导入HTML模板(之前一般是用js),并且这段模板不会在Dom结构中出现,也不会预先加载其中所需的img之类的资源。

Shadow Dom是指我们可以在DOM中生成一块隐藏的DOM,它不会显示到正常的DOM结构中,同时也会和它外面的Dom元素隔离,不受彼此的影响。新版的chrome实现了这个,提供createShadowRoot这个方法创建Shadow Dom。

以上方法看着很酷炫,可是我们使用的时候还没有到完全声明化,还是需要通过传统的id或class方式筛选到组件寄生的dom,这个时候Custom Element就登场了, 它允许我们自定义元素(要求是继承HTMLElement),并提供createdCallback接口,让我们可以定义HTML解析到这个元素时调用的回调函数。也就是塞数据和注册Shadow Dom可以在callback里面完成,我们只需要在Dom中插入自己Custom Element就Ok了。

到这里我们就要考虑了,如何实现复用呢? 没错,这就是import的作用了,它是link的一个rel属性,允许我们像链接css那样链接一个HTML文件。

目前走在前面的是Chrome,polymer官网上的标语welcome to the future很让人心动。组件化一定程度上解决了前端重复造轮子的问题,实现了“一个备胎,车车能用”,未来某天某个开发者将开发好的组件分享到云上,大家都能拿来使,这也许就是传说中的, 云备胎。。。。。


谈谈你对前端资源下载性能优化的经验和思考

前端的资源主要是css,js文件和图片。

目前我们的优化方法:

css、js压缩(减小文件体积)

css sprite(减少图片资源的请求次数)

前文提到的,优先加载css,将js文件置底

通过打包工具将文件合并(文件请求占加载的大头,减少文件请求数)

合理选择js、css文件的加载方式:内嵌 / 外部引用(选择内嵌,是为了减少文件请求数。而将更新较少,不同页面都公用的文件提取出来,做为外链加载,是为了利用缓存,减少它的请求次数,且减少需要多次请求的HTML文件大小)

配置离线存储

上线前使用打包工具进行项目优化,减少无用代码。

 

现在有很多的MV*框架,你对它们有什么看法

MV*框架的目的简单来说是为了实现代码分工,增加模块的重用,让业务逻辑和界面交互解耦。
前端框架,实习中接触过Ractivejs和AngularJs,都是MVVM的框架
前端框架给我带来的好处在于它引导了我做项目的流程。要求我们在项目开动前就得先构思好这个项目的分级,每层的结构,在写之前要求我们对项目有一个大概的把握,有更清晰的思路。
 
对于MVVM框架,通过DataBing的方式让我们远离了繁琐的Dom操作,专心于业务逻辑和界面交互的设计。AngularJS和RactiveJS的区别也很明显,AngularJS优点就是Angular真的很强大,可以用的组件很多,有directive,提供了依赖注入,各种组件也很全。但是用Angular要求有一定的学习门槛,刚入门的时候不知其所以然出了问题很难排查,不过熟悉了它的原理和各种机制以后会好一些,另外依赖注入不负责文件的加载顺序,所以还需要用其他的模块化工具管理模块。
RactiveJS相比起来就简单多了,我们可以按需选择数据更新的时间,正是因为小很多地方要自己实现,自定义的程度更高。
准大四学生,目前出来实习三个月,寒冬老师出的题目论点有点大,我这里就只对我实习中接触过的几个点写了写我的理解,希望和大家交流一下。
能力有限,答得不好的可以批评我,一起学习,指正出来可以一起完善这些答案,只求不要喷哈 O(∩_∩)O。。。。

posted on 2022-06-26 16:09  xiaoluoke  阅读(327)  评论(0)    收藏  举报

导航