Repository: mianshipai/mianshipai-web Branch: main Commit: e511f955dbab Files: 44 Total size: 420.0 KB Directory structure: gitextract_hn4k_4k7/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── 提交招聘网址.md │ │ ├── 提交问题和建议.md │ │ └── 提交面试真题.md │ └── workflows/ │ └── deploy-gh-pages.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .prettierrc.js ├── .vitepress/ │ └── config.mts ├── README.md ├── docs/ │ ├── api-examples.md │ ├── before-interview/ │ │ ├── jd.md │ │ ├── post-resume.md │ │ ├── process.md │ │ └── write-resume.md │ ├── first-exam/ │ │ ├── ComputerBase.md │ │ ├── HTML-CSS.md │ │ ├── HTTP.md │ │ ├── JS.md │ │ └── TS.md │ ├── hr-exam/ │ │ ├── behavioural-test.md │ │ └── salary.md │ ├── markdown-examples.md │ ├── second-exam/ │ │ ├── HarmonyOS-application-development.md │ │ ├── engineering.md │ │ ├── mini-program.md │ │ ├── nodejs.md │ │ ├── react-inner.md │ │ ├── react-usage.md │ │ ├── vue-inner.md │ │ └── vue-usage.md │ ├── services/ │ │ ├── 1v1.md │ │ ├── group.md │ │ └── job.md │ ├── third-exam/ │ │ ├── ask-in-reply.md │ │ ├── cross-test.md │ │ ├── leader-test.md │ │ ├── project.md │ │ ├── scene.md │ │ └── system-design.md │ └── written-exam/ │ ├── JS-reading.md │ ├── JS-writing.md │ └── algorithm.md ├── index.md └── package.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/提交招聘网址.md ================================================ --- name: 提交招聘网址 about: 提交招聘网址 title: '' labels: '' assignees: '' --- ## 公司 ## 网址 - 校招 - 社招 ## 城市 ================================================ FILE: .github/ISSUE_TEMPLATE/提交问题和建议.md ================================================ --- name: 提交问题和建议 about: 提交问题和建议 title: '' labels: '' assignees: '' --- ## 遇到了什么问题? ## 有什么建议? ================================================ FILE: .github/ISSUE_TEMPLATE/提交面试真题.md ================================================ --- name: 提交面试真题 about: 提交你遇到的面试真题,我们会收录并解答 title: '' labels: '' assignees: '' --- 请按照如下模板提交面试题,尽量提供全面信息,否则不予收录。 ## 题目描述 题目标题 题目描述 相关代码(可选) 相关截图(可选) ## 面试的公司 公司名称 官网网址 ## 城市 xx ================================================ FILE: .github/workflows/deploy-gh-pages.yml ================================================ # Sample workflow for building and deploying a Jekyll site to GitHub Pages name: Deploy to GitHub Pages on: # Runs on pushes targeting the default branch push: branches: ['prod-deploy'] paths: - '.vitepress/**' - 'docs/**' - index.md - package.json jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: build run: | npm install npm run docs:build echo "---------- vitepress build done ----------" - name: set ssh key # 临时设置 ssh key run: | mkdir -p ~/.ssh/ echo "${{secrets.SSH_KEY_FOR_DEPLOY_GH_PAGES}}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan "github.com" >> ~/.ssh/known_hosts echo "---------- set ssh-key ok ----------" - name: download and replace # 下载现有文件,替换 run: | git clone git@github.com:mianshipai/mianshipai.github.io.git echo "---------- git clone ok ----------" cp -r ./.vitepress/dist/* ./mianshipai.github.io ## 用最新构建出来的文件,替换现有的 echo "---------- replace ok ----------" - name: upload latest files # 上传文件 run: | cd ./mianshipai.github.io git config user.name "github-actions" git config user.email "github-actions@github.com" echo "---------- begin git status ----------" echo `git status` echo "---------- end git status ----------" git add . git commit -m "update by github actions" echo "---------- begin git push ----------" git push origin main echo "---------- end git push ----------" - name: delete ssh key # 删除 ssh key run: rm -rf ~/.ssh/id_rsa ================================================ FILE: .gitignore ================================================ /coverage /src/client/shared.ts /src/node/shared.ts *.log *.tgz .DS_Store .idea .temp .vite_opt_cache dist cache temp examples-temp node_modules pnpm-global TODOs.md *.timestamp-*.mjs .vscode # debug npm-debug.log* yarn-debug.log* yarn-error.log* # local env files .env*.local .env .env.test ISSUE.md .npmrc .cursor ================================================ FILE: .husky/pre-commit ================================================ npm run format:fix git add . ================================================ FILE: .prettierrc.js ================================================ module.exports = { printWidth: 120, // max 120 chars in line, code is easy to read useTabs: false, // use spaces instead of tabs tabWidth: 2, // "visual width" of of the "tab" trailingComma: 'es5', // add trailing commas in objects, arrays, etc. semi: false, // add ; when needed singleQuote: true, // '' for stings instead of "" bracketSpacing: true, // import { some } ... instead of import {some} ... arrowParens: 'always', // braces even for single param in arrow functions (a) => { } jsxSingleQuote: false, // "" for react props, like in html bracketSameLine: false, // pretty JSX endOfLine: 'lf', // 'lf' for linux, 'crlf' for windows, we need to use 'lf' for git } ================================================ FILE: .vitepress/config.mts ================================================ import { defineConfig } from 'vitepress' // https://vitepress.dev/reference/site-config export default defineConfig({ lang: 'zh-CN', title: '前端面试派', description: '系统专业的前端面试导航,大厂面试规范,开源免费', head: [ ['link', { rel: 'icon', href: '/favicon.ico' }], ['meta', { name: 'author', content: '双越老师' }], [ 'meta', { name: 'keywords', content: '前端, 面试, 前端面试, 面试题, 刷题, 面试流程, 前端面试流程, 面试准备, 简历, 前端简历, 开源, 免费, Javascript, Typescript, React, Vue, webpack, vite, HTTP, 算法', }, ], // baidu 统计 [ 'script', {}, ` var _hmt = _hmt || []; (function() { if (location.hostname.indexOf('mianshipai.com')<0) return; var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b53b3c926f6f6f5be6a9ac7e0911622b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); `, ], // 二维码 [ 'script', {}, ` setTimeout(function() { // const container = document.getElementById('qrcode-container'); // container.innerHTML = '如加群失败,加作者vx fe-wfp,备注 面试派'; }, 2000); `, ], // top banner ad [ 'script', {}, ` setTimeout(function() { const header = document.querySelector('header'); if (header == null) return; header.style.top = '25px'; const ad = document.createElement('div'); ad.style.backgroundColor = 'oklch(97.3% .071 103.193)'; ad.style.color = '#333'; ad.style.height = '25px'; ad.style.position = 'fixed'; ad.style.top = '0'; ad.style.left = '0'; ad.style.width = '100%'; ad.style.zIndex = '9999'; ad.style.lineHeight = '25px'; ad.style.fontSize = '13px'; const adContent = document.createElement('div'); // adContent.innerHTML = '前端学 Node 全栈和 AI 开发,可加入【划水AI】项目研发小组。双越老师开发,复杂项目,真实上线,持续维护升级。在此进入有优惠 >>'; adContent.innerHTML = '跟着 双越老师 开发一个 AI Agent 智能体项目,复杂业务 真实上线,适合前端人员学习和开发。点击查看优惠价格 >>'; adContent.style.width = '80%'; adContent.style.textAlign = 'center'; adContent.style.margin = '0 auto'; adContent.style.cursor = 'pointer'; adContent.addEventListener('click', function() { // window.open('https://www.huashuiai.com/join?from=前端面试派', '_blank'); window.open('https://www.huashuiai.com/pub/ai-agent-camp', '_blank'); }); const adClose = document.createElement('div'); adClose.innerHTML = 'x'; adClose.style.width = '16px'; adClose.style.textAlign = 'center'; adClose.style.position = 'absolute'; adClose.style.right = '8px'; adClose.style.top = '0'; adClose.style.cursor = 'pointer'; adClose.addEventListener('click', function(event) { event.stopPropagation(); ad.parentNode.removeChild(ad); header.style.top = '0'; }); ad.appendChild(adContent); ad.appendChild(adClose); header.parentNode.insertBefore(ad, header); }, 1000); `, ], ], themeConfig: { // https://vitepress.dev/reference/default-theme-config nav: [ // { text: '首页', link: '/' }, // { text: '正确写简历', link: '/docs/before-interview/write-resume.md' }, { text: '1v1 面试咨询 🔥', link: '/docs/services/1v1.md' }, { text: '加群讨论答疑', link: '/docs/services/group.md' }, { text: '成为贡献者', link: 'https://github.com/mianshipai/mianshipai-web#%E8%B4%A1%E7%8C%AE%E9%A2%98%E7%9B%AE%E5%92%8C%E7%AD%94%E6%A1%88', }, ], search: { provider: 'local', }, outline: { level: [2, 3], label: '目录', }, sidebar: [ { text: '面试准备', items: [ { text: '了解面试流程', link: '/docs/before-interview/process.md', }, { text: '分析 JD 招聘要求', link: '/docs/before-interview/jd.md' }, { text: '正确写简历', link: '/docs/before-interview/write-resume.md', }, { text: '如何投递简历', link: '/docs/before-interview/post-resume.md', }, ], }, { text: '笔试', items: [ { text: '数据结构和算法', link: '/docs/written-exam/algorithm' }, { text: 'JS 手写代码', link: '/docs/written-exam/JS-writing' }, { text: 'JS 读代码', link: '/docs/written-exam/JS-reading' }, ], }, { text: '一面', items: [ { text: '计算机基础', link: '/docs/first-exam/ComputerBase.md' }, { text: 'HTML 和 CSS', link: '/docs/first-exam/HTML-CSS.md' }, { text: 'JS 基础知识', link: '/docs/first-exam/JS' }, { text: 'TS 类型', link: '/docs/first-exam/TS' }, { text: 'HTTP 网络请求', link: '/docs/first-exam/HTTP.md' }, ], }, { text: '二面', items: [ { text: 'Vue 使用', link: '/docs/second-exam/vue-usage.md' }, { text: 'Vue 原理', link: '/docs/second-exam/vue-inner.md' }, { text: 'React 使用', link: '/docs/second-exam/react-usage.md' }, { text: 'React 原理', link: '/docs/second-exam/react-inner.md' }, { text: '小程序', link: '/docs/second-exam/mini-program.md' }, { text: '前端工程化', link: '/docs/second-exam/engineering.md' }, { text: '鸿蒙应用开发', link: '/docs/second-exam/HarmonyOS-application-development.md' }, { text: 'Nodejs', link: '/docs/second-exam/nodejs.md' }, ], }, { text: '三面', items: [ { text: '场景题', link: '/docs/third-exam/scene.md' }, { text: '交叉面试', link: '/docs/third-exam/cross-test.md' }, { text: '项目难点/成绩', link: '/docs/third-exam/project.md' }, // { text: '系统设计', link: '/docs/third-exam/system-design.md' }, { text: '前端 Leader 面试', link: '/docs/third-exam/leader-test.md' }, { text: '反问面试官', link: '/docs/third-exam/ask-in-reply.md' }, ], }, { text: 'HR 面', items: [ { text: '行为面试', link: '/docs/hr-exam/behavioural-test.md' }, { text: '谈薪技巧', link: '/docs/hr-exam/salary.md' }, ], }, { text: '服务', items: [ { text: '加群讨论答疑', link: '/docs/services/group.md' }, { text: '成为贡献者', link: 'https://github.com/mianshipai/mianshipai-web#%E8%B4%A1%E7%8C%AE%E9%A2%98%E7%9B%AE%E5%92%8C%E7%AD%94%E6%A1%88', }, { text: '内推工作', link: '/docs/services/job.md' }, { text: '1v1 面试咨询 🔥', link: '/docs/services/1v1.md' }, ], }, // { // text: 'Examples', // items: [ // { text: 'Markdown Examples', link: '/docs/markdown-examples' }, // { text: 'Runtime API Examples', link: '/docs/api-examples' }, // ], // }, ], socialLinks: [{ icon: 'github', link: 'https://github.com/mianshipai/mianshipai-web' }], footer: { message: 'wangEditor | 划水AI | 提交问题和建议', copyright: 'Copyright © 2025-present Mianshipai 面试派', }, }, ignoreDeadLinks: ['./vue-inner/index'], }) ================================================ FILE: README.md ================================================ # 面试派 系统专业的前端面试导航,网址 https://www.mianshipai.com/ - [双越老师](https://juejin.cn/user/1714893868765373) 主导开发 - 大厂面试规范 - 多人共建,开源免费 ## 贡献题目和答案 欢迎提交 PR 来贡献题目和答案,同时你可以贴上自己的博客链接,我们相互导流,共同受益。 具体步骤如下。 ### fork 这个项目 在 GitHub fork 这个项目到你的空间,然后 git clone 下载这个项目到本地,本地运行项目 ``` npm i npm run docs:dev ``` ### 修改代码 可以新增题目,也可以修改现有题目的答案(如你有更好的答案) 每个题目的格式如下 ```md ## 前端常见的设计模式有哪些?以及应用场景 参考答案 ::: details (简明扼要的写出答案的核心内容,给出必要的解释、代码示例、截图) (注意,这里不要写的太过于详细,篇幅适中,适合在面试中 2-3 分钟解答完毕) (更详细的内容可写到你的博客里,贴到下面) (最后,可以参考 AI 给出的答案,但不要无脑照抄 AI ,要对自己产出的内容负责) ::: 参考资料 (如没有,就不写) ::: details - 你的博客链接 ::: ``` PS. 如有图片,统一放在 `docs/imgs` 目录下。 ### 关于你的博客 你的博客内容里一定要有到[面试派](https://www.mianshipai.com/)的导流文案,否则不予通过,我们是相互引流。 博客内容一定要和该题目相关,要保证质量和内容,不能为了引流和引流。 ### 提交 PR 把修改的代码 git commit 和 push 到你自己的 GitHub 项目 然后提交 PR 到 [mianshipai-web](https://github.com/mianshipai/mianshipai-web) 的 `main` 分支,并添加 reviewer 审核人 `wangfupeng1988` 管理员会每日查看 PR 并审核 ## 发布上线 管理员会统一提交 PR ,把 `main` 合并到 `prod-deploy` 分支,合并后即可触发 [actions](https://github.com/mianshipai/mianshipai-web/actions) 并发布上线。 ================================================ FILE: docs/api-examples.md ================================================ --- outline: deep --- # Runtime API Examples This page demonstrates usage of some of the runtime APIs provided by VitePress. The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: ```md ## Results ### Theme Data
{{ theme }}
### Page Data
{{ page }}
### Page Frontmatter
{{ frontmatter }}
``` ## Results ### Theme Data
{{ theme }}
### Page Data
{{ page }}
### Page Frontmatter
{{ frontmatter }}
## More Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). ================================================ FILE: docs/before-interview/jd.md ================================================ # 分析 JD 招聘要求 JD, Job Description 职位描述,分析 JD 可以看到公司对候选人的要求和期望。 ::: tip 如有疑问,可免费 [加群](/docs/services/group.md) 讨论咨询,也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## 通过 JD 能看到什么 - 工作内容,负责什么产品和业务 - 薪资范围(参考**最小值**即可,如 15k-20k 那就是 15k)和福利待遇 - 技术栈,但不一定写的很清楚 - 经验要求,例如要求多少年工作经验 根据这些内容,review 一下自己的经验和能力,看是否要投递这个职位。 ## 案例分析 ![](../imgs/jd.png) 从这个 JD 可以看出如下关键信息 - 工资 10k 多一点,不算高 - 上市公司,公司规模很大,有利于自我成长 - 和微信有交互,面试之前需要多看看微信开发文档 —— 重要! - 有产品经理和 UI 设计师,说明团队、项目都比较正规 - 有商业保险 ## 不要过于在意 JD - JD 是 HR 发布的,很多内容都是从网上抄来的 - HR 不懂技术,写的可能会比较含糊 - 要求会过于理想化,所以“面试造火箭,工作拧螺丝” 所以,不要过于在意 JD ,如果你觉得这个机会比较适合自己,就大胆投递简历,博取一个机会。 ================================================ FILE: docs/before-interview/post-resume.md ================================================ # 投递简历 ::: tip 如有疑问,可免费 [加群](/docs/services/group.md) 讨论咨询,也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## 投递方式 - 各大招聘网站或 App ,如拉勾、BOSS 直聘、脉脉等 - 各大公司的招聘网站,如搜索 `字节 招聘` 即可找到 https://jobs.bytedance.com/ - 猎头推荐 - 结识公司内部员工(同学,前同事,朋友等关系),内推 - HR 主动联系你 ## 各大公司招聘网站 - 字节 https://jobs.bytedance.com/ - 滴滴 https://talent.didiglobal.com/ - 百度 https://talent.baidu.com/ - 美团 https://hr.meituan.com/ - 快手 https://zhaopin.kuaishou.cn/ - 腾讯 - 校园招聘 https://join.qq.com/ - 社会招聘 https://careers.tencent.com/ - 华为 https://career.huawei.com/ - 阿里 https://talent.alibaba.com/ - 蚂蚁 https://talent.antgroup.com/home - 小红书 https://job.xiaohongshu.com/ - 科大讯飞 https://campus.iflytek.com/ - 小米 https://hr.xiaomi.com/ - Oppo https://careers.oppo.com/ - 京东 https://zhaopin.jd.com/ - 网易 - 校园招聘 https://campus.163.com/ - 社会招聘 https://hr.163.com/ - 拼多多 https://careers.pddglobalhr.net/ - 携程 https://job.ctrip.com/ - 贝壳 https://campus.ke.com/ - 联想 https://talent.lenovo.com.cn/ 如有其他公司招聘网址,欢迎给我们[提交](https://github.com/mianshipai/mianshipai-web/issues/new/choose),我们会及时收录。 ## 更多 面试派 正在规划一个前端交流社群,会把猎头、内推等机会都汇总到这里,WIP... ================================================ FILE: docs/before-interview/process.md ================================================ # 了解面试流程 没有工作经验、面试经验的同学,需要先整体了解一下程序员面试的常规流程。 ::: tip 实际面试时,流程可能会有变动,灵活处理,可免费 [加群](/docs/services/group.md) 讨论咨询。 也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## 寻找工作机会 - 各大招聘网站或 App ,如拉勾、BOSS 直聘、脉脉等 - 各大公司的招聘网站,如搜索 `字节 招聘` 即可找到 https://jobs.bytedance.com/ - 猎头推荐 - 结识公司内部员工(同学,前同事,朋友等关系),内推 - HR 主动联系你 ::: tip 如何让猎头、HR 找到你呢?—— 主动暴露自己 - 发表高质量博客 - 做社区有用的开源项目 - 注册脉脉、LinkedIn 等,增加社交关系(如有名校、大厂等 title) ::: ## 投递简历 找到工作机会,主动投递简历给 HR 或者内推者。 - 简历要写好,做好简历优化,珍惜投递机会 - 简历使用 PDF 格式,不要用 word 文档!!! - 要以邮件形式投递,且是工作邮箱。如百度的 HR 工作邮箱一般是 `xxx@baidu.com` ## 收到面试邀请 如果你的简历被筛选通过,会收到 HR 的面试邀请。恭喜你,面试流程正式开始。 准备好:纸、笔、打印简历、电脑。如果是现场面试,都带过去。 ## HR 初步沟通 一般 HR 会先和你做初步沟通,远程电话或视频形式,大约 20-30 分钟,以确定你这个人是可以正常沟通的,没有极端的情绪和沟通障碍。 你可以提前看看 [HR 行为面试](../hr-exam/behavioural-test.md) 的问题,在这一步有可能会问到其中的几个问题。 ## 一面 技术面试,以考察基础知识为主。面试官一般是基层开发人员,你未来的同事。 某些公司在一面开始之前,可能会让你做笔试题,考察算法、写代码、读代码等基础问题。 ::: tip 如果让你写代码,你可以申请用自己电脑写,一般都会同意。 ::: ## 二面 技术面试,以考察框架和项目为主。面试官一般是团队的高级/资深工程师/项目负责人,你未来的导师。 二面结束后,很多公司会安排交叉面试,也是技术面试。交叉,即请其他团队的高级/资深工程师,再考察一遍。 ## 三面 团队 Leader 面试,不再关注技术细节,多考察项目组织和设计能力,挖掘技术潜力。 如果你是应届生或工作经验较少,没太多项目设计能力,三面可能会很快结束,但不代表你会被拒绝。 ## HR 面 所有技术面试都通过了以后,HR 会进行行为面试,然后谈薪资。但这一步不会立刻发 offer ,会有内部评审。 ## 发 offer 如果 HR 面试没问题,且薪资谈妥,最后会正式发 offer 邮件,通知你哪天入职。 PS. 入职前要和 HR 确认好,会签国家法定的劳动合同,会按照国家规定缴纳社保和公积金,最好能有商业医疗保险。这些在中大厂都是标配,但不是所有公司都有,自己确认好。 ================================================ FILE: docs/before-interview/write-resume.md ================================================ # 如何正确写简历 简历只有一个目的:引起 HR 或面试官的注意,让他们给你打电话。所以,如何让自己“亮”起来很重要。 ::: tip 如有疑问,可免费 [加群](/docs/services/group.md) 讨论咨询,也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## 简历格式 简历的模块和顺序 - 个人信息 - 核心能力总结(可选) - 教育经历 - 专业技能 - 工作经历 - 项目经验 简历模版:TODO... ## 个人信息 - 必备信息:姓名,电话,邮箱,个人网址或博客(如有),城市 - 可选:头像照片,性别,年龄,工作年限 - 不用写:婚姻状况,政治面貌,籍贯等和工作无关的信息 - 不要写期望薪资,等和 HR 谈薪再说 ## 核心能力总结(可选) 工作经验久的“老司机”,可以总结一下自己的核心能力,例如 - 项目架构能力,负责过 xxx 大型项目 - 团队领导能力,带领过 xxx 人研发团队 - xxx 业务的解决方案能力 注意,既然是总结,就不要贪多,写 3-4 条核心的即可,其他的在下文内容写。 ## 教育经历 - 大学 + 研究生(如有) - 写明:学校 学历 专业 入学/毕业时间 - 在学校的参赛获奖记录,写在这里 - 计算机相关的培训和证书(如 PMP 软考等),写在这里 - 如果学校或学历没有竞争力,如大专、非计算机相关专业,可以把教育经历写到最后 - 如果是专升本,建议只写本科学历 总之,是优势就尽早暴露,不是优势则尽量避免暴露。 ## 专业技能 用 5 - 10 点来表达自己的专业技能,例如 ::: info - 熟悉常见的数据结构和算法,熟悉常见的设计模式 - 熟悉前端基础 HTML CSS ES6+ JS TS 语法,熟悉 HTTP 协议 - 熟悉 Vue2 Vue3 全家桶,熟悉 ElementPlus VantUI ,熟悉 Vue 原理和源码 - 熟悉 React 和 Hooks 语法,熟悉 AntD ,熟悉 React 原理 - 熟悉 Next.js 服务端框架,熟悉 RSC ,用过 Mongodb MySQL Redis - 熟悉微信小程序开发,熟悉 uni-app 和 taro 框架 - 熟悉 Webpack 和 Vite 配置,熟悉常见插件,熟悉性能优化相关配置 - 熟悉前端单元测试框架 Vitest 和 Jest ,熟悉 E2E 测试 - 熟悉前端 CI/CD 配置,熟悉 Gitlab CI 和 GitHub actions 常见配置 - 熟悉 Nodejs 服务端开发,熟悉 Express Koa Nestjs 框架 ::: 我评审了 N 多简历,在专业技能这部分发现过很多问题: ::: info - 很多同学完全不懂数据结构和算法 1. 删掉这一条不要暴露这个弱点 2. 业余需要恶补,除非一直呆在小公司 - 多年的 Vue 工程师,没有其他技术栈 - 很多工作多年的同学,不了解服务端,纯前端,无复杂项目 - 不要写“了解”,了解的意思就是不懂。要么写“熟悉”,要么别写 - 对 Vue React 的原理,仅知道几个概念,没有自己认真总结过 其实每次写简历,也是对个人能力的自我评价,要看到自己的不足,未来继续进步。 ::: ## 工作经历 - 写明公司,角色,入职离职时间,工作职责/成绩 - 如工作多年,角色要能看出成长。例如刚毕业是`前端工程师`,后来是`高级前端工程师` - 工作职责/成绩,不要写“正确的废话”,要写出自己**真实具体的事情**,例如 - 负责 xxx 项目,从 0 开发 a b c 功能 - 带领 xxx 团队,完成 x y z 能力建设 ## 项目经验 - 根据个人的工作年限,写 2-5 个项目 - 项目要涵盖专业技能里的技术栈 - 把最重要的项目放在前面,不要非得按时间排序 每个项目的格式如下: ::: info 项目描述:这是一个 xxx 项目,服务于 xxx 。它主要包含 a b c 功能。我主要负责 x y z 模块。 技术栈:TS + Nextjs + React + ShadcnUI + Auth.js + Prisma + PostgreSQL + Tiptap 项目职责: - 作为项目前端负责人,负责需求评审、技术选型、系统设计、代码走查、项目管理等工作 - 基于 Tiptap 二次开发富文本编辑器,如悬浮菜单、slash command、表格、上传图片到 OSS - 集成 ChatGPT AI 功能到富文本编辑器,实现 AI 写作、AI 优化文本等功能,并保障 AI 接口稳定 - 基于 Tiptap 开源的 Hocuspocus Server 二次开发协同编辑功能,实现 Tiptap 多人协同编辑 - 使用 GitHub Actions 配置 CI/CD 流程,使用 Docker 部署测试环境,使用阿里云 Serverless 上线 - 继续补充... ::: ## 其他常见问题 ### 简历是否只写一页? 完全没必要,根据自己的真实情况写即可,我更推荐写 2-3 页。 ### 是否要写个人评价? 大部分情况下没必要,我评审这么多简历,个人评价全都是虚的,什么热爱技术、热爱学习... 你如何证明自己热爱技术、热爱学习?—— 大部分人都会被问住。 如果你真的有证明的(博客 开源 看书等),你可以写到前面,这是个人优势。 ================================================ FILE: docs/first-exam/ComputerBase.md ================================================ # 计算机基础 计算机基础在校招中考核较为常见,尤其是大厂,不可忽视。 ::: tip 如有疑问,可免费 [加群](/docs/services/group.md) 讨论咨询,也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## 进程和线程的区别 参考答案 ::: details **进程**是操作系统中一个正在运行的程序,每个进程都有自己的地址空间、内存、文件描述符等资源。 **线程**是进程中的一个执行单元,是 cpu 调度的最小单元,共享进程的资源,但有自己的独立执行流。 二者的区别 - 进程拥有独立的堆栈空间和数据段,需要分配独立的地址空间,开销大 - 线程开销小,切换快,没进程安全,从通信机制上看,线程可以共享数据段 举例 - 浏览器中一个 tab 就是一个进程,进程中某个线程崩了,整个进程就会崩,但是这不会影响其他的进程,因此进程之间相对独立 - Nginx 或 Nodejs PM2 开启的多个 instance 是进程,每个 instance 之间不能共享内存数据 - JS 中 WebWorker 是一个线程,它可以和和主线程共享内存数据,独立运行不阻塞 UI ::: ## 进程间的通信 参考答案 ::: details 进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同进程之间交换信息和数据的过程,常见的进程通信方式包括: - 管道:用于单向或双向通信 - 消息队列:允许进程通过信息传递进行通信 - 共享内存:多个进程可以访问同一块内存区域 - 信号量:用于进程间的同步 - 套接字:用于网络通信 线程间通信与进程间通信类似,但由于线程之间共享进程的资源,线程间通信通常比进程间通信更高效 ::: ## 单核 CPU 如何实现并发 参考答案 ::: details 单核CPU 主要是通过时间片轮转和上下文切换来实现并发 时间片轮转 - CPU将时间划分为很小的时间片,通常是几十毫秒 - 每个进程、线程分配到一个时间片 - CPU轮流执行每个进程、线程的时间片 - 当一个时间片用完,CPU就会切换到下一个进程、线程 上下文切换 - 在切换进程、线程时,CPU需要保存当前进程的状态(上下文),包括 - 程序计数器的值 - 寄存器的值 - 内存映射信息 - 加载下一个要执行的进程、线程的上下文 > 在任意时刻,CPU只能执行一个任务,由于切换速度非常快,给用户的感觉就像是在同时运行多个程序,所以这种机制被称为“伪并发”,若线程过多也不好,频繁的上下文切换会带来一定的性能开销,所以过多的线程反而会带来性能下降的问题 ::: ## CPU 调度算法有哪些? 参考答案 ::: details - 先来先服务(First Come First Serve) - 最简单的调度算法 - 进程按到达的顺序排队,先到达的先执行 - 缺点:可能导致长时间的等待,特别是当一个长进程在队列前面时 - 短作业优先(Shortest Job First) - 优先执行预计运行时间最短的进程 - 可以是非抢占式或是抢占式(shortest Remaining Time First,SRTF) - 可能导致“饥饿”现象,即长作业可能永远得不到执行 - 优先级调度(Priority Scheduling) - 每个进程分配一个优先级,优先级高的进程先执行 - 也可能导致“饥饿”现象,通常使用老化(aging)技术来解决 - 轮转调度(Round Robin) - 每个进程分配一个固定的时间片,时间片用完后,进程被放到队列的末尾 - 适用于时间共享系统 - 时间片的大小对系统性能有很大影响 - 多级队列调度(Multilevel Queue Scheduling) - 将进程分成多个队列,每个队列有不同的优先级 - 不同队列可以使用不同的调度算法 - 多级反馈队列调度(Multilevel Feedback Queue) - 允许进程在不同的队列之间移动 - 根据进程的行为动态调整其优先级 ::: ## linux 如何查找你的进程占用的那个端口 参考答案 ::: details 使用 netstat 命令 ```bash # 查看所有端口占用情况 netstat -tunlp # 查看特定端口,比如 8080 netstat -tunlp | grep 8080 ``` - t - tcp 协议;u - udp 协议;n - 显示端口号;l - 仅显示监听端口;p - 显示进程信息 使用 lsof 命令 ```bash # 查看特定端口,比如 8080 lsof -i :8080 ``` - i - 显示网络连接 ::: ## 单核服务器连接数超载了怎么办 参考答案 ::: details - 优化代码和查询 确保应用程序代码和数据库查询是高效的,以减少每个连接的资源消耗 - 使用负载均衡 将流量分配到多个服务器上,以分散负载 - 增加连接池 使用连接池来管理数据库连接,减少连接的创建和销毁开销 - 限制连接数 配置服务器以限制每个客户端的最大连接数,以防止单个客户端占用过多资源 - 使用缓存 利用缓存机制(如 Redis,Memcached)来减少对数据库的访问次数 ::: ## 请简述一个编译器的执行过程。前端有哪些常见的编译工具? 参考答案 ::: details 编译器的执行过程 1. 词法分析 - 将源代码转换为一系列的标记(tokens),这些标记是编程语言的基本语法单位 2. 语法分析 - 根据语言的语法规则,将标记序列转换为语法书(parse tree),也称为抽象语法树(AST) 3. 语义分析 - 检查语法树是否符合语言的语义规则,例如类型检查,作用域检查等 4. 中间代码生成 - 将语法树转换为中间代码,这种代码通常独立于机器 5. 代码优化 - 对中间代码进行优化,以提高程序的执行效率 6. 目标代码生成 - 将中间代码转换为目标机器代码 7. 代码生成后优化 - 对生成的目标代码进行进一步优化 > 编译器的目的是将我们编写的源码转换为机器码(目标代码),以便计算机能够读懂执行 前端常见的编译工具 - Babel - 用于将现代 JavaScript 代码转换为向后兼容的版本 - TypeScript Compiler - 将 TypeScript 代码转换为 JavaScript - Sass/SCSS - 将 Sass/SCSS 代码转换为 CSS - Webpack - 用于打包 JavaScript 模块,并支持多种编译和转换插件 ::: ## 什么是编译型语言和解释型语言,他们有什么区别? 参考答案 ::: details 高级编程语言分为解释型语言和编译型语言 编译型语言 - 常见编译型语言:C,C++,Java,Go,Rust - 执行方式:编译型语言的代码在运行期间由编译器一次性翻译成机器码,生成的机器码可以在目标机器上运行 - 优点:代码在运行前就已经被翻译成机器码,运行速度通常更快 - 缺点:需要编译步骤,开发和调试过程可能较慢 解释型语言 - 常见解释性语言:JavaScript,Python,Ruby,PHP - 执行方式:解释型语言的代码在运行期间由解释器逐行翻译成机器码并执行。这意味着每次运行程序时,代码都需要被重新解释 - 优点:由于不需要编译成机器码,开发和调试过程通常更快,更灵活 - 缺点:运行速度通常比编译型语言慢,因为每次执行都需要进行翻译 编译型语言和解释型语言的区别 - 执行速度:编译型语言通常比解释型语言快,因为他们直接运行机器码 - 开发灵活性:解释型语言通常更灵活,适合快速开发和迭代 - 错误检测:编译型语言在编译阶就可以捕获更多的语法和类型错误,而解释型语言通常在运行时才发现错误 > 举个🌰:读一门外文著作,编译型语言就是给你将这本著作翻译成中文,然后你就可以直接看中文了。解释型语言就是给你一个翻译,一边看一边翻译,下次看仍需要翻译 JIT(Just-In-Time)编译 为了结合编译型和解释型语言的优点,JIT 随之诞生,可以理解为“即时编译” - 执行方式:JIT 编译在程序运行时将部分代码编译成机器码,而不是逐行解释,这种编译方式在代码即将被执行时进行,因此得名“即时编译” - 应用场景:现代 JavaScript 引擎(如 V8 引擎)通常使用 JIT 编译来提高性能,包括 Java 虚拟机(JVM)也会使用 JIT 编译来提高性能 ::: ## 简述 JS 垃圾回收的过程。用什么算法? 参考答案 ::: details 垃圾回收(Garbage Collection, GC)是自动管理内存的过程。JavaScript 引擎会自动检测不再使用的对象,并释放它们所占用的内存。常用的垃圾回收算法是标记-清除(Mark-and-Sweep)算法。 垃圾回收过程 1. 标记阶段 - 垃圾回收器会从根对象(如全局对象、局部变量)开始,遍历所有对象,标记所有可达的对象 - 可达对象:从根对象可以通过引用链访问到的对象 2. 清除阶段 - 标记阶段结束后,所有未被标记的对象被视为不可达对象 - 垃圾回收器会清除这些不可达对象,释放它们所占用的内存 常用算法 - 标记-清除 - 最常用的垃圾回收算法 - 引用计数 - 每个对象有一个引用计数器,当对象被引用时,计数器加1,当对象不再被引用时,计数器减1,当引用计数为 0 时,表示该对象不再被使用,可以被回收。无法解决循环引用的问题,如今已很少使用 - 分代回收 - 现代 JavaScript 引擎通常使用分代回收策略,将内存分为新生代和老生代。新生代存储生命周期短的对象,老生代存储生命周期长的对象。不同代的对象使用不同的回收策略,以提高效率。 ::: 参考资料 ::: details - https://juejin.cn/post/7432127587918282792 ::: ## 什么是内存泄漏?如何排查?JS 内存泄漏的常见原因? 参考答案 ::: details 内存泄露是指在程序运行过程中,程序未能释放不再使用的内存空间,导致内存资源被浪费。 排查内存泄露 1. 使用内存分析工具 - 浏览器开发者工具:Chrome 的 DevTools 提供了内存分析工具 Memory,可以监控内存使用情况 - 也可以结合 setInterval 使用 console.memory 查看内存使用的快照 2. 代码审查 - 检查代码中是否有未释放的事件监听器,定时器,全局变量,确保不再需要某对象时,及时解除引用 3. 性能监控 - 监控应用程序的内存使用情况,观察是否有持续增长的趋势 - 使用日志记录内存使用情况,帮助识别内存泄露的模式 JS 内存泄露的常见原因 1. 意外的全局变量 - 忘记使用 var,let,const 声明变量时,变量会被挂载到全局对象上 2. 闭包 - 闭包中引用了不再需要的外部变量,导致这些变量无法被垃圾回收 3. 未清理的 DOM 引用 - 删除 DOM 元素时,未能清理相关的事件监听器或引用 4. 定时器和回调 - 未能清理不再需要的 setInterval 或 setTimeout 回调 ::: ## 简述 JS 运行时的堆栈内存模型? 参考答案 ::: details 在 JS 运行时,内存管理主要依赖于堆(Heap)和栈(Stack)两种数据结构 栈(Stack) - 特点:栈是一种后进先出(LIFO)的数据结构,用于存储函数调用和原始数据类型 - 用途:当函数被调用时,相关的执行上下文(包括局部变量,函数参数)会被压入栈中,当函数执行完毕后,栈顶的执行上下文会被弹出栈 - 限制:栈内存的空间大小通常十分有限,适合存储生命周期短,大小固定的数据(比如无限递归不断创建栈帧,会导致爆栈) 堆(Heap) - 特点:堆是一种动态内存分配的,无序的数据结构,用于存储对象和复杂数据类型 - 用途:堆用于存储动态分配的内存,比如对象,数组,函数等 - 限制:堆内存的分配和释放速度较慢,容易导致内存碎片化 这里用一段 js 代码画图举例 ```js let a = 1 let obj = { name: 'Heap', } function foo() { let b = 2 console.log(b) function bar() { let c = 3 console.trace() console.log(c) } bar() } foo() ``` ![](../imgs/call-stack.png) 栈 - 调用栈用于跟踪程序执行的活动函数。每当一个函数被调用时,它的执行上下文会被推入调用栈。当函数执行完毕后,它的执行上下文会从调用栈中弹出。 - 在这个例子中,最初的调用栈会包含一个匿名的全局执行上下文(anonymous),然后是 foo 函数的执行上下文,最后是 bar 函数的执行上下文。 - 当 bar 函数执行完毕后,它的执行上下文会被弹出调用栈,然后 foo 函数的执行上下文也会被弹出调用栈,最后全局执行上下文也会被弹出调用栈。 堆 - 全局存储的 obj 对象,在栈中仅仅是一个引用地址,真正的对象存储在堆中。 ::: ## 冯·诺依曼架构是什么? 参考答案 ::: details 冯·诺依曼架构确定了现代计算机结构中的五大部件: 1. 输入设备: 键盘,鼠标,摄像头等 2. 输出设备: 显示器,打印机,扬声器等 3. 存储器: 计算机的记忆装置,主要存放数据和程序。分为内部存储器(内存/主存储器)和外部存储器(硬盘,光盘,U盘等) - 内存:也称之为主存储器,又分为随机存储器(RAM)和只读存储器(ROM) - RAM 存放的是计算机在通电运行的过程中即时的数据,计算机的内存容量就是指的 RAM 的容量。RAM 可读,可写,断电会数据丢失 - ROM 存放的是每次计算机开机都需要处理的,固定不变的程序和数据,比如 BIOS 程序。ROM 可读,不可写,断电不会丢失 - 外存:外存是硬盘,是计算机的辅助存储器,可以长期保存数据,断电不会丢失。当计算机需要从外存读取数据时,需要将数据从外存读取到内存中,然后才能下一步处理。根据介质不同,外存可分为软盘,硬盘,光盘。硬盘最为常见,硬盘又分为机械硬盘(HD)和固态硬盘(SSD)。 4. 运算器: 算术逻辑单元(ALU),负责执行算术和逻辑运算 5. 控制器: 控制整个计算机系统的工作流程,包括指令的执行顺序,数据传输等,运算器和控制器通常集成在一起,就是我们熟知的 CPU ![](../imgs/von-neumann.png) > 图中的箭头流向是数据流向。数据从输入设备进入到计算机,存放在存储器中,控制器负责控制运算器对存储器中的数据进行运算,运算的结果再次放入存储器中,通过控制器将存储器中的计算结果输出到输出设备。 ::: ## 计算机内部为何使用二进制? 参考答案 ::: details - 硬件实现简单:二进制只需要两个状态,通常用电压的高低来表示(如高电压表示 1,低电压表示 0)。这种简单的状态切换使得硬件电路设计更为简单和可靠 - 抗干扰能力强:在电路中,二进制的两个状态(0 和 1)可以通过明显的电压差来区分,这使得系统对噪声和干扰的容忍度更高,数据传输更稳定 - 逻辑运算方便:计算机的基本运算是逻辑运算,二进制系统与布尔代数非常契合,能够进行与,或,非等逻辑运算,简化了计算机的设计和操作 - 存储和处理效率高:二进制数据在计算机中可以直接存储和处理,避免了其他进制系统转换带来的复杂性和效率损失 - 历史和标准化:从计算机发展的早期,二进制就被广泛采用,形成了标准化的设计和技术积累,进一步推动了其普及和应用 ::: ## 二进制如何表示负数和小数? 参考答案 ::: details 表示负数 下面用 8 位二进制数 -2 举例 1. 求补码 ```js - 2 的原码:0000 0010 // 原码就是最简单的表示方法 - 2 的反码:1111 1101 // 反码是原码的反向 - 2 的补码:1111 1110 // 补码是反码加 1 ``` 1111 1110 就是 -2 的二进制 2. 模减 ```js - 模:2 ^ 8 = 256 - 256 - 2 = 254 ``` 254 的二进制就是 -2 的二进制 1111 1110 表示小数 下面用 10.625 转换为二进制举例 1. 整数部分 - 将整数部分除以2,记录余数,直到商为0。余数的逆序即为二进制表示。 ```js - 10 / 2 = 5 余 0 - 5 / 2 = 2 余 1 - 2 / 2 = 1 余 0 - 1 / 2 = 0 余 1 ``` 逆序排列:1010 2. 小数部分 - 将小数部分乘以2,记录整数部分,直到小数部分为0或达到所需的精度。整数部分的顺序即为二进制表示。 ```js - 0.625 * 2 = 1.25 取整 1 - 0.25 * 2 = 0.5 取整 0 - 0.5 * 2 = 1 取整 1 ``` 顺序排列:0.101 10.625 的二进制就是 1010.101 ::: ## 什么是虚拟内存,为何要使用虚拟内存? 参考答案 ::: details 什么是虚拟内存? 虚拟内存相对物理内存,它是一种计算机内存管理技术,它为每个进程提供了一个连续的地址空间,使得进程可以认为自己拥有一个完整的,连续的内存空间,而实际上,这个空间可能是分散的,并且部分可以存储在外存中 为什么使用虚拟内存? 1. 扩展内存容量:虚拟内存允许计算机使用硬盘空间来扩展物理内存的容量,即使物理内存不足,程序也可以运行,因为不常用的数据可以被交换到磁盘上 2. 内存保护:每个进程都有自己的虚拟地址空间,防止一个进程访问另一个进程的内存,提供了内存保护 3. 简化内存管理:程序员不需要担心物理内存的分配和管理,操作系统负责将虚拟地址映射到物理地址 4. 多任务处理:通过虚拟内存,多个进程可以同时运行,操作系统可以在它们之间切换,提供多任务处理能力 5. 程序加载和执行的灵活性:程序可以被分成多个部分,只有需要的部分才会被加载到内存中,减少了内存的使用 ::: ## 什么是 Unicode 编码?它和常见的 UTF-8 有什么关系? 参考答案 ::: details - Unicode 俗称万国码,它为每个字符提供了一个唯一的数字标识,这个数字标识被称为码点。Unicode 的出现就是为了解决 ASCII 编码的局限性,ASCII 编码只能表示 128 个字符,全球各个国家的字符远不止 128 个,所以 Unicode 应运而生。 - Unicode 的定义了一个字符集和一系列编码方案(UTF-8,UTF-16,UTF-32),UTF-8 是 Unicode 最常用的编码方案,它是一种变长编码,根据不同的字符,使用不同的字节数来表示。对于 ASCII 字符,使用 1 个字节表示,与 ASCII 编码兼容 - GBK 编码是一种用于中文字符的编码标准,扩展了 GB2312 编码,支持简体和繁体中文字符。GBK 编码使用 2 个字节表示一个中文字符,适合中文环境,但不支持 Unicode ::: ## 简述计算机网络的 OSI 模型 参考答案 ::: details OSI(开放系统互联)模型是一个用于理解和实现网络协议的七层概念框架。每一层都有特定的功能,并与其直接上下的层进行通信。 1. 物理层(Physical Layer):这是OSI模型的最低层,负责设备之间的物理连接,包括通过物理介质传输原始比特流。它涉及硬件组件,如电缆、交换机和网络接口卡。 2. 数据链路层(Data Link Layer):负责节点到节点的数据传输以及错误检测和纠正,确保数据在物理链路上的可靠传输。它分为两个子层:媒体访问控制(MAC)层和逻辑链路控制(LLC)层。 3. 网络层(Network Layer):负责数据的路由、转发和寻址,确定数据到达目的地的最佳物理路径。像IP(互联网协议)这样的协议在这一层运行。 4. 传输层(Transport Layer):为应用程序提供端到端的通信服务,负责错误恢复、流量控制和确保完整的数据传输。像TCP(传输控制协议)和UDP(用户数据报协议)这样的协议在这一层运行。 5. 会话层(Session Layer):管理应用程序之间的会话,建立、维护和终止应用程序之间的连接,负责会话的检查点和恢复。 6. 表示层(Presentation Layer):负责数据的翻译、加密和压缩,确保数据以可用的格式呈现给应用层,充当网络和应用之间的翻译器。 7. 应用层(Application Layer):这是OSI模型的最高层,直接为终端用户应用程序提供网络服务,负责电子邮件、文件传输和网页浏览等网络服务。像HTTP、FTP和SMTP这样的协议在这一层运行。 ![OSI 模型](../imgs/OSI.png) ::: ## 一个域名对应一个 ip 吗 参考答案 ::: details 一个域名不一定只对应一个 IP 地址,具体情况如下: - 单个域名对应单个 IP 地址:这是最简单的情况,一个域名解析到一个固定的 IP 地址。 - 单个域名对应多个 IP 地址:这种情况通常用于负载均衡和高可用性。通过 DNS 轮询(Round Robin DNS),一个域名可以解析到多个 IP 地址,用户的请求会被分配到不同的服务器上。 - 多个域名对应单个 IP 地址:多个域名可以指向同一个 IP 地址,这在虚拟主机中很常见。通过服务器配置,服务器可以根据请求的域名来提供不同的内容。 - CDN(内容分发网络):CDN 服务会根据用户的地理位置将域名解析到不同的 IP 地址,以提高访问速度和可靠性。 因此,域名和 IP 地址之间的关系可以是多对多的,具体取决于网络架构和配置。 ::: ## UDP 和 TCP 协议的区别?有什么应用场景 参考答案 ::: details UDP(User Datagram Protocol,用户数据报协议) - 无连接协议:UDP 是一种无连接协议,发送数据前不需要建立连接。 - 不提供错误恢复:UDP 不提供错误恢复机制,如果数据包丢失,不会进行重传。 - 传输速度快:由于没有错误检查和连接建立的过程,UDP 传输速度更快,延迟更低。 - 应用场景:适用于对速度要求高且允许偶尔数据丢失的应用,如直播流媒体、在线游戏和语音通话(VoIP)。 TCP(Transmission Control Protocol,传输控制协议) - 面向连接协议:TCP 在发送数据前需要建立连接,确保通信的可靠性。 - 提供错误恢复:TCP 提供错误检查,确保数据按顺序且无误地传输。 - 传输速度较慢:由于需要建立连接和进行错误检查,TCP 的传输速度相对较慢。 - 应用场景:适用于对数据完整性和顺序有严格要求的应用,如网页浏览、电子邮件和文件传输。 ::: ## 数组和链表有什么区别?从内存结构上来说 参考答案 ::: details - 数组: - 连续内存分配:数组在内存中是连续分配的,这意味着数组的所有元素在内存中是紧挨着的。 - 随机访问:由于数组的连续性,可以通过索引直接访问任意元素,访问速度快,时间复杂度为 O(1)。 - 固定大小:数组的大小在创建时就确定了,不能动态调整。 - 链表: - 非连续内存分配:链表的每个元素(称为节点)在内存中可以是分散的,每个节点通过指针指向下一个节点。 - 顺序访问:访问链表中的元素需要从头节点开始,逐个遍历,访问速度较慢,时间复杂度为 O(n)。 - 动态大小:链表可以动态调整大小,方便插入和删除操作。 ::: ================================================ FILE: docs/first-exam/HTML-CSS.md ================================================ # HTML 和 CSS 随着 Vue React 等框架,和各种 CSS UI 组件库的普及,HTML 和 CSS 很容易被忽略。 如果你是实习生、应届生或刚毕业不久,HTML 和 CSS 知识一定要认真准备,大厂必考。 ::: tip 如有疑问,可免费 [加群](/docs/services/group.md) 讨论咨询,也可参与 [1v1 面试咨询服务](/docs/services/1v1.md), 专业、系统、高效、全流程 准备前端面试 ::: ## DOCTYPE 是什么,都有哪些属性? 参考答案 ::: details HTML 的 `` 声明是文档类型声明,用于告知浏览器当前 HTML 文档使用的 HTML 版本,从而确保文档以正确的模式渲染。它通常出现在 HTML 文档的第一行。 在现代开发中,推荐使用 HTML5 的简单声明 ```html ``` 在之前的 HTML 版本中,如 HTML4 ,会有其他写法,不过现在已经不常用。 ```html ``` ::: ## meta 标签是干什么的,都有什么属性和作用 参考答案 ::: details HTML 中的 `` 标签用于提供页面的**元信息**,这些信息不会直接显示在网页内容中,但对浏览器、搜索引擎和其他服务非常重要。 常见的 meta 信息如下: 1. 字符编码。指定网页的字符编码,确保正确显示内容。 ```html ``` 2. 页面视口设置(响应式设计)。控制页面在移动设备上的显示和缩放行为。 ```html ``` - `width=device-width`:页面宽度匹配设备屏幕宽度 - `initial-scale=1.0`:初始缩放比例为 1 3. 搜索引擎优化(SEO)。提供描述性信息,便于搜索引擎索引。 ```html ``` 4. 作者信息。提供网页作者信息。 ```html ``` ::: ## 什么是 DOM ,它和 HTML 有什么区别? 参考答案 ::: details DOM 即 Document Object Model 文档对象模型,它是一个 JS 对象。而 HTML 是一种标记语言(和 XML 类似)用于定义网页的内容和结构。 DOM 的特点 - 树形结构,DOM 树 - 可编程,可以使用 Javascript 读取和修改 DOM 数据 - 动态性,通过 DOM API 动态修改结构和数据 HTML 到 DOM 的过程 - HTML 解析:浏览器解析 HTML 代码,生成 DOM 树。 - CSSOM 生成:解析 CSS,生成 CSSOM(CSS 对象模型)。 - 渲染树:结合 DOM 和 CSSOM,生成渲染树。 - 页面渲染:根据渲染树将内容显示在页面上。 ::: ## 如何理解 HTML5 语义化 ?有哪些常见的语义化标签? 理解 HTML5 语义化 ::: details HTML5 语义化是指通过使用具有明确含义的标签,使网页的结构和内容更加清晰,方便浏览器、开发者以及搜索引擎理解网页内容。 语义化的核心在于让标签不仅描述外观,还能表达内容的含义,从而提升网页的可读性、可维护性和可访问性。 - 提高代码可读性:开发者无需额外注释即可理解代码结构。 - 增强 SEO(搜索引擎优化):搜索引擎能更好地抓取和理解网页内容。 - 提升可访问性:辅助技术(如屏幕阅读器)可以更准确地解释页面内容。 - 支持更好的浏览器兼容性:现代浏览器能够更高效地渲染语义化结构。 ::: 常见的 HTML5 语义化标签 ::: details - `
` 注意:要区别于 `` - `