1 line
38 KiB
HTML
1 line
38 KiB
HTML
<!doctype html><html lang="en" itemscope itemtype="https://schema.org/Article"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>前端工作面试问题 ★ Front-end Job Interview Questions</title><meta name="description" content="A list of helpful front-end related questions you can use to interview potential candidates, test yourself or completely ignore."><meta name="keywords" content="front-end, interview questions, css questions, js questions, html questions, performance questions, interview test"><meta name="author" content="Front-end Job Interview Questions"><meta itemprop="author" content="Front-end Job Interview Questions"><meta itemprop="name" content="前端工作面试问题 ★ Front-end Job Interview Questions"><meta itemprop="description" content="A list of helpful front-end related questions you can use to interview potential candidates, test yourself or completely ignore."><meta itemprop="image" content="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/og-image.png"><meta property="og:title" content="前端工作面试问题 ★ Front-end Job Interview Questions"><meta property="og:description" content="A list of helpful front-end related questions you can use to interview potential candidates, test yourself or completely ignore."><meta property="og:url" content="https://h5bp.org/Front-end-Developer-Interview-Questions//translations/chinese/"><meta property="og:site_name" content="Front-end Job Interview Questions"><meta property="og:image" content="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/og-image.png"><meta property="og:type" content="website"><meta property="og:locale" content="en_US"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="前端工作面试问题 ★ Front-end Job Interview Questions"><meta name="twitter:description" content="A list of helpful front-end related questions you can use to interview potential candidates, test yourself or completely ignore."><meta name="twitter:site" content="@h5bp"><meta name="twitter:image" content="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/og-image.png"><meta name="twitter:creator" content="@h5bp"><link type="image/png" rel="apple-touch-icon" href="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/apple-touch-icon.png"><link type="image/png" sizes="32x32" rel="icon" href="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/favicon-32x32.png"><link type="image/png" sizes="16x16" rel="icon" href="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/favicon-32x32.png"><link type="image/png" color="#181818" rel="mask-icon" href="https://h5bp.org/Front-end-Developer-Interview-Questions//assets/images/favicon-96x96.png"><meta name="mobile-web-app-capable" content="yes"><meta name="robots" content="index,follow"><style>code[class*=language-],pre[class*=language-]{color:#c5c8c6;text-shadow:0 1px rgba(0,0,0,.3);font-family:Inconsolata,Monaco,Consolas,'Courier New',Courier,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#370b44}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#7c7c7c}.token.punctuation{color:#c5c8c6}.namespace{opacity:.7}.token.keyword,.token.property,.token.tag{color:#96cbfe}.token.class-name{color:#ffffb6;text-decoration:underline}.token.boolean,.token.constant{color:#9c9}.token.deleted,.token.symbol{color:#f92672}.token.number{color:#ff73fd}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a8ff60}.token.variable{color:#c6c5fe}.token.operator{color:#ededed}.token.entity{color:#ffffb6}.token.url{color:#96cbfe}.language-css .token.string,.style .token.string{color:#87c38a}.token.atrule,.token.attr-value{color:#f9ee98}.token.function{color:#dad085}.token.regex{color:#e9c062}.token.important{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--font-family-heading:sans-serif;--font-family-body:Georgia,serif;--font-family-code:Menlo,Monaco,'Courier New',monospace;--color-primary:#835EFF;--color-secondary:#FF008D;--color-safe:#8338EC;--color-gradient:linear-gradient(to right, var(--color-primary), var(--color-secondary));--color-highlight:var(--color-primary);--color-gray-opacity:rgba(39,39,39,0.04);--color-heading:#23231A;--color-text:#23231A;--background-default:#F9F9F9;--border-radius-default:5px;--box-shadow-default:0 2rem 4rem rgba(0,0,0,.15);--transition-duration:0.27s}body.rtl{--font-family-body:Arial,Helvetica,sans-serif}*{margin:0;padding:0;box-sizing:border-box;outline-color:var(--color-primary)}::selection{background:var(--color-primary);color:var(--background-default)}::-moz-selection{background:var(--color-primary);color:var(--background-default)}.nav{padding:1rem 0;position:relative;font-family:var(--font-family-heading)}.nav li{word-wrap:none;white-space:nowrap}.navigation{list-style:none;display:flex;flex-wrap:wrap;font-size:1rem}.navigation-questions-label{margin-right:auto}@media (min-width:60em){.navigation-questions-label{margin-right:0}}.navigation-toggle{display:inline-block;appearance:none;border:0;font-size:1rem;font-weight:600;cursor:pointer;background:0 0}.navigation-toggle::after{content:'\25BE';padding-left:.3rem;display:inline-block;font-size:1.2rem;font-weight:700;color:var(--color-primary);transform-origin:center}.navigation-toggle:active::after,.navigation-toggle:focus::after,.navigation-toggle:hover::after{color:var(--color-secondary)}.navigation.open .navigation-toggle::after{transform:scaleY(-1) translateY(-.25em)}@media (min-width:60em){.navigation-toggle{color:var(--color-text);pointer-events:none;cursor:default}.navigation-toggle::after{display:none}}.navigation-questions-list{padding:.5rem 1rem;display:flex;flex-direction:column;position:absolute;top:calc(100% - 1rem);left:0;z-index:1;opacity:0;transform:scale(.5,0);transform-origin:center top;transition:opacity .1s,transform .2s ease-out;background-color:#fff;box-shadow:0 0 0 1px var(--color-secondary),0 2px 4px -1px var(--color-text)}.navigation.open .navigation-questions-list{opacity:1;transform:none}.navigation.no-motion .navigation-questions-list{transition:none}@media (min-width:60em){.navigation-questions-list{padding:0;flex-direction:row;position:static;opacity:1;transform:none;transition:none;background-color:transparent;box-shadow:none}.navigation-questions-list li{margin:0}}.navigation-questions-anchor{visibility:hidden}.navigation.open .navigation-questions-anchor{visibility:visible}@media (min-width:60em){.navigation-questions-anchor{visibility:visible}}.navigation-item-emoji{width:100%;font-size:1rem;line-height:1rem;padding-bottom:1.5rem;margin-bottom:1.5rem;vertical-align:top;align-content:flex-start;border-bottom:1px solid #efefef}.navigation-item-home{border-bottom:none;padding-bottom:0;font-weight:600}@media (min-width:60em){.navigation-item-emoji{width:50%;margin-bottom:2rem;border-bottom:1px solid #efefef}}.navigation-item-emoji em{font-style:normal;margin-right:.5rem}.navigation-item-translations{text-align:left}@media (min-width:60em){.navigation-item-translations{text-align:right}}.navigation-item-home em{color:#835eff}.navigation-item-emoji a{text-decoration:none;display:inline-block;vertical-align:middle}@media (min-width:60em){.navigation-item:not(:last-of-type){margin-right:.8rem}}.navigation-anchor[rel~=external]::after{content:' ➚';color:var(--color-highlight)}.navigation-anchor.current{border-bottom:2px solid var(--color-highlight);padding:0 0 5px 0}.topbar{width:100%;height:.18rem;background:var(--color-gradient)}.skip-link{position:absolute;top:0;left:0;padding:.5rem 1rem;background-color:var(--color-primary);color:#fff;text-decoration:none;transform:translateY(-100%)}.skip-link:focus{transform:none}.header{margin-bottom:2rem}.header-big-title{font-size:2.3rem;line-height:1.06;margin:1.4rem 0 .7rem;color:var(--color-primary);word-break:break-word}.rtl .header-big-title{text-align:right}@media (min-width:30em){.header-big-title{margin:1.4rem 0 .7rem;font-size:4.6rem}}@media (min-width:60em){.header-big-title{margin:2.1rem 0 .7rem;font-size:5.4rem}}@supports (mix-blend-mode:lighten){.header-big-title{display:inline-block;position:relative;color:#000;background:#fff;mix-blend-mode:multiply}.header-big-title::before{content:'';display:block;position:absolute;top:0;right:0;bottom:0;left:0;background-image:url('https://h5bp.github.io/Front-end-Developer-Interview-Questions/assets/images/gradient.svg');background-size:cover;pointer-events:none}.header-big-title::before{mix-blend-mode:screen}}.header-heading{font-size:2.3rem;text-transform:uppercase}.header-big-description{font-size:1.2rem;line-height:1.4;padding:1rem 0}@media (min-width:30em){.header-big-description{font-size:1.5rem}}@media (min-width:60em){.header-big-description{font-size:1.8rem}}.header-description{padding-top:1rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--font-family-body);font-weight:400;font-size:1.2rem;line-height:2;color:var(--color-text)}section+section{padding-top:2rem}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading);color:var(--color-heading);font-style:normal;line-height:1.2;font-weight:600}section+section{padding-top:2rem}a{color:inherit;text-decoration:none;color:var(--color-secondary);transition:color ease-out var(--transition-duration)}a.current,a:focus:not(.skip-link),a:hover:not(.skip-link){color:var(--color-primary)}a:not(.navigation-anchor)[rel~=external]:after{content:' ➚'}ul:not(.navigation):not(.inline-list){list-style:none}ul:not(.navigation):not(.inline-list) li::before{content:"\25A0";color:var(--color-primary);font-weight:700;display:inline-block;width:1em;margin-left:-1em}.rtl ul:not(.navigation):not(.inline-list) li::before{margin-right:-1em;margin-left:initial}li{margin-bottom:.6rem}b,strong{font-weight:600}time{display:inline-block;color:var(--color-gray-70)}[tabindex='-1']{outline:0}img,svg{vertical-align:middle}img{display:block;max-width:100%;border-radius:var(--border-radius-default)}code{font-family:var(--font-family-code);color:var(--color-code);font-style:normal;font-size:1rem}blockquote:not([class]){padding-left:1rem;margin-left:-1rem;border-left:2px solid var(--color-primary);color:var(--color-gray-70);font-style:italic}code[class*=language-],pre[class*=language-]{font-size:.9rem;font-style:normal}p+pre[class*=language-]{margin-bottom:1.8rem}mark{color:var(--color-highlight);background-color:transparent}dt{font-weight:700}dd+dt{padding-top:.5rem}abbr[title],acronym[title]{background:var(--color-gray-opacity);border:1px solid var(--color-gray-opacity);cursor:help}.container{max-width:66rem;padding:1.5rem 2rem 2rem;margin-right:auto;margin-left:auto}@media (min-width:30rem){.container{padding:3rem 4rem 4rem}}.content li:not(:last-of-type){margin-bottom:1.2rem}.content h2{max-width:33rem}.content>:not(:last-child){margin-bottom:2rem}.content :not(hr)+h2,.content :not(hr)+h3{padding-top:1rem}.content ol:not(.inline-list),.content ul:not(.inline-list){padding-left:1.2rem}.content-simple li:not(:last-of-type){margin-bottom:.5rem}.content-edit{text-align:right;margin-top:2rem}.inline-list{padding:0;list-style:none;display:flex;flex-wrap:wrap}.inline-list li{padding:0 5px;display:inline-block;vertical-align:middle;text-align:center}.inline-list li::before{content:'';margin-left:0}.inline-list li img{display:block;margin:auto;margin-bottom:.6rem}.inline-list li a{display:inline-block;vertical-align:middle;margin:0 .15rem}.inline-list-contributors li a,.inline-list-original li a{font-size:1rem}.avatar{max-width:12rem}hr{border:none;bacground:none;border-bottom:1px solid #efefef}.footer{padding-top:3rem}.footer-text{font-size:.8rem}</style></head><body class=""><div class="topbar"></div><div class="container"><a class="skip-link" href="#main-content">Skip to main content</a><nav class="nav"><ul class="navigation" id="navigation"><li class="navigation-item-emoji navigation-item-home"><a class="navigation-anchor" href="/'Front-end-Developer-Interview-Questions/'/" title="Home"><em>★</em><span>Front-end Developer Interview Questions</span></a></li><li class="navigation-item-emoji navigation-item-translations"><a class="navigation-anchor" href="/'Front-end-Developer-Interview-Questions/'/translations" title="Translations"><em>🌐</em><span>Translations</span></a></li><li class="navigation-item navigation-questions-label"><button class="navigation-toggle" id="navigation-toggle">Questions:</button></li><li class="navigation-item navigation-questions"><ul class="navigation navigation-questions-list"><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/general-questions/" title="General Questions">General</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/html-questions/" title="HTML Questions">HTML</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/css-questions/" title="CSS Questions">CSS</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/javascript-questions/" title="JavaScript Questions">JavaScript</a></li><li class="navigation-item"><a rel="external noreferrer noopener" target="_blank" class="navigation-anchor navigation-questions-anchor" href="https://scottaohara.github.io/accessibility_interview_questions/" title="Accessibility Questions (external link)">A11y</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/testing-questions/" title="Testing Questions">Testing</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/performance-questions/" title="Performance Questions">Performance</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/network-questions/" title="Network Questions">Network</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/coding-questions/" title="Coding Questions">Coding</a></li><li class="navigation-item"><a class="navigation-anchor navigation-questions-anchor" href="/'Front-end-Developer-Interview-Questions/'/questions/fun-questions/" title="Fun Questions">Fun</a></li></ul></li></ul></nav><main id="main-content" tabindex="-1"><header class="header"><h1 class="header-big-title">前端工作面试问题</h1></header><div class="content"><h1>前端工作面试问题</h1><p>本文包含了一些用于考查候选者的前端面试问题。不建议对单个候选者问及每个问题 (那需要好几个小时)。只要从列表里挑选一些,就能帮助你考查候选者是否具备所需要的技能。</p><p><strong>备注:</strong> 这些问题中很多都是开放性的,可以引发有趣的讨论。这比直接的答案更能体现此人的能力。</p><h2 id="%E7%9B%AE%E5%BD%95" tabindex="-1"><a class="header-anchor" href="#%E7%9B%AE%E5%BD%95"></a> <a name="toc">目录</a></h2><ol><li><a href="#general-questions">常见问题</a></li><li><a href="#html-questions">HTML 相关问题</a></li><li><a href="#css-questions">CSS 相关问题</a></li><li><a href="#js-questions">JS 相关问题</a></li><li><a href="#testing-questions">测试相关问题</a></li><li><a href="#performance-questions">效能相关问题</a></li><li><a href="#network-questions">网络相关问题</a></li><li><a href="#coding-questions">代码相关问题</a></li><li><a href="#fun-questions">趣味问题</a></li></ol><h2 id="%E5%8F%82%E4%B8%8E%E5%8D%8F%E4%BD%9C" tabindex="-1"><a class="header-anchor" href="#%E5%8F%82%E4%B8%8E%E5%8D%8F%E4%BD%9C"></a> 参与协作</h2><ol><li><a href="#contributors">贡献者</a></li><li><a href="https://github.com/h5bp/Front-end-Developer-Interview-Questions/blob/master/CONTRIBUTING.md">如何参与贡献</a></li><li><a href="https://github.com/h5bp/Front-end-Developer-Interview-Questions/blob/master/LICENSE.md">许可协议</a></li></ol><h4><a name="general-questions">常见问题:</a></h4><ul><li>你在昨天/本周学到了什么?</li><li>编写代码的哪些方面能够使你兴奋或感兴趣?</li><li>你最近遇到过什么技术挑战?你是如何解决的?</li><li>在制作一个网页应用或网站的过程中,你是如何考虑其 UI、安全性、高性能、SEO、可维护性以及技术因素的?</li><li>请谈谈你喜欢的开发环境。</li><li>你最熟悉哪一套版本控制系统?</li><li>你能描述当你制作一个网页的工作流程吗?</li><li>假若你有 5 个不同的样式文件 (stylesheets), 整合进网站的最好方式是?</li><li>你能描述渐进增强 (progressive enhancement) 和优雅降级 (graceful degradation) 之间的不同吗?</li><li>你如何对网站的文件和资源进行优化?</li><li>浏览器同一时间可以从一个域名下载多少资源?<ul><li>有什么例外吗?</li></ul></li><li>请说出三种减少页面加载时间的方法。(加载时间指感知的时间或者实际加载时间)</li><li>如果你参与到一个项目中,发现他们使用 Tab 来缩进代码,但是你喜欢空格,你会怎么做?</li><li>请写一个简单的幻灯效果页面。</li><li>如果今年你打算熟练掌握一项新技术,那会是什么?</li><li>请谈谈你对网页标准和标准制定机构重要性的理解。</li><li>什么是 FOUC (无样式内容闪烁)?你如何来避免 FOUC?</li><li>请解释什么是 ARIA 和屏幕阅读器 (screenreaders),以及如何使网站实现无障碍访问 (accessible)。</li><li>请解释 CSS 动画和 JavaScript 动画的优缺点。</li><li>什么是跨域资源共享 (CORS)?它用于解决什么问题?</li></ul><h4><a name="html-questions">HTML 相关问题:</a></h4><ul><li><code>doctype</code>(文档类型) 的作用是什么?</li><li>浏览器标准模式 (standards mode) 、几乎标准模式(almost standards mode)和怪异模式 (quirks mode) 之间的区别是什么?</li><li>HTML 和 XHTML 有什么区别?</li><li>如果页面使用 ‘application/xhtml+xml’ 会有什么问题吗?</li><li>如果网页内容需要支持多语言,你会怎么做?</li><li>在设计和开发多语言网站时,有哪些问题你必须要考虑?</li><li>使用 <code>data-</code> 属性的好处是什么?</li><li>如果把 HTML5 看作做一个开放平台,那它的构建模块有哪些?</li><li>请描述 <code>cookies</code>、<code>sessionStorage</code> 和 <code>localStorage</code> 的区别。</li><li>请解释 <code><script></code>、<code><script async></code> 和 <code><script defer></code> 的区别。</li><li>为什么通常推荐将 CSS <code><link></code> 放置在 <code><head></head></code> 之间,而将 JS <code><script></code> 放置在 <code></body></code> 之前?你知道有哪些例外吗?</li><li>什么是渐进式渲染 (progressive rendering)?</li><li>你用过哪些不同的 HTML 模板语言?</li></ul><h4><a name="css-questions">CSS 相关问题:</a></h4><ul><li>CSS 中类 (classes) 和 ID 的区别。</li><li>请问 “resetting” 和 “normalizing” CSS 之间的区别?你会如何选择,为什么?</li><li>请解释浮动 (Floats) 及其工作原理。</li><li>描述<code>z-index</code>和叠加上下文是如何形成的。</li><li>请描述 BFC(Block Formatting Context) 及其如何工作。</li><li>列举不同的清除浮动的技巧,并指出它们各自适用的使用场景。</li><li>请解释 CSS sprites,以及你要如何在页面或网站中实现它。</li><li>你最喜欢的图片替换方法是什么,你如何选择使用。</li><li>你会如何解决特定浏览器的样式问题?</li><li>如何为有功能限制的浏览器提供网页?<ul><li>你会使用哪些技术和处理方法?</li></ul></li><li>有哪些的隐藏内容的方法 (如果同时还要保证屏幕阅读器可用呢)?</li><li>你用过栅格系统 (grid system) 吗?如果使用过,你最喜欢哪种?</li><li>你用过媒体查询,或针对移动端的布局/CSS 吗?</li><li>你熟悉 SVG 样式的书写吗?</li><li>如何优化网页的打印样式?</li><li>在书写高效 CSS 时会有哪些问题需要考虑?</li><li>使用 CSS 预处理器的优缺点有哪些?<ul><li>请描述你曾经使用过的 CSS 预处理器的优缺点。</li></ul></li><li>如果设计中使用了非标准的字体,你该如何去实现?</li><li>请解释浏览器是如何判断元素是否匹配某个 CSS 选择器?</li><li>请描述伪元素 (pseudo-elements) 及其用途。</li><li>请解释你对盒模型的理解,以及如何在 CSS 中告诉浏览器使用不同的盒模型来渲染你的布局。</li><li>请解释 <code>* { box-sizing: border-box; }</code> 的作用, 并且说明使用它有什么好处?</li><li>请罗列出你所知道的 display 属性的全部值</li><li>请解释 inline 和 inline-block 的区别?</li><li>请解释 relative、fixed、absolute 和 static 元素的区别</li><li>CSS 中字母 ‘C’ 的意思是叠层 (Cascading)。请问在确定样式的过程中优先级是如何决定的 (请举例)?如何有效使用此系统?</li><li>你在开发或生产环境中使用过哪些 CSS 框架?你觉得应该如何改善他们?</li><li>请问你有尝试过 CSS Flexbox 或者 Grid 标准规格吗?</li><li>为什么响应式设计 (responsive design) 和自适应设计 (adaptive design) 不同?</li><li>你有兼容 retina 屏幕的经历吗?如果有,在什么地方使用了何种技术?</li><li>请问为何要使用 <code>translate()</code> 而非 <em>absolute positioning</em>,或反之的理由?为什么?</li></ul><h4><a name="js-questions">JS 相关问题:</a></h4><ul><li>请解释事件代理 (event delegation)。</li><li>请解释 JavaScript 中 <code>this</code> 是如何工作的。</li><li>请解释原型继承 (prototypal inheritance) 的原理。</li><li>你怎么看 AMD vs. CommonJS?</li><li>请解释为什么接下来这段代码不是 IIFE (立即调用的函数表达式):<code>function foo(){ }();</code>.<ul><li>要做哪些改动使它变成 IIFE?</li></ul></li><li>描述以下变量的区别:<code>null</code>,<code>undefined</code> 或 <code>undeclared</code>?<ul><li>该如何检测它们?</li></ul></li><li>什么是闭包 (closure),如何使用它,为什么要使用它?</li><li>请举出一个匿名函数的典型用例?</li><li>你是如何组织自己的代码?是使用模块模式,还是使用经典继承的方法?</li><li>请指出 JavaScript 宿主对象 (host objects) 和原生对象 (native objects) 的区别?</li><li>请指出以下代码的区别:<code>function Person(){}</code>、<code>var person = Person()</code>、<code>var person = new Person()</code>?</li><li><code>.call</code> 和 <code>.apply</code> 的区别是什么?</li><li>请解释 <code>Function.prototype.bind</code>?</li><li>在什么时候你会使用 <code>document.write()</code>?</li><li>请指出浏览器特性检测,特性推断和浏览器 UA 字符串嗅探的区别?</li><li>请尽可能详尽的解释 Ajax 的工作原理。</li><li>使用 Ajax 都有哪些优劣?</li><li>请解释 JSONP 的工作原理,以及它为什么不是真正的 Ajax。</li><li>你使用过 JavaScript 模板系统吗?<ul><li>如有使用过,请谈谈你都使用过哪些库?</li></ul></li><li>请解释变量声明提升 (hoisting)。</li><li>请描述事件冒泡机制 (event bubbling)。</li><li>“attribute” 和 “property” 的区别是什么?</li><li>为什么扩展 JavaScript 内置对象不是好的做法?</li><li>请指出 document load 和 document DOMContentLoaded 两个事件的区别。</li><li><code>==</code> 和 <code>===</code> 有什么不同?</li><li>请解释 JavaScript 的同源策略 (same-origin policy)。</li><li>如何实现下列代码:</li></ul><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">duplicator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [1,2,3,4,5,1,2,3,4,5]</span></code></pre><ul><li>什么是三元表达式 (Ternary expression)?“三元 (Ternary)” 表示什么意思?</li><li>什么是 <code>"use strict";</code> ? 使用它的好处和坏处分别是什么?</li><li>请实现一个遍历至 <code>100</code> 的 for loop 循环,在能被 <code>3</code> 整除时输出 <strong>“fizz”</strong>,在能被 <code>5</code> 整除时输出 <strong>“buzz”</strong>,在能同时被 <code>3</code> 和 <code>5</code> 整除时输出 <strong>“fizzbuzz”</strong>。</li><li>为何通常会认为保留网站现有的全局作用域 (global scope) 不去改变它,是较好的选择?</li><li>为何你会使用 <code>load</code> 之类的事件 (event)?此事件有缺点吗?你是否知道其他替代品,以及为何使用它们?</li><li>请解释什么是单页应用 (single page app), 以及如何使其对搜索引擎友好 (SEO-friendly)。</li><li>你使用过 Promises 及其 polyfills 吗? 请写出 Promise 的基本用法(ES6)。</li><li>使用 Promises 而非回调 (callbacks) 优缺点是什么?</li><li>使用一种可以编译成 JavaScript 的语言来写 JavaScript 代码有哪些优缺点?</li><li>你使用哪些工具和技术来调试 JavaScript 代码?</li><li>你会使用怎样的语言结构来遍历对象属性 (object properties) 和数组内容?</li><li>请解释可变 (mutable) 和不变 (immutable) 对象的区别。<ul><li>请举出 JavaScript 中一个不变性对象 (immutable object) 的例子?</li><li>不变性 (immutability) 有哪些优缺点?</li><li>如何用你自己的代码来实现不变性 (immutability)?</li></ul></li><li>请解释同步 (synchronous) 和异步 (asynchronous) 函数的区别。</li><li>什么是事件循环 (event loop)?<ul><li>请问调用栈 (call stack) 和任务队列 (task queue) 的区别是什么?</li></ul></li><li>解释 <code>function foo() {}</code> 与 <code>var foo = function() {}</code> 用法的区别</li></ul><h4><a name="testing-questions">测试相关问题:</a></h4><ul><li>对代码进行测试的有什么优缺点?</li><li>你会用什么工具测试你的代码功能?</li><li>单元测试与功能/集成测试的区别是什么?</li><li>代码风格 linting 工具的作用是什么?</li></ul><h4><a name="performance-questions">效能相关问题:</a></h4><ul><li>你会用什么工具来查找代码中的性能问题?</li><li>你会用什么方式来增强网站的页面滚动效能?</li><li>请解释 layout、painting 和 compositing 的区别。</li></ul><h4><a name="network-questions">网络相关问题:</a></h4><ul><li>为什么传统上利用多个域名来提供网站资源会更有效?</li><li>请尽可能完整得描述从输入 URL 到整个网页加载完毕及显示在屏幕上的整个流程。</li><li>Long-Polling、Websockets 和 Server-Sent Event 之间有什么区别?</li><li>请描述以下 request 和 response headers:<ul><li>Diff. between Expires, Date, Age and If-Modified-…</li><li>Do Not Track</li><li>Cache-Control</li><li>Transfer-Encoding</li><li>ETag</li><li>X-Frame-Options</li></ul></li><li>什么是 HTTP method?请罗列出你所知道的所有 HTTP method,并给出解释。</li><li>请解释 HTTP status 301 与 302 的区别?</li></ul><h4><a name="coding-questions">代码相关的问题:</a></h4><p><em>问题:<code>foo</code>的值是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> foo <span class="token operator">=</span> <span class="token number">10</span> <span class="token operator">+</span> <span class="token string">'20'</span><span class="token punctuation">;</span></code></pre><p><em>问题:如何实现以下函数?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 7</span><br><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 7</span></code></pre><p><em>问题:下面的语句的返回值是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token string">"i'm a lasagna hog"</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reverse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><em>问题:<code>window.foo</code>的值是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span> window<span class="token punctuation">.</span>foo <span class="token operator">||</span> <span class="token punctuation">(</span> window<span class="token punctuation">.</span>foo <span class="token operator">=</span> <span class="token string">"bar"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><em>问题:下面两个 alert 的结果是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> foo <span class="token operator">=</span> <span class="token string">"Hello"</span><span class="token punctuation">;</span><br><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br> <span class="token keyword">var</span> bar <span class="token operator">=</span> <span class="token string">" World"</span><span class="token punctuation">;</span><br> <span class="token function">alert</span><span class="token punctuation">(</span>foo <span class="token operator">+</span> bar<span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span>foo <span class="token operator">+</span> bar<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><em>问题:<code>foo.length</code>的值是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> foo <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br>foo<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br>foo<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><em>问题:<code>foo.x</code>的值是什么?</em></p><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> foo <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">n</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br><span class="token keyword">var</span> bar <span class="token operator">=</span> foo<span class="token punctuation">;</span><br>foo<span class="token punctuation">.</span>x <span class="token operator">=</span> foo <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">n</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre><p><em>问题:下面代码的输出是什么?</em></p><pre class="language-javascript"><code class="language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'one'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'two'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'three'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4><a name="fun-questions">趣味问题:</a></h4><ul><li>你最近写过什么的很酷的项目吗?</li><li>在你使用的开发工具中,最喜欢哪些方面?</li><li>谁使你踏足了前端开发领域?</li><li>你有什么业余项目吗?是哪种类型的?</li><li>你最爱的 IE 特性是什么?</li><li>你对咖啡有没有什么喜好?</li></ul><h4><a name="contributors">贡献者:</a></h4><p>本文档始于 2009 年,是以下作者的合作成果:<a href="https://twitter.com/paul_irish">@paul_irish</a> <a href="https://twitter.com/bentruyman">@bentruyman</a> <a href="https://twitter.com/cowboy">@cowboy</a> <a href="https://twitter.com/ajpiano">@ajpiano</a> <a href="https://twitter.com/slexaxton">@SlexAxton</a> <a href="https://twitter.com/boazsender">@boazsender</a> <a href="https://twitter.com/miketaylr">@miketaylr</a> <a href="https://twitter.com/vladikoff">@vladikoff</a> <a href="https://twitter.com/gf3">@gf3</a> <a href="https://twitter.com/jon_neal">@jon_neal</a> <a href="https://twitter.com/sambreed">@sambreed</a> 和 <a href="https://twitter.com/iansym">@iansym</a>。</p><p>时至今日,文档已经融入超过 <a href="https://github.com/h5bp/Front-end-Developer-Interview-Questions/graphs/contributors">100 位开发者</a>的贡献。</p></div><div class="content-edit"><a rel="external noreferrer noopener" target="_blank" href="https://github.com/h5bp/Front-end-Developer-Interview-Questions/tree/master/src/translations/chinese.md">Edit this page</a></div></main><footer class="footer"><p class="footer-text">Copyright © 2012 - 2021. Contributors to <a href="https://github.com/h5bp/Front-end-Developer-Interview-Questions/blob/master/CONTRIBUTORS.md">Front-end-Developer-Interview-Questions.</a><br>Curious about the project? <a href="/'Front-end-Developer-Interview-Questions/'/about/">Read more about here</a>.</p></footer></div><script>console.log("%cA black belt is a white belt that didn't quit.","color: #fff; font-size: 20px; text-shadow: 1px 1px 1px #000; font-family: serif;");var navToggle=document.getElementById("navigation-toggle"),nav=document.getElementById("navigation");navToggle.addEventListener("click",function(){nav.classList.toggle("open")}),window.addEventListener("resize",function(){document.width>960?nav.classList.remove("active"):(nav.classList.add("no-motion"),setTimeout(function(){nav.classList.remove("no-motion")},250))});</script></body></html> |