順豐面試題

1. 你擅長處理哪類問題

推薦回答
"我比較擅長處理以下幾類前端問題:

  1. 性能優化:包括加載優化(代碼分割、懶加載)、運行時優化(減少重排重繪)等

  2. 復雜組件開發:如表單聯動、可視化圖表等交互復雜的組件

  3. 工程化問題:Webpack配置優化、自動化部署等

  4. 跨平臺兼容:解決不同瀏覽器和設備下的兼容性問題

2. 數組 for in 和 for of 區別

const arr = ['a', 'b', 'c'];
arr.customProp = 'd';// for in (遍歷鍵名)
for (let key in arr) {console.log(key); // 輸出: 0, 1, 2, 'customProp'console.log(typeof key); // 'string'
}// for of (遍歷值)
for (let value of arr) {console.log(value); // 輸出: 'a', 'b', 'c'
}

區別總結

特性for...infor...of
遍歷內容可枚舉屬性(包括原型鏈)可迭代對象的值
適用對象對象/數組數組/Map/Set等可迭代對象
順序保證不保證順序保證迭代順序
原型屬性會遍歷原型鏈上的屬性只遍歷對象自身值

3. 數組截取方法

常用方法

const arr = [1, 2, 3, 4, 5];// 1. slice (不改變原數組)
arr.slice(1, 3); // [2, 3]// 2. splice (改變原數組)
arr.splice(1, 2); // 返回[2, 3], arr變為[1, 4, 5]// 3. 擴展運算符
const [first, ...rest] = arr; // first=1, rest=[2,3,4,5]// 4. filter (條件截取)
arr.filter(x => x > 2); // [3,4,5]

對比選擇

  • 需要原數組不變 →?slice

  • 需要修改原數組 →?splice

  • 需要條件篩選 →?filter

4. 數組包含方法

檢測方法

const arr = [1, 2, 3];// 1. includes (ES7)
arr.includes(2); // true// 2. indexOf
arr.indexOf(2) !== -1; // true// 3. some (復雜條件)
arr.some(x => x > 2); // true// 4. find/findIndex (對象數組)
const objArr = [{id:1}, {id:2}];
objArr.find(o => o.id === 2); // {id:2}

性能建議

  • 簡單值判斷用?includes?最直觀

  • 對象數組用?some/find

  • 需要索引值時用?indexOf/findIndex

5. 類型檢測的方法

全面方案

// 1. typeof (基本類型)
typeof 'str'; // 'string'
typeof 123; // 'number'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Symbol(); // 'symbol'
typeof 123n; // 'bigint'
typeof function(){}; // 'function'// 局限性
typeof null; // 'object'
typeof []; // 'object'// 2. instanceof (對象類型)
[] instanceof Array; // true
new Date() instanceof Date; // true// 3. Object.prototype.toString.call (最準確)
Object.prototype.toString.call(null); // '[object Null]'
Object.prototype.toString.call([]); // '[object Array]'// 4. Array.isArray (專用于數組)
Array.isArray([]); // true// 5. 自定義類型檢查
class MyClass {}
const obj = new MyClass();
obj.constructor === MyClass; // true

最佳實踐

  • 基本類型 →?typeof

  • 數組 →?Array.isArray()

  • 通用對象類型 →?Object.prototype.toString.call()

  • 自定義類實例 →?instanceof?或?constructor?檢查

6. Vue 路由傳參的方式

三種主要方式

1. 動態路由

// 路由配置
{path: '/user/:id',component: User
}// 跳轉
router.push('/user/123')// 獲取
this.$route.params.id // '123'

2. query 傳參

// 跳轉
router.push({path: '/user',query: { id: '123' }
})// 獲取
this.$route.query.id // '123'// URL表現: /user?id=123

3. props 解耦

// 路由配置
{path: '/user/:id',component: User,props: true
}// 組件接收
export default {props: ['id']
}

高級用法

// 命名路由
router.push({ name: 'user', params: { id: '123' } })// 替換當前路由
router.replace({ path: '/user/123' })// 保持查詢參數
router.push({ query: { ...this.$route.query, id: '123' } })

7. 插槽怎么傳參

作用域插槽示例

<!-- 子組件 -->
<template><div><slot name="header" :user="user"></slot><slot :data="listData"></slot></div>
</template><script>
export default {data() {return {user: { name: 'John' },listData: [1, 2, 3]}}
}
</script><!-- 父組件使用 -->
<ChildComponent><template #header="{ user }"><h1>{{ user.name }}的頭像</h1></template><template v-slot:default="slotProps"><div v-for="item in slotProps.data" :key="item">{{ item }}</div></template>
</ChildComponent>

Vue3 組合式API寫法

<!-- 子組件 -->
<script setup>
const user = ref({ name: 'John' })
const listData = ref([1, 2, 3])
</script><template><slot name="header" :user="user"></slot><slot :data="listData"></slot>
</template>

8. 使用過哪些微前端

主流方案經驗

1. qiankun (基于single-spa)

// 主應用
import { registerMicroApps, start } from 'qiankun';registerMicroApps([{name: 'vueApp',entry: '//localhost:7100',container: '#subapp-container',activeRule: '/vue',}
]);start();// 子應用導出生命周期
export async function bootstrap() {}
export async function mount() {}
export async function unmount() {}

2. Module Federation (Webpack5)

// webpack.config.js (主應用)
new ModuleFederationPlugin({name: 'host',remotes: {app1: 'app1@http://localhost:3001/remoteEntry.js'}
});// 使用
import('app1/Button').then(ButtonModule => {const Button = ButtonModule.default;// 渲染Button
});

3. iframe (傳統方案)

優缺點

  • 優點:隔離徹底,實現簡單

  • 缺點:通信復雜,體驗不一致

選型建議

  • 需要快速接入 → qiankun

  • 需要細粒度控制 → Module Federation

  • 需要強隔離 → iframe

9. 服務端渲染

核心流程

優勢

  • 更好的SEO

  • 更快的首屏渲染

  • 更好的低端設備兼容性

實現方案

  1. Next.js (React):開箱即用SSR支持

  2. Nuxt.js (Vue):約定式路由SSR

  3. 自定義SSR:使用Vue Server Renderer / ReactDOMServer

10. 頁面渲染做了哪些操作

詳細渲染過程

  1. 解析HTML

    • 構建DOM樹

    • 遇到CSS/JS會并行下載

  2. 解析CSS

    • 構建CSSOM樹

    • 阻塞渲染(CSS是渲染阻塞資源)

  3. 合并渲染樹

    • 結合DOM和CSSOM

    • 排除display:none等不可見元素

  4. 布局計算

    • 計算每個節點的確切位置和大小

    • 也稱為"回流"(Reflow)

  5. 繪制

    • 將渲染樹轉換為屏幕像素

    • 分層(Layer)繪制,使用GPU加速

  6. 合成

    • 將各層合并為最終頁面

    • 處理transform/opacity等屬性

優化點

  • 減少重排重繪

  • 使用will-change提示瀏覽器

  • 關鍵渲染路徑優化

11. 服務器端渲染和客戶端渲染的區別

對比表格

特性服務端渲染 (SSR)客戶端渲染 (CSR)
渲染位置服務器端瀏覽器端
首次響應內容完整HTML空HTML骨架+JS
SEO友好性優秀較差(需額外處理)
首屏時間快(立即顯示內容)慢(需等待JS執行)
服務器壓力高(每次請求需渲染)低(靜態文件托管)
交互響應速度需等待JS加載完成后續交互更快
技術復雜度高(需處理同構等)

選型建議

  • 需要SEO/首屏速度 → SSR

  • 復雜交互/后臺系統 → CSR

  • 混合方案 → 關鍵頁面SSR + 其他CSR

12. 開發中配置跨域和上線后配置跨域

開發環境配置

Vue CLI

// vue.config.js
module.exports = {devServer: {proxy: {'/api': {target: 'http://backend:8080',changeOrigin: true,pathRewrite: { '^/api': '' }}}}
}

Vite

// vite.config.js
export default defineConfig({server: {proxy: {'/api': {target: 'http://backend:8080',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
})

生產環境Nginx配置

server {listen 80;server_name yourdomain.com;location /api/ {proxy_pass http://backend-server/;# CORS配置add_header 'Access-Control-Allow-Origin' '$http_origin';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';# 預檢請求處理if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;return 204;}}# 前端靜態資源location / {root /usr/share/nginx/html;try_files $uri $uri/ /index.html;}
}

高級配置

# 多環境配置
map $env $backend {default "http://default-server";staging "http://staging-server";prod "http://prod-server";
}# HTTPS配置
server {listen 443 ssl;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location /api/ {proxy_pass $backend;# ...其他配置同上}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95688.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95688.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95688.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Warmup_steps 設置經驗

文章目錄什么是 Warmup&#xff1f;實現示例科學設置 Warmup 的黃金法則直觀例子什么是 Warmup&#xff1f; Warmup 是一種學習率調度策略&#xff0c;在訓練初期逐步增加學習率&#xff08;LR&#xff09;&#xff0c;而不是直接使用目標學習率。它解決了兩個關鍵問題&#x…

vue一個超簡單的菜單欄伸縮示例

代碼<template><div class"container"><!-- 左側區域 --><div class"left-side" :style"{ width: leftWidth px }">左側內容</div><!-- 右側區域 --><div class"right-side" :style"{ l…

Spark學習(Pyspark)

&#xff08;1&#xff09;Spark基礎入門 ①什么是Spark Spark是一款分布式內存計算的統一分析引擎。其特點就是對任意類型的數據進行自定義計算。Spark可以計算&#xff1a;結構化、半結構化、非結構化等各種類型的數據結構&#xff0c;同時也支持使用Python、Java、Scala、R以…

PDF壓縮原理詳解:如何在不失真的前提下減小文件體積?

與直接刪除內容不同&#xff0c;良好的PDF壓縮能在大幅減小體積的同時&#xff0c;較好地保留原有文字清晰度和圖像質量&#xff0c;兼顧實用性與視覺效果。軟件操作十分直觀&#xff0c;僅需設置輸入文件與輸出路徑&#xff0c;點擊【開始壓縮】按鈕即可啟動處理。畫質壓縮等級…

從應用場景看國產化FPGA潛力,紫光同創研討會武漢·北京站回顧

八月&#xff0c;紫光同創 FPGA 技術研討會先后在武漢、北京舉行。作為紫光同創官方合作伙伴&#xff0c;ALINX 攜紫光同創 FPGA 開發板及行業解決方案亮相&#xff0c;與來自通信、工業控制、醫療、圖像視頻、消費電子等領域的近 200 位行業專家齊聚一堂&#xff0c;通過主題演…

安卓APK包體優化全攻略

目錄 正常默認打包流程&#xff08;以Android平臺為例&#xff09; 查看編輯器打包日志 壓縮圖片 壓縮網格模型 壓縮貼圖 壓縮音頻文件 只打64位包 最終大小 正常默認打包流程&#xff08;以Android平臺為例&#xff09; 準備工作&#xff1a; 確保已安裝最新版Unity H…

嵌入式學習日記(28)進程、線程

回收資源空間子進程回收策略1、wait阻塞回收&#xff1a;一般情況下父進程專門負責回收2、waitpid非阻塞回收&#xff1a;搭配輪詢方式回收3、不回收&#xff1a;子進程任務一致執行4、異步回收&#xff1a;子進程結束后通知父進程進行回收exec 函數族三種調用外部程序的方式#i…

測試用例的一些事項

為什么要寫測試用例&#xff1f;寫測試用例的原因是為了避免遺漏測試&#xff0c;我們要根據給的文檔將邏輯都表達出來&#xff0c;不能因為簡單而不寫&#xff0c;日后版本更新就知道自己哪些測了哪些沒測。在沒有文檔的時候測試用例該怎么寫&#xff1f;大家可以考慮安全測試…

當Java遇見AI:飛算驅動的個人博客介紹智能生成風暴

一、飛算JavaAI&#xff1a;重新定義個人開發的"智能魔法棒" 1.1 開發者需求變革&#xff1a;從"技術門檻"到"創意優先"的時代 在數字化浪潮席卷全球的今天&#xff0c;個人品牌建設已成為技術從業者、創業者乃至學生的剛需——無論是程序員分享…

小程序排名優化:用戶行為數據背后的提升密碼

用戶在小程序中的每一次點擊、每一次停留、每一次分享&#xff0c;都在產生著有價值的數據。這些看似零散的用戶行為數據&#xff0c;其實隱藏著提升小程序排名的密碼。平臺在判定小程序排名時&#xff0c;用戶行為數據是重要的參考依據&#xff0c;因為它直接反映了小程序對用…

【DSP28335 入門教程】深度解析中斷系統:三級架構與響應機制

大家好&#xff0c;歡迎來到我們的 DSP28335 深度解析系列。在之前的實戰中&#xff0c;我們通過 while(1) 循環和延時函數實現了各種控制&#xff0c;這種方式被稱為輪詢。但輪詢就像一個焦急的門衛&#xff0c;需要不停地去檢查每個門口是否有人&#xff0c;既浪費精力又效率…

代碼隨想錄二刷之“字符串”~GO

1.344. 反轉字符串 - 力扣&#xff08;LeetCode&#xff09; func reverseString(s []byte) {left : 0right : len(s)-1for left < right{s[left],s[right] s[right],s[left]leftright--}return } 感悟&#xff1a;還是go語法熟練程度的問題&#xff0c;需要注意的是&am…

(!萬字血書!)文本預處理:NLP 版 “給數據洗澡” 指南

好吧&#xff0c;我承認我是個標題黨&#xff01;(不這樣你會點進來享受這篇 通俗易懂 的好文章嗎&#xff1f;) 正經標題&#xff1a;文本預處理全流程:從基礎到實踐 &#xff08;屏幕前的你&#xff0c;帥氣低調有內涵&#xff0c;美麗大方很優雅… 所以&#xff0c;求…

最新chrome瀏覽器elasticsearch-head無法安裝使用問題

chrome瀏覽器網址欄復制粘貼以下內容輸入回車 chrome://flags/#allow-legacy-mv2-extensions 找到Allow legacy extension manifest versions項右側選擇Enabled啟用&#xff0c;重啟瀏覽器即可。

CSS aspect-ratio 屬性

aspect-ratio 是 CSS 中用于控制元素寬高比的屬性&#xff0c;通過一行代碼即可實現響應式比例布局&#xff0c;無需復雜計算。它確保元素在不同屏幕尺寸下保持固定比例&#xff0c;提升響應式設計效率。一、基本語法與取值selector {aspect-ratio: <width> / <height…

FreeRTOS多核支持

個人博客&#xff1a;blogs.wurp.top 簡介 1. 多核支持概述 在傳統的單核系統中&#xff0c;FreeRTOS 通常運行在一個 CPU 核心上&#xff0c;負責任務調度、中斷處理和資源管理。然而&#xff0c;在多核系統中&#xff0c;多個核心可以并行執行不同的任務或線程&#xff0c…

CUDA中的基本概念

要學習cuda的同學相信已經對其有一定的了解了&#xff0c;至少直到它是干什么的了。這篇文章主要是對cuda編程中的主要概念進行總結&#xff0c;有了一個大致的輪廓后就好入手了。 異構架構 異構架構即使用CPU和GPU共同進行計算。GPU不能作為一個獨立的運行平臺&#xff08;程序…

【LINUX網絡】HTTP協議基本結構、搭建自己的HTTP簡單服務器

目錄 1. 初識HTTP 2. URL 2.1 基本結構 2.2 URL中的?與urldecode\urlencode 易混淆&#xff1a;URL和HTTP傳輸請求兩者是什么關系&#xff1f; HTTP的宏觀結構 3. DEMO CODE loop模塊&#xff0c;核心邏輯 HttpServer 初代版本&#xff08;DEMO 0.0&#xff09; DEMO 1.0 DEMO…

Spring Boot 靜態函數無法自動注入 Bean?深入解析與解決方案

在 Spring Boot 項目中&#xff0c;開發者常遇到一個典型問題&#xff1a;在靜態方法或靜態變量中嘗試使用 Autowired 注入 Bean 時&#xff0c;始終得到 null 值。本文將深入剖析這一問題的根源&#xff0c;并提供多種可靠解決方案。問題重現&#xff1a;為什么注入失敗&#…

存儲過程作為系統邏輯核心的架構思考 —— 以 SaaS 系統為例

在企業級系統尤其是 SaaS 架構中&#xff0c;技術選型一旦確定&#xff0c;就意味著底層數據庫類型基本不會輕易更換。既然如此&#xff0c;我們可以更大膽地將數據庫能力本身納入系統設計的核心&#xff0c;而不僅僅把它當成一個被動的存儲引擎。存儲過程&#xff08;Stored P…