[关闭]
@yumewang 2019-02-19T05:40:00.000000Z 字数 17792 阅读 1322

前端工程师面试题

HXWork


10k:没有什么说的

面试

Android面试题

参考:https://www.jianshu.com/p/a2bbd8565a64

  1. Activity生命周期
    1. onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
    2. onStart()与onResume()有什么区别?
    3. 简述Activity启动流程:1.第一种是从桌面launcher上点击相应的应用图标;2.在activity中通过调用startActivity来启动一个新的activity。
  2. Android类加载器
    Android中常用的有两种类加载器,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader。区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以我们可以用DexClassLoader去加载外部的apk。
    Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并,优化,然后生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,如果我们的Android应用不进行分dex处理,最后一个应用的apk只会有一个dex文件。
  3. View的绘制原理
    layout过程是摆放view的过程,View不需要实现,通常由ViewGroup实现,在实现onLayout时可以通过getMeasuredWidth等方法获取measure过程测量的结果进行摆放。
    draw过程先是绘制背景,其次调用onDraw()方法绘制view的内容,再然后调用dispatchDraw()调用子view的draw方法,最后绘制滚动条。ViewGroup默认不会执行onDraw方法,如果复写了onDraw(Canvas)方法,需要调用 setWillNotDraw(false);清楚不需要绘制的标记。
    1. getWidth()方法和getMeasureWidth()区别呢?:首先getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到。另外,getMeasureWidth()方法中的值是通过setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过视图右边的坐标减去左边的坐标计算出来的。
    2. RecyclerView与ListView(缓存原理,区别联系,优缺点)https://www.jianshu.com/p/193fb966e954
  4. 界面刷新的方式有哪些?
    requestLayout,invalidate,postInvalidate区别与联系
    相同点:三个方法都有刷新界面的效果。
    不同点:invalidate和postInvalidate只会调用onDraw()方法;requestLayout则会重新调用onMeasure、onLayout、onDraw。
    调用了invalidate方法后,会为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,进行开始View树重绘流程(只绘制需要重绘的视图)。
    调用requestLayout方法,会标记当前View及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View都会进行测量onMeasure、布局onLayout、绘制onDraw。

  5. Binder机制,共享内存实现原理:理解,应用,用处:https://blog.csdn.net/freekiteyu/article/details/70082302

  6. adb命令的理解https://github.com/mzlogin/awesome-adb
  7. apk打包流程
    1. aapt工具打包资源文件,生成R.java文件
    2. aidl工具处理AIDL文件,生成对应的.java文件
    3. javac工具编译Java文件,生成对应的.class文件
    4. 把.class文件转化成Davik VM支持的.dex文件
    5. apkbuilder工具打包生成未签名的.apk文件
    6. jarsigner对未签名.apk文件进行签名
    7. zipalign工具对签名后的.apk文件进行对齐处理
  8. apk安装流程
    1. 复制APK到/data/app目录下,解压并扫描安装包。
    2. 资源管理器解析APK里的资源文件。
    3. 解析AndroidManifest文件,并在/data/data/目录下创建对应的应用数据目录。
    4. 然后对dex文件进行优化,并保存在dalvik-cache目录下。
    5. 将AndroidManifest文件解析出的四大组件信息注册到PackageManagerService中。
    6. 安装完成后,发送广播。
  9. HTTP缓存机制
  10. Java类的加载机制
    程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。
    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。
  11. 类加载时,什么时候发生类初始化
    1. 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候,读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
    2. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
      当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
    3. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
    4. 当使用JDK 1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例左后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄锁对应的类没有进行过初始化时。
  12. 什么是Fail-Fast机制
    Fail-Fast是Java集合的一种错误检测机制。当遍历集合的同时修改集合或者多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制,记住是有可能,而不是一定。其实就是抛出ConcurrentModificationException 异常。
    集合的迭代器在调用next()、remove()方法时都会调用checkForComodification()方法,该方法主要就是检测modCount == expectedModCount ? 若不等则抛出ConcurrentModificationException 异常,从而产生fail-fast机制。modCount是在每次改变集合数量时会改变的值。
  13. Java泛型的理解
  14. 引用类型
    强引用:默认的引用方式,不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
    软引用(SoftReference):如果一个对象只被软引用指向,只有内存空间不足够时,垃圾回收器才会回收它;
    弱引用(WeakReference):如果一个对象只被弱引用指向,当JVM进行垃圾回收时,无论内存是否充足,都会回收该对象。
    虚引用(PhantomReference):虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。虚引用通常和ReferenceQueue配合使用。
    ReferenceQueue
    作为一个Java对象,Reference对象除了具有保存引用的特殊性之外,也具有Java对象的一般性。所以,当对象被回收之后,虽然这个Reference对象的get()方法返回null,但这个SoftReference对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量Reference对象带来的内存泄漏。
    在java.lang.ref包里还提供了ReferenceQueue。我们创建Reference对象时使用两个参数的构造传入ReferenceQueue,当Reference所引用的对象被垃圾收集器回收的同时,Reference对象被列入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的对象的Reference对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。于是我们可以在适当的时候把这些失去所软引用的对象的SoftReference对象清除掉。
  15. Java内存区域
    程序计数器:当前线程锁执行的字节码的行号指示器,用于线程切换恢复,是线程私有的;
    Java虚拟机栈(栈):虚拟机栈也是线程私有的。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    本地方法栈:与虚拟机栈类似,服务于Native方法。
    Java堆:堆是被所有线程共享的一块内存,用于存放对象实例。是垃圾收集器管理的主要区域,也被称作GC堆。
    方法区:与Java堆一样,是线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。
    运行时常量池:是方法区的一部分,用于存放编译器生成的各种字面量和符号引用。
  16. 项目上

    1. Retrofit:https://www.jianshu.com/p/07f7eb4aa9ae
    2. 地图定位
    3. 数据持久化
    4. app优化:界面渲染速度优化,响应速度优化,使用leakcanary技术捕捉内存泄露,耗电量分析
    5. Kotlin的理解,语法
    6. eclipse的常用命令
    7. git或svn
    8. 凯恩买手app系统:项目参与,职责,问题等等
    9. 互递Android架构的重构和落地:如何规划,重构哪些点,遇到什么障碍?
    10. 页面上实现下拉框,并且该下拉框值支持可增加
    11. 开发过程中会遵循哪些规范
    12. 你如何看待你这5点的工作,有得有失,得什么失什么?肯定自己的是什么?
    13. 感恩的是谁?你对别人最大的帮助是什么?
    14. 项目过程中,出现需求变更,时间延迟,人员问题等等,从你的角度考虑下,问题原因会有哪些方面,那你觉得可以有哪些解决办法?
  17. Activity的启动过程:
    app启动的过程有两种情况,
    第一种是从桌面launcher上点击相应的应用图标,
    第二种是在activity中通过调用startActivity来启动一个新的activity。
    我们创建一个新的项目,默认的根activity都是MainActivity,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击图标的时候,系统就会调用startActivitySately(),一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService的管理服务,这个管理服务会对AndroidManifest.xml文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息。当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。

2018-07-02

echart图表实现时,当横轴数据量大时,如何考虑?
实现一个多行文本收折功能,你会细化哪些功能点,那对应的测试点有哪些?
项目中的需求分析,你是如何执行,需要把控什么?会从哪些方面入手?
在什么重要问题上你与其他人有不同看法?
先自我介绍,以及在上一家公司2个项目的工作情况
行业转向考虑到什么,过程中有遇到什么问题,又是怎么克服的?有谁协助过你,或者给予你建议吗?如果是另一个人有你同样的选择,你会如何建议?
未来的规划是什么 洗车
对未来入职的公司要求是什么?
期望的薪资
团队成员-工作态度,工作职责,交流;公司存活,利润,产品
外包-
Android职业-27-35岁,创业-徒步
10k期望,没有波动-管理层,看清现状,人工智能,不考虑后端工程师-技术思维,项目管理:成本,流程控制;

  1. 面试 5k
    后台的开发,后期的运维(负责那一块)?
    人员管理,多少人,你负责那块,过程中有什么问题?你觉得那些事项是需要自我反省的?
    最近在读的一本书是什么,主要的讲的是什么?
    你提到的人际沟通,管理方式有一定的优势,优势在哪里?举例说明
    期望的薪资?

2018-06-21

  1. 通用面试题

    自我介绍
    对产品和项目的理解
    对工作分解是怎样做
    工作中我们最重要的品质是什么,体会最深刻的是什么
    当产品设计师需求不断变更,引发的一系列问题,比如计划延期,技术难度,你态度如何?
    技术上
    a. 对已掌握技术的沉淀方式,和新技术的调研方式
    a. 对某个框架(Vue或其他)的理解是什么样的?
    a. 对规范的理解,及执行性如何?
    a. 最近再了解的新技术是什么?
    a. MVC 和 MVVM 的理解
    a. ES6 新特性有哪些,请列举说明
    a. 一些前端面试题?
    a. 代码重构,你的执行思路是什么
    a. 代码管理工具Git的理解,工作流程,常用命令
    a. Vue的生命周期 https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90
    以往离职情况,请简要说明
    未来的规划是什么
    对未来入职的公司要求是什么?
    前端库:定制,需要考虑什么,通用组件(个人,更关注技术,而不是团队)
    Git
    最近再了解的新技术是什么?
    代码重构:代码走查?
    前端leader:需要考虑什么事情,怎么协调团队过程中的问题,以及过程中的内容
    前端Leader:技术,管理,哪个优先级高
    产品开放:技术,产品业务?
    每个公司是考虑到什么点,选择离职
    2007年开始工作,这些考虑?
    期望的薪资:???

  2. 罗丹

    你入职五年,对整个行业的理解,想法是什么?
    【较强的组织能力、承压能力、实际动手能力和 团队协作精神,能迅速的适应各种环境】对此请简单以一个事件说明下
    你最近读的一本书是什么?
    项目周期端,你在每个项目中的状态如何,每个项目个人的成长是什么?
    你不是计算机专业的学生,是什么样的契机转为Web前端工程师?
    Linux常用命令是什么?

  3. 雷燕庭

    作为Web前端工程师,你最善长的是那一块?
    【熟悉不同内核浏览器差异,并能解决网页在不同浏览器的兼容性问题;】请举例说明
    你是云南人,为何选择留在重庆?
    【熟悉 w3c 标准,深刻理解 web 标准】能简要说明有哪些标准?
    https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html
    https://baike.baidu.com/item/WEB%E6%A0%87%E5%87%86/217020?fr=aladdin
    项目的搭建及配置,部署
    Sublime 常用的快捷命令有哪些?
    你对Vue的事件处理的理解:事件修饰符,按键修饰符,系统修饰符,为什么在 HTML 中监听事件? https://cn.vuejs.org/v2/guide/events.html
    你个人的兴趣爱好是什么?
    项目情况-参与方式
    不同项目的参与,你的态度是怎么定义的?
    期望薪资9k 12k广东 8k~10k外包 - 4

  4. 叶行
    谈谈你对redis的理解,常用的场景有哪些?
    【变得更有耐心,思维更活跃】有哪些方面可以说明这些?

技术方面:

1. 常用的浏览器及使用引擎是什么?
2. 常见http状态码有哪些?
3. CSS的盒模型是什么?
4. CSS都有哪些选择器?它们的优先级是怎么样定义的?
5. 现有前端主流框架有哪些?如何理解它们的架构,使用,及优点缺点。
6. 您知道 ES6 有哪些新特性,请列举说明。
7. 请简略说明 JavaScript 请求跨域原因及其解决方案。
8. for 循环内部 + setinterval()  
    异步函数集,例如:setTimeout和setInterval。异步函数分类: I/O函数和计时函数。非阻塞式I/O。
    for (var i = 1; i <= 3; i++) {  
        setTimeout(function(){ console.log(i); }, 0);
    };

8. 
9. 

500 : 'Internal Server Error',
403 : 'Forbidden',
404 : 'Not Found',
304 : 'Not Modified',
200 : 'OK',

# => 输出为 4 4 4

项目情况:

1. 项目的基本流程
2. 需求不断变更,UI 严格需求,你的态度如何
3. 开发过程中的,各种冲突,你是如何应对的。可以举例说明吗?
4. 项目过程中,最重要的是什么?
5. 其他,你的优势,缺点?
6. 你未来的期望是何?
7. 你是学的网路工程,如何考虑转向 web 前端

1. 考虑点

一个优秀的程序员应该具有怎样的技能: 
    基础扎实,主动思考,爱学习,深度,视野;
    正确的人生观和处事态度;
    对事有较强的逻辑能力和沟通能力;
    发挥稳定的人际整合力;
    条理性,逻辑能力,语言能力。

2. STAR面试法:

STAR”是SITUATION(背景)、TASK(任务)、ACTION(行动)和RESULT(结果)四个英文单词的首字母组合。仅仅通过应聘者的简历无法全面了解应聘者的知识、经验、技能的掌握程度及其工作风格、性格特点等方面的情况。而使用STAR技巧则可以对应聘者做出全面而客观的评价。

1. 背景(SITUATION):通过不断提问与工作业绩有关的背景问题,可以全面了解该应聘者取得优秀业绩的前提,从而获知所取得的业绩有多少是与应聘者个人有关,多少是和市场的状况、行业的特点有关。
2. 工作任务(TASK): 每项任务的具体内容是什么样的。通过这些可以了解应聘者的工作经历和经验,以确定他所从事的工作与获得的经验是否适合所空缺的职位。
3. 行动(ACTION): 即了解他是如何完成工作的,都采取了哪些行动,所采取的行动是如何帮助他完成工作的。通过这些,可以进一步了解他的工作方式、思维方式和行为方式。
4. 结果(RESULT): 每项任务在采取了行动之后的结果是什么,是好还是不好,好是因为什么,不好又是因为什么。
  1. 技术上
    • 新技术的学习,调研
    • 已有技术的沉淀
    • 难点攻克?
    • 规范
    • 工具:代码管理工具(Git常用命令,及工作流程)
    • 最近关注或学习的技术是什么
    • ES6的了解
    • CSS,JS,HTML,Vue
    • Nodejs
      1. 产品,项目
        • 平时就事项的工作状况?什么问题?体会最深的地方是什么?
        • 小程序开发上问题
        • 工作流程?
      2. 个人:团队,规划,对前端的整体认识
        • 离职原因
        • 团队上,是如何定义?你觉得你现有可以担当什么角色?
        • 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
        • 个人未来的规划是什么?
        • 公司期望????
        • 稚嫩
      3. 现有公司情况(?产品,项目?)
薪资期望(?),及未来的3~5天之内

一面题目:

http://ljinkai.github.io/2015/07/30/front-end-interview/
  1. CSS position定位:static, absolute, relative.

    static  默认。它始终会处于页面流给予的位置(static 元素会忽略任何 top、bottom、left 或 right 声明)。
    relative    元素可将其移至相对于其正常位置的地方,因此 "left:20" 会将元素移至元素正常位置左边 20 个像素的位置。
    absolute 元素可定位于相对于包含它的元素的指定坐标。此元素的位置可通过 "left"、"top"、"right" 以及 "bottom" 属性来规定。
    fixed 元素可定位于相对于浏览器窗口的指定坐标。此元素的位置可通过 "left"、"top"、"right" 以及"bottom" 属性来规定。不论窗口滚动与否,元素都会留在那个位置。工作于 IE7(strict 模式)。
    您如何实现一个层的定义?
    
    ————————————————————————————————————
    1.常用的浏览器及使用引擎是什么
    2.常见http状态码有哪些
    3.CSS的盒模型是什么
    4.CSS都有哪些选择器?它们的优先级是怎么样定义的?
    
  2. javascript对象的几种创建方式

    1,工厂模式
    2,构造函数模式
    3,原型模式
        最主要的一点是数据共享,创建对象的时候,我们会把公共的方法和属性挂载到原型上,避免资源浪费。需要注意方法重写?
    4,混合构造函数和原型模式
    5,动态原型模式
    6,寄生构造函数模式
    7,稳妥构造函数模式
    
    ————————————————————————————————————
    5.请简述一下src与href的区别。
    5.ES6 新特性有哪些,请列举说明。
    7.JavaScript 跨域原因及其解决方案
    
  3. MVC 和 MVVM 的理解

    视图(View):用户界面。
    控制器(Controller):业务逻辑
    模型(Model):数据保存
    接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。
    唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember,Vue 都采用这种模式。
    
  4. 代码规范?

    注释,CSS,JS,开发流程,代码审查,性能,浏览器测试与支持,项目应用结构,注释等
    
  5. 性能优化方案有哪些?

    dns缓存,cdn缓存,浏览器缓存,服务器缓存
    (1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
    (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
    (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
    (4) 当需要设置的样式很多时设置className而不是直接操作style。
    (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
    (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
    (7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。
    
  6. 网站重构的理解?

    网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的情况下,对网站进行优化,在扩展的同时保持一致的UI。
    对于传统的网站来说重构通常是:
    表格(table)布局改为DIV+CSS
    使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)
    对于移动平台的优化
    针对于SEO进行优化
    深层次的网站重构应该考虑的方面
    减少代码间的耦合
    让代码保持弹性
    严格按规范编写代码
    设计可扩展的API
    代替旧有的框架、语言(如VB)
    增强用户体验
    通常来说对于速度的优化也包含在重构中
    压缩JS、CSS、image等前端资源(通常是由服务器来解决)
    程序的性能优化(如数据读写)
    采用CDN来加速资源加载
    对于JS DOM的优化
    HTTP服务器的文件缓存
    
  7. 当UI设计师精确1px的要求时,你态度如何?
  8. 当产品设计师需求不断变更,引发的一系列问题,比如计划延期,技术难度,你态度如何?
  9. 单元测试
  10. 平时如何管理你的项目?

    先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等;
    编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
    标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
    页面进行标注(例如 页面 模块 开始和结束);
    CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css);
    JS 分文件夹存放 命名以该JS功能为准的英文翻译。
    图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理。
    
  11. 当问题出现状态时,你觉得在于人,还是事?

  12. 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?

    前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
        1、实现界面交互
        2、提升用户体验
        3、有了Node.js,前端可以实现服务端的一些事情
    前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
    参与项目,快速高质量完成实现效果图,精确到1px;
    与团队成员,UI设计,产品经理的沟通;
    做好的页面结构,页面重构和用户体验;
    处理hack,兼容、写出优美的代码格式;
    针对服务器的优化、拥抱最新前端技术。
    

3. 笔试题目:

1. 常用的浏览器及使用引擎是什么
2. 常见http状态码有哪些
3. CSS的盒模型是什么
4. CSS都有哪些选择器?它们的优先级是怎么样定义的?
5. 请简述一下src与href的区别。
6. 现有前端主流框架有哪些?如何理解它们的架构,使用,及优点缺点。
7. ES6 新特性有哪些,请列举说明。
8. JavaScript 跨域原因及其解决方案
9. 什么是异步编程?为什么在 JavaScript 中这么重要?
10. 如何定义一个方法,将 string 的每个字符间加个空格返回。
11. 请用JavaScript实现邮箱验证-正则验证。
12. 请简述您对面向对象的理解,可以有哪些方式来创建对象?
13. JavaScript中,for 循环内部 + setinterval()  输出是什么?
    for (var i = 1; i <= 3; i++) {  
        setTimeout(function(){ console.log(i); }, 0);
    };
14. 请根据以下描述,按示例的形式用代码来实现:
    小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。 

原因:
    var i的变量的生命周期延伸到了内部函数中
    循环结束后,i=4
    js事件处理器在线程空闲之前不会运行
    setTimeout,延时事件队列,事件循环。延迟执行,永不中断。

iOS 面试题

  1. iOS应用导航模式有哪些

    iOS应用导航模式有哪些
    这个问题更多是设计人员考虑的,不过我们也需要了解,不然我们都不知道UITabBarController和UINavigationController等存在的意义是啥。
    iOS应用属于客户端应用,问题其实是问下面两个部分:
    1:什么是导航模式?客户端导航模式有哪些常见的?
    2:iOS中存在哪些导航模式?
    导航模式
    导航模式:将信息以最优的方式组织起来展现给用户。
    客户端常见模式:tab、抽屉、列表、平铺/轮播、宫格和悬浮icon等。
    注:不要太在意名称,你会在网上搜到一种模式有多种名称。

  2. ViewController完整生命周期,事件传递链/事件响应链

    ViewController完整生命周期
    init
    loadView
    viewDidLoad
    viewWillAppear
    viewDidAppear
    viewWillDisappear
    viewDisDisappear
    viewWillUnload(Deprecated)
    viewDidUnload(Deprecated)
    delloc
    这里要注意loadView方法,平时我们都没有去管这个事情;
    这个方法执行后self.view才有值,也就是说这个方法完成了view的加载,内部会根据控制器名字、是否自己实现、xib等条件来加载view。
    如果自己实现loadView方法,并且方法体为空,则self.view为nil,
    并且viewDidLoad方法会调用两次;
    这说明viewDidLoad是被loadView调起的,在viewDidLoad中如果self.view为nil会再调用一次load
    事件传递链/事件响应链
    当点击一个按钮的时候,事件如果传递到按钮这个第一响应者上,这就是事件传递链要做的事情。系统根据下面两个方法来传递事件。

  1. //该点是否在本视图点击范围内 point已经被转换了成本视图对应frame- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { //内部实现大概是这样
  2. return CGRectContainsPoint(self.bounds, point);
  3. }//本视图/子视图是否能够传递本事件 point已经被转换了成本视图对应frame- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { //内部实现大概是这样
  4. //用户交互为NO,不处理
  5. if(self.userInteractionEnabled == NO) { return nil;
  6. } if([self pointInside:point withEvent:event]) { NSArray * superViews = self.subviews; //倒序从最上面的一个视图开始查找
  7. for (NSUInteger i = superViews.count; i > 0; i--) { UIView * subview = superViews[i - 1]; //转换坐标系 使坐标基于子视图
  8. CGPoint newPoint = [self convertPoint:point toView:subview]; //得到子视图 hitTest 方法返回的值
  9. UIView * view = [subview hitTest:newPoint withEvent:event]; //如果子视图返回一个view 就直接返回 不在继续遍历
  10. if (view) { return view;
  11. }
  12. } //所有子视图都没有返回 则返回自身
  13. return self;
  14. } return nil;
  15. }
>当点击按钮的时候,其实事件是这样传递的:AppDelegate->UIApplication->UIWindow->xxx->UIViewController->UIView->UIButton。
事件响应链
当找到事件第一响应者之后,该事件如何响应,就是事件响应链要做的事情。
接着上面的例子,UIButton就是系统找出来的第一响应者,那么会执行如下方法:
//触摸事件开始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件移动- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件结束- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件取消- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}
如果你自己不处理,你可以self.nextResponder让下一个响应者处理。
//触摸事件开始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    //让下一个响应者处理
    [self.nextResponder touchesBegan:touches withEvent:event];
}
...
响应者链也就是传递链的倒序。
这里需要注意的就是,如果给UIButton添加了target和UITapGestureRecognizer那么点击按钮只会执行UITapGestureRecognizer,也就是说如果手势和target同时满足条件则只会执行手势。target也是touchesxxx中判定的,你可以重写touchesxxx内部实现为空,你会发现并不影响手势但会影响target。

3. iOS中的定时器UIView/UILayer关系
2. 简单描述一下Runtime,Runtime给类添加属性、成员变量
3. 程序内存分区extern的作用:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态区、堆区、栈区):https://www.jianshu.com/p/797fb0dffc70
4. iOS持久化有哪些

首先这里的持久化指的是数据持久化,目前客户端的持久化也只有这一个含义。
为何要持久化:iOS开发可以没有持久化,持久化更多的是业务需求;比如记录用户是否登陆,下次进应用不需要再登陆。
因为iOS的沙盒机制,所以持久化分为两类:沙盒内和沙盒外。
沙盒内
NSKeyedArchiver
只要遵循了NSCoding协议并正确实现了initWithCoder和encodeWithCoder方法的类都可以通过NSKeyedArchiver来序列化。
归档使用archiveRootObject,解归档使用unarchiveObjectWithFile;需要指定文件路径。
NSUserDefaults
[NSUserDefaults standardUserDefaults]获取NSUserDefaults对象,以key-value方式进行持久化操作。
plist
写入使用writeToFile,读取使用xxxWithContentsOfFile;需要指定文件路径。
数据库
数据库无疑是大量数据最好的持久化方案,数据库目前有:sqlite、CoreData和Realm等。这里就不用回答FMDB它只是封装了sqlite而已。
文件
这里要和plist区分一下,plist方式是字典/数组数据格式写入文件;而这里的文件方式不限数据格式。
沙盒外
KeyChain
沙盒内的方式在应用被删除后数据都会丢失,如果想要不丢失则需要使用KeyChain。
KeyChain本质是一个sqlite数据库,其保存的所有数据都是加密过的。
KeyChain分为私有和公有,公有则需要指定group,一个group中的应用可以共享此KeyChain。
使用KeyChain过程中要理解下面几个问题:
1:自己使用的KeyChain和系统自带的KeyChain数据是隔离的,内部应该是不同数据库文件;
2:KeyChain数据可备份到iCloud中;
3:不需要联网,也不用登陆iCloud账号;一个设备一个sqlite数据库,但是不同应用组不共享数据;
4:要在另一台设备上使用当前设备存储的KeyChain信息,需要当前设备进行数据备份,
再在另一设备上复原数据;比较常用的是iCloud备份方式;
5:系统自带的KeyChain中账号密码分类数据可在系统设置->账号与密码里面看到,
你退出iCloud账号还是存在,只是iCloud会帮你备份如果你设置了的话;这个和照片是一样的道理。

  1. 指针函数/函数指针/Block
  2. 简述你了解的锁

    互斥锁:NSLock、pthread_mutex、@synchronized。
    加锁后,其他加锁操作阻塞直到解锁。
    递归锁:NSRecursiveLock。
    一个线程可以多次加锁,相应的要对应多次解锁其他线程才可以加锁。
    条件锁:NSCondition、NSConditionLock。
    锁满足指定条件时才继续执行,否则阻塞。
    信号量:dispatch_semaphore。
    wait操作阻塞直到signal被调用。
    读写锁:pthread_rwlock。
    读模式占有锁时其他线程只能读;写模式占有锁时其他线程不能进行任何操作。

  3. ISO七层、TCP/IP四层协议

    ISO七层协议
    应用、表示、会话、传输、网络、数据链路、物理。
    TCP/IP四层协议
    应用、传输、网络、数据链路。
    传输层单位:段;
    网络层单位:报;
    链路层单位:帧。

  4. iOS内存使用注意事项和优化

    使用注意事项

    1. 访问野指针:数据越界、对象已经释放但对其发送消息等;
    2. 内存泄漏:循环引用、imageNamed读取图片等;
    3. 触碰内存峰值:for循环声明变量等;
    4. 申请了不使用的内存:声明变量但未使用、只在某个逻辑分支用到某些变量但一开始就初始化等。
      内存优化
    5. 访问野指针:访问前加判断;
    6. 这部分问题大多是多线程造成的,比如两个线程同时执行一个方法,方法内部对数组有更新操作。
    7. 内存泄漏:Instrument Leaks/Allocations检测、使用imageWithContentsOfFile读取图片等;
    8. imageNamed会缓存加载的图片;imageWithContentsOfFile只是简单的加载图片。
    9. 触碰内存峰值:手动添加释放池;
    10. for循环内大量创建局部变量,这些局部变量会等到RunLoop的下一个循环才释放,而手动加入释放池则会提前释放。
    11. 申请了不使用的内存:懒加载。
  5. iOS类和结构体有什么区别

    1:类指针赋值时只是复制了地址,结构体是复制内容;
    2:类不能有同名同参数个数的方法,结构体可以;
    3:结构体方法实现编译时就确定了,类方法实现可动态改变;
    4:内存分配不一样,结构体在栈,类在堆;
    5:结构体可以多重继承,类只能单继承。

  6. Http协议特点,GET/POST请求区别

    Http协议特点,基于Http2.0
    快速:协议简单,通讯速度快;
    灵活:通过Content-Type可以传递任何类型的数据;
    长连接:一次连接处理多个请求,并支持管线(同时发出多个请求,不用等到前面请求响应)、多路复用(一个请求多次响应);
    无状态:协议对于事务处理没有记忆能力,如果本次请求需要上次的数据则需要重传。
    GET/POST请求区别
    GET在URL后以?形式拼接参数,POST将参数放在body中;
    GET也可以在body里面放数据,POST也可以在URL放数据,Http只是规定,你也可以不遵守啊。
    至于服务器获不获取就看具体实现了。
    POST比GET安全,因为GET参数在URL中,用户一眼就能看到;
    POST当然也可以用工具看到参数。
    语意理解,GET用来获取数据,POST用来上传数据;
    客户端和服务器对URL数据一般有1kb的限制。
    Http协议对URL并没有限制。

  7. Socket连接和Http连接区别

    Http是基于Tcp的,而Socket是一套编程接口让我们更方便的使用Tcp/Ip协议;Http是应用层协议,在Tcp/Udp上一层。
    1:Http是基于"请求-响应"的,服务器不能主动向客户端推送数据,只能借助客户端请求到后向客户端推送数据,而Sokcet双方随时可以互发数据;
    2:Http不是持久连接的,Socket用Tcp是持久连接;
    3:Http基于Tcp,Socket可以基于Tcp/Udp;
    4:Http连接是通过Socket实现的;
    5:Http连接后发送的数据必须满足Http协议规定的格式:请求头、请求头和请求体,而Socket连接后发送的数据没有格式要求。

  8. MVC、MVP、MVVM:https://www.jianshu.com/p/e378025920f8
  9. 面向对象原则

    单一职责原则,开闭原则,依赖倒置原则(面向接口编程),迪米特原则,里氏替换原则,接口隔离原则。

  10. 项目经历,过程中参与的方式,总结点

  11. 每日工作check的方式
  12. STAR面试法:
    STAR”是SITUATION(背景)、TASK(任务)、ACTION(行动)和RESULT(结果)四个英文单词的首字母组合。仅仅通过应聘者的简历无法全面了解应聘者的知识、经验、技能的掌握程度及其工作风格、性格特点等方面的情况。而使用STAR技巧则可以对应聘者做出全面而客观的评价。
    1. 背景(SITUATION):通过不断提问与工作业绩有关的背景问题,可以全面了解该应聘者取得优秀业绩的前提,从而获知所取得的业绩有多少是与应聘者个人有关,多少是和市场的状况、行业的特点有关。
    2. 工作任务(TASK): 每项任务的具体内容是什么样的。通过这些可以了解应聘者的工作经历和经验,以确定他所从事的工作与获得的经验是否适合所空缺的职位。
    3. 行动(ACTION): 即了解他是如何完成工作的,都采取了哪些行动,所采取的行动是如何帮助他完成工作的。通过这些,可以进一步了解他的工作方式、思维方式和行为方式。
    4. 结果(RESULT): 每项任务在采取了行动之后的结果是什么,是好还是不好,好是因为什么,不好又是因为什么。
  13. 重点:时间管理,项目经理,iOS上线发布过程,及过程安排?
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注