目錄
1. 防抖和節(jié)流
2. js閉包
vue中的data為什么是一個函數(shù)?(面試常問)
3. ES6面試題
3.1 var let const 區(qū)別
3.2?解構(gòu)?
3.3?如何利用es6快速的去重?
3.4?Promise?面試題?以下代碼的執(zhí)行結(jié)果是?
4.?Vue相關(guān)
4.1?MVC和MVVM的區(qū)別
4.2?v-model?原理
4.3? vue中的data為什么是一個函數(shù)?(面試常問)
4.4?v-if?和?v-show的區(qū)別
4.5?v-for中為什么要有key
5.?跨域的解決方法
5.1.?webpack?里的proxy
5.2. jsonp (需要后端支持 )
5.3.?webpack?plugin (插件)
5.4.?cors (后端解決)
6.git命令
7.get與post請求有什么區(qū)別
8.?cookie、localStorage、sessionStorage的區(qū)別?
9.?async?和?await?的區(qū)別
10.?setTimeout?時間為0,?以及誤差的原因
11.?求數(shù)組的最大值?
12.?求數(shù)組的最小值?
13.?數(shù)組去重?
14.?生成從0?到?指定數(shù)字的數(shù)組?
15.?數(shù)組求和
16.?js的數(shù)據(jù)類型
17.?js的變量提升
?18.?this指向
19.?map和forEach的區(qū)別
20.?箭頭函數(shù)和普通函數(shù)的區(qū)別?
21. es6新增
22.?數(shù)組方法匯總
23.?項(xiàng)目性能優(yōu)化方案
1. 防抖和節(jié)流
防抖:單位時間內(nèi),頻繁觸發(fā)事件,只執(zhí)行最后一次。
比如點(diǎn)擊按鈕,2秒后調(diào)用函數(shù),結(jié)果在1.5秒的時候又點(diǎn)了,則會重新計(jì)算2秒后在調(diào)用函數(shù)。
應(yīng)用場景:搜索框、輸入框
思路:利用定時器,每次觸發(fā)先清除定時器()
節(jié)流:單位時間內(nèi),頻繁觸發(fā)事件,只執(zhí)行一次
應(yīng)用場景比較多的是:快速點(diǎn)擊、鼠標(biāo)滑動、scroll事件、下拉刷新
思路:利用定時器,等定時器結(jié)束再開啟定時器
2. js閉包
什么是閉包:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
function a() {
? ? ? ? let a1 = 1;
? ? ? ? return function() {
? ? ? ? ? ? ? ? return a1
????????}
}
閉包存在意義:
可以延長變量的生命周期4可以創(chuàng)建私有的環(huán)境
閉包好處:
可以讀取其他函數(shù)的內(nèi)部變量
將變量始終保存在內(nèi)存中
可以封裝對象的私有屬性和方法
壞處:消耗內(nèi)存、使用不當(dāng)會造成內(nèi)存溢出問題
vue中的data為什么是一個函數(shù)?(面試常問)
Vue 中的 data 必須是個函數(shù),因?yàn)楫?dāng) data 是函數(shù)時,組件實(shí)例化的時候這個函數(shù)將會被調(diào)用,返回一個對象,計(jì)算機(jī)會給這個對象分配一個內(nèi)存地址,實(shí)例化幾次就分配幾個內(nèi)存地址,他們的地址都不一樣,所以每個組件中的數(shù)據(jù)不會相互干擾,改變其中一個組件的狀態(tài),其它組件不變。
簡單來說,就是為了保證組件的獨(dú)立性和可復(fù)用性,如果 data 是個函數(shù)的話,每復(fù)用一次組件就會返回新的 data,類似于給每個組件實(shí)例創(chuàng)建一個私有的數(shù)據(jù)空間,保護(hù)各自的數(shù)據(jù)互不影響
3. ES6面試題
3.1 var let const 區(qū)別
var: 存在變量提升;存在變量覆蓋,已經(jīng)被定義且賦值的變量,如果再次被賦值,則以后一次值為準(zhǔn);沒有塊級作用域;
const:定義的是常量,聲明之后必須賦值;定義的值不能去修改,否則報錯;有塊級作用域;不存在變量提升和變量覆蓋;對于數(shù)組和對象的元素修改,不算做對常量的修改,不會報錯。
let: 有塊級作用域;不存在變量提升和變量覆蓋;let不允許在相同的作用域中重復(fù)聲明,注意是相同作用域,不同作用域重復(fù)聲明不會報錯
3.2?解構(gòu)賦值?
let a = 1; let b = 2;? 如果在不聲明第三個變量的前提下,使a=2, b=1?
答案:[a, b] = [b, a]
3.3?如何利用es6快速的去重?
let?arr = [23, 12, 13, 33, 22, 12, 21]
let item = [...new Set(arr)]
3.4?Promise?面試題?以下代碼的執(zhí)行結(jié)果是?
const promise = new Promise((resolve, reject) => {
? ? ? ? console.log(1)
????????resolve()
????????console.log(2)
})
promise.then(() => {
? ? ? ? console.log(3)
})
console.log(4)
答案:1,2,4,3
解釋:以上考察的是關(guān)于promise的原理,promise的構(gòu)造函數(shù)是同步執(zhí)行的,當(dāng)new?Promise的一瞬間,1,2?就立刻被執(zhí)行,而 .then方法是異步執(zhí)行的,當(dāng)執(zhí)行完1和2之后,會執(zhí)行輸出4,最后執(zhí)行輸出3
4.?Vue相關(guān)
4.1?MVC和MVVM的區(qū)別
MVC:M(model數(shù)據(jù))、V(view視圖),C(controlle控制器)缺點(diǎn)是前后端無法獨(dú)立開發(fā),必須等后端接口做好了才可以往下走;前端沒有自己的數(shù)據(jù)中心,太過依賴后臺
MVVM:M(model數(shù)據(jù))、V(view視圖)、VM(viewModel控制數(shù)據(jù)的改變和控制視圖)
html部分相當(dāng)于View層,可以看到這里的View通過通過模板語法來聲明式的將數(shù)據(jù)渲染進(jìn)DOM元素,當(dāng)ViewModel對Model進(jìn)行更新時,通過數(shù)據(jù)綁定更新到View。 Vue實(shí)例中的data相當(dāng)于Model層,而ViewModel層的核心是Vue中的雙向數(shù)據(jù)綁定,即Model變化時VIew可以實(shí)時更新,View變化也能讓Model發(fā)生變化
MVVM與MVC最大的區(qū)別就是:它實(shí)現(xiàn)了View和Model的自動同步,也就是當(dāng)Model的屬性改變時,我們不用再自己手動操作Dom元素,來改變View的顯示,而是改變屬性后該屬性對應(yīng)View層顯示會自動改變
4.2?v-model?原理
是采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)從而達(dá)到數(shù)據(jù)和視圖同步。
4.3? vue中的data為什么是一個函數(shù)?(面試常問)
實(shí)際上就是一個閉包,因?yàn)関ue是單頁面應(yīng)用,是由很多組件構(gòu)成,每一個組件中都有一個data,所以通過閉包給每一個組件創(chuàng)建了一個私有的作用域,這樣就不會相互影響。
4.4?v-if?和?v-show的區(qū)別
v-if是通過添加和刪除元素來進(jìn)行顯示或者隱藏
v-show是通過操作DOM修改display樣式來修改元素的顯示和隱藏
如果需要頻繁的進(jìn)行元素的顯示和隱藏使用v-show性能更好
4.5?v-for中為什么要有key
key?可以提高虛擬DOM的更新效率。
在vue中,默認(rèn)“就地復(fù)用”的策略,在DOM操作的時候,如果沒有key?就會造成選項(xiàng)錯亂
key?只能是字符串或者number,其他類型不可以
1.?虛擬DOM中key的作用:
key是虛擬DOM對象的標(biāo)識,當(dāng)數(shù)據(jù)發(fā)生變化時,Vue會根據(jù)【新數(shù)據(jù)】生成【新的虛擬DOM】,隨后Vue進(jìn)行【新的虛擬DOM】與【舊的虛擬DOM】差異比較比較規(guī)則如下:
2.?比較規(guī)則:
1)舊虛擬DOM找到了與新虛擬DOM相同的key:
若虛擬DOM中內(nèi)容沒變,直接使用之前的真實(shí)DOM
若虛擬DOM中內(nèi)容變了,則生成新的真實(shí)DOM,隨后替換掉頁面中之前的真實(shí)DOM
3.?用index作為key可能會引發(fā)的問題:
1)若對數(shù)據(jù)進(jìn)行:逆序添加、逆序刪除等破壞順序的操作,會產(chǎn)生沒有必要的真實(shí)DOM更新==>界面效果沒問題,但效率低
2)如果結(jié)構(gòu)中還包含輸入類的DOM,會產(chǎn)生錯誤的DOM更新 ==>?界面有問題
4.6?打包后?dist?目錄過大,解決辦法?
1.?dist打包生成的文件中有 .map?文件,可以刪除。在?vue.config.js文件中配置:productionSourceMap: false
2.?組價和路由使用懶加載、按需引入等
3.?對于文件和圖片進(jìn)行壓縮。?安裝壓縮組件:?compression-webpack-plugin
安裝后進(jìn)行導(dǎo)入配置:?
最小化代碼 minisize: true
分割代碼: splitChunksl
超過限定值的文件進(jìn)行壓縮,threshold:?文件大?。ㄗ止?jié)為單位)
4.7?watch和computed的區(qū)別
computed能完成的功能,watch都可以完成
watch能完成的小功能,computed不一定能完成。例如:watch可以進(jìn)行異步操作
兩個重要小原則:
1.所有被vue管理的函數(shù),最好寫成普通函數(shù),這樣this的指向才是vm或組件實(shí)例對象
2.?所有不被vue管理的函數(shù)(定時器的回調(diào)、ajax的回調(diào)、promise的回調(diào)等),最好寫成箭頭函數(shù),這樣this的指向才是vm或組件實(shí)例對象
4.8?vue組件之間的數(shù)據(jù)傳遞
1.?父組件給子組件傳遞數(shù)據(jù)
通過給子組件身上綁定自定義屬性,然后再子組件里使用props屬性來接收即可
2.?子組件給父組件傳遞數(shù)據(jù)
1)第一種方式:通過父組件給子組件傳遞函數(shù)類型的props實(shí)現(xiàn):子組件給父組件傳遞數(shù)據(jù)
父組件:
?
?子組件:
?
2)第二種方式:通過父組件給子組件綁定一個自定義事件實(shí)現(xiàn):子組件給父組件傳遞數(shù)據(jù)
?父組件:
?
?子組件:
3)第三種方式:通過父組件給子組件綁定一個自定義事件實(shí)現(xiàn):使用ref實(shí)現(xiàn)
?父組件:
?
?子組件:
?
3.?全局事件總線:可以實(shí)現(xiàn)任意組件間的數(shù)據(jù)傳遞?
main.js:將全局事件bus,掛載到Vue的原型上,這樣所有的組件都可以使用
?兄弟組件A:
?兄弟組件B:
4.?消息訂閱與發(fā)布
一種組件間的通信方式,適用于任意組件間通信。
使用步驟:
1)安裝pubsub: npm i pubsub-js
2)?引入:?import pubsub from 'pubsub-js'
3)?接收數(shù)據(jù):?A組件想要接收數(shù)據(jù),則在A組件中訂閱消息,訂閱的回調(diào)留在A組件自身
mounted() {
? ? ? ? this.pid = punsub.subscribe('xxx', (data)=>{
? ? ? ? ? ? ? ? ......
????????})
}
4)?提供數(shù)據(jù):?pubsub.publish('xxx',?數(shù)據(jù))
5)最好在beforeDestory鉤子中,用pubsub.unsubscribe(pid)取消訂閱
5.?跨域的解決方法
跨域:只要協(xié)議、域名和端口號有一個不相同就會產(chǎn)生跨域問題。同源策略是一個安全策略。同源,指的是協(xié)議,域名,端口相同。瀏覽器處于安全方面的考慮,只允許本域名下的接口交互,不同源的客戶端腳本,在沒有明確授權(quán)的情況下,不能讀寫對方的資源。
解決辦法:
5.1.?webpack?里的proxy
devServer: {
? ? proxy: { ?//配置跨域
? ? ? '/api': {
? ? ? ? target: 'http://121.121.67.254:8185/', ?//這里后臺的地址模擬的;應(yīng)該填寫你們真實(shí)的后臺接口
? ? ? ? changOrigin: true, ?//用于控制請求頭中的post值,默認(rèn)開啟
? ? ? ? pathRewrite: {
? ? ? ? ? /* 重寫路徑,當(dāng)我們在瀏覽器中看到請求的地址為:http://localhost:8080/api/core/getData/userInfo 時
? ? ? ? ? ? 實(shí)際上訪問的地址是:http://121.121.67.254:8185/core/getData/userInfo,因?yàn)橹貙懥?/api
? ? ? ? ? ?*/
? ? ? ? ? '^/api': ''?
? ? ? ? }
? ? ? },
? ? }
? }
5.2. jsonp (需要后端支持 )
方案1 *:通配符,全部允許,存在安全隱患(不推薦)。
一旦啟用本方法,表示任何域名皆可直接跨域請求:
? 1 ? ? server {
? 2 ? ? ? ? ...
? 3 ? ? ? ? location / {
? 4 ? ? ? ? ? ? # 允許 所有頭部 所有域 所有方法
? 5 ? ? ? ? ? ? add_header 'Access-Control-Allow-Origin' '*';
? 6 ? ? ? ? ? ? add_header 'Access-Control-Allow-Headers' '*';
? 7 ? ? ? ? ? ? add_header 'Access-Control-Allow-Methods' '*';
? 8 ? ? ? ? ? ? # OPTIONS 直接返回204
? 9 ? ? ? ? ? ? if ($request_method = 'OPTIONS') {
?10 ? ? ? ? ? ? ? ? return 204;
?11 ? ? ? ? ? ? }
?12 ? ? ? ? }
?13 ? ? ? ? ...
?14 ? ? }
方案2:多域名配置(推薦)
配置多個域名在map中 只有配置過的允許跨域:
? 1 ?map $http_origin $corsHost {
? 2 ? ? ? ? default 0;
? 3 ? ? ? ? "~https://zzzmh.cn" https://zzzmh.cn;
? 4 ? ? ? ? "~https://chrome.zzzmh.cn" https://chrome.zzzmh.cn;
? 5 ? ? ? ? "~https://bz.zzzmh.cn" https://bz.zzzmh.cn;
? 6 ? ? }
? 7 ? ? server {
? 8 ? ? ? ? ...
? 9 ? ? ? ? location / {
?10 ? ? ? ? ? ? # 允許 所有頭部 所有$corsHost域 所有方法
?11 ? ? ? ? ? ? add_header 'Access-Control-Allow-Origin' $corsHost;
?12 ? ? ? ? ? ? add_header 'Access-Control-Allow-Headers' '*';
?13 ? ? ? ? ? ? add_header 'Access-Control-Allow-Methods' '*';
?14 ? ? ? ? ? ? # OPTIONS 直接返回204
?15 ? ? ? ? ? ? if ($request_method = 'OPTIONS') {
?16 ? ? ? ? ? ? ? ? return 204;
?17 ? ? ? ? ? ? }
?18 ? ? ? ? }
?19 ? ? ? ? ...
?20 ? ? }
5.3.?webpack?plugin (插件)
npm i -S webpack-dev-middleware? 安裝中間鍵,把前端和后端的服務(wù)綁在一起
中間件
let webpack = require('webpack')
let middle = require('webpack-dev-middleware')
let compiler = webpack(require('./webpack.config.js'))
app.use(middle(compiler))
5.4.?cors (后端解決)
var allowCrossDomain = function(req,res,next) {
? ? ? ? // 請求源
? ? ? ? res.header("Access-Control-Allow-Origin", "*")
? ? ? ? //?請求頭?token
????????res.header("Access-Control-Allow-Headers", "*")
? ? ? ? //?請求方法?get?post?put?del
????????res.header("Access-Control-Allow-Methods", "*")
? ? ? ? next();
}
app.use(allowCrossDomain )
6.git命令
1. git init 初始化git倉庫 (mac中Command+Shift+. 可以顯示隱藏文件)
2. git status 查看文件狀態(tài)
3. git add 文件列表 追蹤文件
4. git commit -m 提交信息 向倉庫中提交代碼
5. git log 查看提交記錄
6.1.分支明細(xì)
(1)主分支(master):第一次向 git 倉庫中提交更新記錄時自動產(chǎn)生的一個分支。
(2)開發(fā)分支(develop):作為開發(fā)的分支,基于 master 分支創(chuàng)建。
(3)功能分支(feature):作為開發(fā)具體功能的分支,基于開發(fā)分支創(chuàng)建
6.2.分支命令
(1)git branch 查看分支
(2)git branch 分支名稱 創(chuàng)建分支
(3)git checkout 分支名稱 切換分支
(4)git merge 來源分支 合并分支 (備注:必須在master分支上才能合并develop分支)
(5)git branch -d 分支名稱 刪除分支(分支被合并后才允許刪除)(-D 強(qiáng)制刪除)
6.3.暫時保存更改
(1)存儲臨時改動:git stash
(2)恢復(fù)改動:git stash pop
7.get與post請求有什么區(qū)別
get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。
POST比GET安全,因?yàn)閿?shù)據(jù)在地址欄上不可見。
get方式提交的數(shù)據(jù)最多只能有1024字節(jié),而post則沒有此限制。
GET使用URL或Cookie傳參。而POST將數(shù)據(jù)放在request BODY中。
GET與POST都有自己的語義,不能隨便混用。
據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時間和發(fā)兩次包的時間差別基,本可以無視。而在網(wǎng) 絡(luò)環(huán)境差的情況下,兩次包的TCP在驗(yàn)證數(shù)據(jù)包完整 性上,有非常大的優(yōu)點(diǎn)。post 發(fā)送兩次,get 只發(fā)送一次。
8.?cookie、localStorage、sessionStorage的區(qū)別?
共同點(diǎn): 都是保存在瀏覽器端、且同源的
不同點(diǎn):
cookie數(shù)據(jù)始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來回傳遞。cookie數(shù)據(jù)還有路徑(path)的概念,可以限制cookie只屬于某個路徑下sessionStorage和localStorage不會自動把數(shù)據(jù)發(fā)送給服務(wù)器,僅在本地保存。
存儲大小限制也不同:
cookie數(shù)據(jù)不能超過4K,sessionStorage和localStorage可以達(dá)到5M
sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉之前有效;
localStorage:始終有效,窗口或?yàn)g覽器關(guān)閉也一直保存,本地存儲,因此用作持久數(shù)據(jù);
cookie:只在設(shè)置的cookie過期時間之前有效,即使窗口關(guān)閉或?yàn)g覽器關(guān)閉
作用域不同
sessionStorage:不在不同的瀏覽器窗口中共享,即使是同一個頁面;
localstorage:在所有同源窗口中都是共享的;也就是說只要瀏覽器不關(guān)閉,數(shù)據(jù)仍然存在
cookie: 也是在所有同源窗口中都是共享的.也就是說只要瀏覽器不關(guān)閉,數(shù)據(jù)仍然存在
9.?async?和?await?的區(qū)別
區(qū)別:
async是來定義函數(shù)的,定義異步函數(shù),打印函數(shù)名可以得到一個promise對象,言外之意可以通過這個? ?函數(shù)名稱.then?這個方法
await?后面跟的是任意表達(dá)式,一般使用promise的表達(dá)式
async?內(nèi)部實(shí)現(xiàn),又返回值?成功返回promise.resolve() ,出錯返回promise.reject()?返回值用catch捕獲
await?等待后面的promise對象執(zhí)行完畢,拿到了promise.resolve()的值之后,執(zhí)行后面的代碼。await后面的表達(dá)式,能是promise.reject(),所以建議await放在try....catch語句中
優(yōu)點(diǎn):async和await?屬于es7語法。編寫方便,提高程序效率,避免了回調(diào)地獄
補(bǔ)充:promise和async和await的區(qū)別
promise?es6語法,promise中包含catch,async需要自己定義catch
promise?提供的方法會多一些,all、race等方法,aync中是沒有的。
10.?setTimeout?時間為0,?以及誤差的原因
setTimeout,如果
時間為0,則會立即插入隊(duì)列,不是立即執(zhí)行,等待前面的代碼執(zhí)行完畢。
11.?求數(shù)組的最大值?
function getMaxArryNum(arr) {
? ? ? ? return Math.max(...arr)
}?
getMaxArryNum([1,2,3,4,5,6])
12.?求數(shù)組的最小值?
const?getMinArryNum= (arr) => {
? ? ? ? return Math.min(...arr)
}?
getMinArryNum([1,2,3,4,5,6])?
13.?數(shù)組去重?
const removeEqual = (arr) => {
? ? ? ? const result = arr.filter((item, index, self) => {
? ? ? ? ? ? ? ? return self.indexof(item) === index
????????})
????????return result
}?
removeEqual([1,2,3,4,5,6,1,2,3,42,1])
14.?生成從0?到?指定數(shù)字的數(shù)組?
const getArr = (startNum, endNum) => {
? ? ? ? let arr = []
? ? ? ? for(var i=startNum; i<=endNum; i++){
? ? ? ? ? ? ? ? arr.push(i)
????????}
? ? ? ? return arr
}?
getArr(0,4)
15.?數(shù)組求和
const?arrSum = (arr) => {
? ? ? ? const temp = arr.reduce((pre, now) => {
? ? ? ? ? ? ? ? return pre+now
????????},0)
? ? ? ? return temp
}
arrSum([1,2,3,4])
16.?js的數(shù)據(jù)類型
js?數(shù)據(jù)類型分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型
基本數(shù)據(jù)類型:Boolean、Number、String、Null、Undefined
復(fù)雜數(shù)據(jù)類型:?Object、Array、Function、Date
17.?js的變量提升
在js中,變量和函數(shù)的聲明會被提升到最頂部執(zhí)行
函數(shù)提升高于變量的提升
函數(shù)內(nèi)部如果用var聲明了相同名稱的外部變量,函數(shù)將不再向上尋找
匿名函數(shù)不會提升
?18.?this指向
this總是指向函數(shù)的直接調(diào)用者。
如果有new關(guān)鍵字,this指向new出來的對象
在事件中,this指向觸發(fā)這個事件的對象
19.?map和forEach的區(qū)別
forEach方法,是最基本的方法,遍歷和循環(huán)。默認(rèn)有3個參數(shù):分別是遍歷的每一個元素item,遍歷的索引index,遍歷的數(shù)組array
map方法,和foreach一致,不同的是會返回一個新的數(shù)組,所以callback需要有return返回值,如果沒有會返回undefined
20.?箭頭函數(shù)和普通函數(shù)的區(qū)別?
函數(shù)體內(nèi)的this對象,就是定義時所在的對象,而不是使用時所在的對象
不可以當(dāng)作構(gòu)造函數(shù),也就是說不可以使用new命令,否則會報錯
不可以使用arguments對象,該對象在函數(shù)體內(nèi)不存在,如果要用可以使用Rest參數(shù)代替
不可以使用yield命令,因此箭頭函數(shù)不能用作Generator函數(shù)
21. es6新增
新增模版字符串
箭頭函數(shù)
增加let、const來聲明變量
for-of用來遍歷數(shù)據(jù)-例如數(shù)組中的值
解構(gòu)賦值
新增簡單數(shù)據(jù)類型Symbol,獨(dú)一無二的,不會與其他屬性名沖突
將Promise對象納入規(guī)范,提供了原生的Promise對象
22.?數(shù)組方法匯總
map?循環(huán)遍歷數(shù)組、返回一個新的數(shù)組
forEach?循環(huán)遍歷數(shù)組,不改變原數(shù)組
push/pop?在數(shù)組的末尾添加/刪除元素? 改變原數(shù)組
unshift/ shift?在數(shù)組的頭部添加/刪除元素,改變原數(shù)組
join? 把數(shù)組轉(zhuǎn)化為字符串
some? 有一項(xiàng)返回為true,則整體為true
every? 有一項(xiàng)返回為true,則整體為false
filter?數(shù)組過濾
slice(start, end)? 數(shù)組截取,包括開頭,不包括截取,返回一個新的數(shù)組
splice(start, number, value)? 刪除數(shù)組元素,改變原數(shù)組
indexof/lastindexof:?查找數(shù)組項(xiàng),返回對應(yīng)的下標(biāo)
concat:數(shù)組的拼接,不影響原數(shù)組,淺拷貝
sort:數(shù)組排序?改變原數(shù)組
reverse:?數(shù)組反轉(zhuǎn),改變原數(shù)組
23.?項(xiàng)目性能優(yōu)化方案
減少http請求
減少DNS查詢
使用CDN
避免重定向
圖片懶加載
路由懶加載
減少DOM元素操作
使用外部js和css
壓縮js、css、字體、圖片等
使用iconfont字體圖標(biāo)、雪碧圖等
避免圖片的src為空
把樣式表放在link中文章來源:http://www.zghlxwxcb.cn/news/detail-403692.html
把js放在頁面的底部文章來源地址http://www.zghlxwxcb.cn/news/detail-403692.html
到了這里,關(guān)于2022前端面試題匯總(持續(xù)更新中~)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!