很多企业现在要求求职者完成面试题, web 前端开发面试试题已经成为 Web 前端开发求职者求职面试过程中的重要环节之一. 本文为大家整理了一下前端面试题及答案, 希望对大家有一定的帮助.
什么叫优雅降级和渐进增强?
优雅降级: Web 站点在所有新式浏览器中都能正常工作, 如果用户使用的是老式浏览器, 则代码会检查以确认它们是否能正常工作.
由于 IE 独特的盒模型布局问题, 针对不同版本的 IE 的 hack 实践过优雅降级了, 为那些无法支持功能的浏览器增加候选方案, 使之在旧式浏览器上以某种形式降级体验却不至于完全失效.
渐进增强: 从被所有浏览器支持的基本功能开始, 逐步地添加那些只有新式浏览器才支持的功能, 向页面增加无害于基础浏览器的额外样式和功能的. 当浏览器支持时, 它们会自动地呈现出来并发挥作用.
对 Node 的优点和缺点提出了自己的看法?
*(优点)因为 Node 是基于事件驱动和无阻塞的, 所以非常适合处理并发请求, 因此构建在 Node 上的代理服务器相比其他技术实现 (如 Ruby) 的服务器表现要好得多.
此外, 与 Node 代理服务器交互的客户端代码是由 JavaScript 语言编写的, 因此客户端和服务器端都用同一种语言编写, 这是非常美妙的事情.
*(缺点)Node 是一个相对新的开源项目, 所以不太稳定, 它总是一直在变, 而且缺少足够多的第三方库支持. 看起来, 就像是 Ruby/Rails 当年的样子.
对前端界面工程师这个职位是怎么样理解的? 它的前景会怎么样?
前端是最贴近用户的程序员, 比后端, 数据库, 产品经理, 运营, 安全都近.
1, 实现界面交互
2, 提升用户体验
3, 有了 Node.JS, 前端可以实现服务端的一些事情
前端是最贴近用户的程序员, 前端的能力就是能让产品从 90 分进化到 100 分, 甚至更好, 参与项目, 快速高质量完成实现效果图, 精确到 1px;
与团队成员, UI 设计, 产品经理的沟通;
做好的页面结构, 页面重构和用户体验;
处理 hack, 兼容, 写出优美的代码格式;
针对服务器的优化, 拥抱最新前端技术.
你有哪些性能优化的方法?
(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) 图片预加载, 将样式表放在顶部, 将脚本放在底部 加上时间戳.
http 状态码有那些? 分别代表是什么意思?
100-199 用于指定客户端应相应的某些动作.
200-299 用于表示请求成功.
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息.
400-499 用于指出客户端的错误. 400 1, 语义有误, 当前请求无法被服务器理解. 401 当前请求需要用户验证 403 服务器已经理解请求, 但是拒绝执行它.
500-599 用于支持服务器错误. 503 - 服务不可用
一个页面从输入 URL 到页面加载显示完成, 这个过程中都发生了什么?
分为 4 个步骤:
(1)当发送一个 URL 请求时, 不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL, 浏览器都会开启一个线程来处理这个请求, 同时在远程 DNS 服务器上启动一个 DNS 查询. 这能使浏览器获得请求对应的 IP 地址.
(2) 浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接. 该握手包括一个同步报文, 一个同步 - 应答报文和一个应答报文, 这三个报文在 浏览器和服务器之间传递.
该握手首先由客户端尝试建立起通信, 而后服务器应答并接受客户端的请求, 最后由客户端发出该请求已经被接受的报文.
(3)一旦 TCP/IP 连接建立, 浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求. 远程服务器找到资源并使用 HTTP 响应返回该资源, 值为 200 的 HTTP 响应状态表示一个正确的响应.
(4)此时, Web 服务器提供资源服务, 客户端开始下载资源.
请求返回后, 便进入了我们关注的前端模块, 简单来说, 浏览器会解析 HTML 生成 DOM Tree, 其次会根据 CSS 生成 CSS Rule Tree, 而 JavaScript 又可以根据 DOM API 操作 DOM.
平时如何管理你的项目?
先期团队必须确定好全局样式(globe.CSS), 编码模式(utf-8) 等;
编写习惯必须一致(例如都是采用继承式的写法, 单样式都写成一行);
- <div>
- 标注样式编写人, 各模块都及时标注(标注关键样式调用的地方);
- </div>
- <div>
- 页面进行标注(例如 页面 模块 开始和结束);
- </div>
- <div>
- CSS 跟 HTML 分文件夹并行存放, 命名都得统一(例如 style.CSS);
- </div>
- <div>
- JS 分文件夹存放 命名以该 JS 功能为准的英文翻译.
- </div>
- <div>
- 图片采用整合的 images.PNG png8 格式文件使用 尽量整合在一起使用方便将来的管理
- </div>
JavaScript 对象的几种创建方式
1, 工厂模式
2, 构造函数模式
3, 原型模式
4, 混合构造函数和原型模式
5, 动态原型模式
6, 寄生构造函数模式
7, 稳妥构造函数模式
JavaScript 继承的 6 种方法
1, 原型链继承
2, 借用构造函数继承
3, 组合继承(原型 + 借用构造)
4, 原型式继承
5, 寄生式继承
6, 寄生组合式继承
Ajax 过程
(1)创建 XMLHttpRequest 对象, 也就是创建一个异步调用对象.
(2)创建一个新的 HTTP 请求, 并指定该 HTTP 请求的方法, URL 及验证信息.
(3)设置响应 HTTP 请求状态变化的函数.
(4)发送 HTTP 请求.
(5)获取异步调用返回的数据.
(6)使用 JavaScript 和 DOM 实现局部刷新.
异步加载和延迟加载
1, 异步加载的方案: 动态插入 script 标签
2, 通过 Ajax 去获取 JS 代码, 然后通过 eval 执行
3,script 标签上添加 defer 或者 async 属性
4, 创建并插入 iframe, 让它异步执行 JS
5, 延迟加载: 有些 JS 代码并不是页面初始化的时候就立刻需要的, 而稍后的某些情况才需要的.
前端安全问题?
(XSS,sql 注入, CSRF)
CSRF: 是跨站请求伪造, 很明显根据刚刚的解释, 他的核心也就是请求伪造, 通过伪造身份提交 POST 和 GET 请求来进行跨域的攻击.
** 完成 CSRF 需要两个步骤:**
1, 登陆受信任的网站 A, 在本地生成 COOKIE
2, 在不登出 A 的情况下, 或者本地 COOKIE 没有过期的情况下, 访问危险网站 B.
IE 各版本和 Chrome 可以并行下载多少个资源
IE6 两个并发, iE7 升级之后的 6 个并发, 之后版本也是 6 个
Firefox,Chrome 也是 6 个
JavaScript 里面的继承怎么实现, 如何避免原型链上面的对象共享
用构造函数和原型链的混合模式去实现继承, 避免对象共享可以参考经典的 extend()函数, 很多前端框架都有封装的, 就是用一个空函数当做中间变量
grunt, YUI compressor 和 google clojure 用来进行代码压缩的用法.
YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具, 采用 Java 开发.
使用方法:
- // 压缩 JS
- java -jar yuicompressor-2.4.2.jar --type JS --charset utf-8 -v src.JS> packed.JS
- // 压缩 CSS
- java -jar yuicompressor-2.4.2.jar --type CSS --charset utf-8 -v src.CSS> packed.CSS
Flash,Ajax 各自的优缺点, 在使用中如何取舍?
1,Flash Ajax 对比
Flash 适合处理多媒体, 矢量图形, 访问机器; 对 CSS, 处理文本上不足, 不容易被搜索.
Ajax 对 CSS, 文本支持很好, 支持搜索; 多媒体, 矢量图形, 机器访问不足.
共同点: 与服务器的无刷新传递消息, 用户离线和在线状态, 操作 DOM
请解释一下 JavaScript 的同源策略.
概念: 同源策略是客户端脚本 (尤其是 JavaScript) 的重要的安全度量标准. 它最早出自 Netscape Navigator2.0, 其目的是防止某个文档或脚本从多个不同源装载.
这里的同源策略指的是: 协议, 域名, 端口相同, 同源策略是一种安全协议. 指一段脚本只能读取来自同一来源的窗口和文档的属性.
为什么要有同源限制?
我们举例说明: 比如一个黑客程序, 他利用 Iframe 把真正的银行登录页面嵌到他的页面上, 当你使用真实的用户名, 密码登录时, 他的页面就可以通过 JavaScript 读取到你的表单中 input 中的内容, 这样用户名, 密码就轻松到手了.
什么是 "use strict"; ? 使用它的好处和坏处分别是什么?
ECMAscript 5 添加了第二种运行模式:"严格模式"(strict mode). 顾名思义, 这种模式使得 JavaScript 在更严格的条件下运行.
设立 "严格模式" 的目的, 主要有以下几个:
- 消除 JavaScript 语法的一些不合理, 不严谨之处, 减少一些怪异行为;
- 消除代码运行的一些不安全之处, 保证代码运行的安全;
- 提高编译器效率, 增加运行速度;
- 为未来新版本的 JavaScript 做好铺垫.
注: 经过测试 IE6,7,8,9 均不支持严格模式.
缺点:
现在网站的 JS 都会进行压缩, 一些文件用了严格模式, 而另一些没有. 这时这些本来是严格模式的文件, 被 merge 后, 这个串就到了文件的中间, 不仅没有指示严格模式, 反而在压缩后浪费了字节.
GET 和 POST 的区别, 何时使用 POST?
GET: 一般用于信息获取, 使用 URL 传递参数, 对所发送信息的数量也有限制, 一般在 2000 个字符
POST: 一般用于修改服务器上的资源, 对所发送的信息没有限制.
GET 方式需要使用 Request.QueryString 来取得变量的值, 而 POST 方式通过 Request.Form 来获取变量的值, 也就是说 Get 是通过地址栏来传值, 而 Post 是通过提交表单来传值.
然而, 在以下情况中, 请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时, POST 比 GET 更稳定也更可靠
哪些地方会出现 CSS 阻塞, 哪些地方会出现 JS 阻塞?
JS 的阻塞特性:
所有浏览器在下载 JS 的时候, 会阻止一切其他活动, 比如其他资源的下载, 内容的呈现等等. 直到 JS 下载, 解析, 执行完毕后才开始继续并行下载其他资源并呈现内容.
为了提高用户体验, 新一代浏览器都支持并行下载 JS, 但是 JS 下载仍然会阻塞其它资源的下载(例如. 图片, CSS 文件等).
由于浏览器为了防止出现 JS 修改 DOM 树, 需要重新构建 DOM 树的情况, 所以就会阻塞其他的下载和呈现
嵌入 JS 会阻塞所有内容的呈现, 而外部 JS 只会阻塞其后内容的显示, 2 种方式都会阻塞其后资源的下载. 也就是说外部样式不会阻塞外部脚本的加载, 但会阻塞外部脚本的执行.
CSS 怎么会阻塞加载了? CSS 本来是可以并行下载的, 在什么情况下会出现阻塞加载了(在测试观察中, IE6 下 CSS 都是阻塞加载)
当 CSS 后面跟着嵌入的 JS 的时候, 该 CSS 就会出现阻塞后面资源下载的情况. 而当把嵌入 JS 放到 CSS 前面, 就不会出现阻塞的情况了.
根本原因: 因为浏览器会维持 HTML 中 CSS 和 JS 的顺序, 样式表必须在嵌入的 JS 执行前先加载, 解析完. 而嵌入的 JS 会阻塞后面的资源加载, 所以就会出现上面 CSS 阻塞下载的情况.
嵌入 JS 应该放在什么位置?
1, 放在底部, 虽然放在底部照样会阻塞所有呈现, 但不会阻塞资源下载.
2, 如果嵌入 JS 放在 head 中, 请把嵌入 JS 放在 CSS 头部.
3, 使用 defer(只支持 IE)
4, 不要在嵌入的 JS 中调用运行时间较长的函数, 如果一定要用, 可以用 `setTimeout` 来调用
JavaScript 无阻塞加载具体方式
将脚本放在底部:
<link > 还是放在 head 中, 用以保证在 JS 加载前, 能加载出正常显示的页面.<script > 标签放在</body > 前.
成组脚本:
由于每个 < script > 标签下载时阻塞页面解析过程, 所以限制页面的 < script > 总数也可以改善性能. 适用于内联脚本和外部脚本.
非阻塞脚本:
等页面完成加载后, 再加载 JS 代码. 也就是, 在 Windows.onload 事件发出后开始下载代码.
(1)defer 属性: 支持 IE4 和 fierfox3.5 更高版本浏览器
(2)动态脚本元素: 文档对象模型 (DOM) 允许你使用 JS 动态创建 HTML 的几乎全部文档内容. 代码如下:
- <script>
- var script = document.createElement("script");
- script.type = "text/javascript";
- script.src = "file.js";
- document.getElementsByTagName("head")[0].appendChild(script);
- </script>
此技术的重点在于: 无论在何处启动下载, 文件额下载和运行都不会阻塞其他页面处理过程. 即使在 head 里(除了用于下载文件的 http 链接).
本文来自 HTML 中文网 前端面试题 https://www.html.cn/interview/ 栏目!!
来源: http://www.css88.com/interview/14217.html