日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > HTML >内容正文

HTML

整理的最新的前端面试题必问集锦 (持续更新)

發(fā)布時(shí)間:2024/3/13 HTML 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整理的最新的前端面试题必问集锦 (持续更新) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前端面試必問(wèn)

一、HTML+CSS

1.HTML

001.標(biāo)簽上title屬性與alt屬性的區(qū)別是什么?
title: 仔顯示圖片的時(shí)候,鼠標(biāo)以上可以顯示一些信息,一般為建議、提示類型 alt : 當(dāng)網(wǎng)速不佳,或者因其他原因圖片加載不出來(lái),代替圖片解釋的信息
002.、有什么區(qū)別?、有什么區(qū)別em?
有區(qū)別,但區(qū)別不明顯,瀏覽器顯示不出來(lái)。
003.請(qǐng)寫出至少5個(gè)html5新增的標(biāo)簽,并說(shuō)明其語(yǔ)義和應(yīng)用場(chǎng)景?
section:定義文檔中的一個(gè)章節(jié) nav:定義只包含導(dǎo)航鏈接的章節(jié) header:定義頁(yè)面或章節(jié)的頭部。它經(jīng)常包含 logo、頁(yè)面標(biāo)題和導(dǎo)航性的目錄。 footer:定義頁(yè)面或章節(jié)的尾部。它經(jīng)常包含版權(quán)信息、法律信息鏈接和反饋建議用的地址。 aside:定義和頁(yè)面內(nèi)容關(guān)聯(lián)度較低的內(nèi)容——如果被刪除,剩下的內(nèi)容仍然很合理。
004.請(qǐng)說(shuō)說(shuō)你對(duì)標(biāo)簽語(yǔ)義化的理解?
a. 去掉或者丟失樣式的時(shí)候能夠讓頁(yè)面呈現(xiàn)出清晰的結(jié)構(gòu) b. 有利于SEO:和搜索引擎建立良好溝通,有助于爬蟲抓取更多的有效信息:爬蟲依賴于標(biāo)簽來(lái)確定上下文和各個(gè)關(guān)鍵字的權(quán)重; c. 方便其他設(shè)備解析(如屏幕閱讀器、盲人閱讀器、移動(dòng)設(shè)備)以意義的方式來(lái)渲染網(wǎng)頁(yè); d. 便于團(tuán)隊(duì)開發(fā)和維護(hù),語(yǔ)義化更具可讀性,遵循W3C標(biāo)準(zhǔn)的團(tuán)隊(duì)都遵循這個(gè)標(biāo)準(zhǔn),可以減少差異化。
005.html5有哪些新特性、移除了那些元素?
a. HTML5 現(xiàn)在已經(jīng)不是 SGML 的子集,主要是關(guān)于圖像,位置,存儲(chǔ),多任務(wù)等功能的增加。b. 拖拽釋放(Drag and drop) APIc. 語(yǔ)義化更好的內(nèi)容標(biāo)簽(header,nav,footer,aside,article,section)d. 音頻、視頻API(audio,video)e. 畫布(Canvas) APIf. 地理(Geolocation) APIg. 本地離線存儲(chǔ) localStorage 長(zhǎng)期存儲(chǔ)數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)不丟失h. sessionStorage 的數(shù)據(jù)在頁(yè)面會(huì)話結(jié)束時(shí)會(huì)被清除i. 表單控件,calendar、date、time、email、url、searchj. 新的技術(shù)webworker, websocket等移除的元素:a. 純表現(xiàn)的元素:basefont,big,center, s,strike,tt,u;b. 對(duì)可用性產(chǎn)生負(fù)面影響的元素:frame,frameset,noframes;
006.html5的存儲(chǔ)類型有什么區(qū)別?
答: cookies:服務(wù)器和客戶端都可以訪問(wèn),大小只有4KB左右,有有效期,過(guò)期后將會(huì)刪除; localStorage:將數(shù)據(jù)保存在本地的硬件設(shè)備,沒(méi)有時(shí)間限制,關(guān)閉瀏覽器也不會(huì)丟失。永久保cun sessionStorage:將數(shù)據(jù)保存在session對(duì)象中,關(guān)閉瀏覽器后數(shù)據(jù)也隨之銷毀。臨時(shí)保存。
007.cookies,sessionStorage和localStorage的區(qū)別是什么?

答:
它們之間的共同點(diǎn):都是保存在瀏覽器端,且是同源的。
它們之間的區(qū)別:

  • cookies是為了標(biāo)識(shí)用戶身份而存儲(chǔ)在用戶本地終端上的數(shù)據(jù),始終在同源http請(qǐng)求中攜帶,
    即cookies在瀏覽器和服務(wù)器間來(lái)回傳遞,而sessionstorage和localstorage不會(huì)自動(dòng)把數(shù)據(jù)發(fā)給服務(wù)器,
    僅在本地保存。
  • 存儲(chǔ)大小的限制不同。cookie保存的數(shù)據(jù)很小,不能超過(guò)4k,而sessionstorage和localstorage
    保存的數(shù)據(jù)大,可達(dá)到5M。數(shù)據(jù)的有效期不同。cookie在設(shè)置的cookie過(guò)期時(shí)間之前一直有效,即使窗口
    或者瀏覽器關(guān)閉。sessionstorage僅在瀏覽器窗口關(guān)閉之前有效。localstorage始終有效,窗口和瀏覽器
    關(guān)閉也一直保存,用作長(zhǎng)久數(shù)據(jù)保存。
  • 作用域不同。cookie在所有的同源窗口都是共享;sessionstorage不在不同的瀏覽器共享,即使同一頁(yè)面;localstorage在所有同源窗口都是共享。
  • 008.在form表單中,get方式和post方式提交數(shù)據(jù)的區(qū)別是什么?如何判斷在實(shí)際開發(fā)中的應(yīng)用?
    答: get方式和post方式提交數(shù)據(jù)的區(qū)別: 1) 大小不同,get方式傳輸?shù)臄?shù)據(jù)量較小,而post可以傳輸大量的數(shù)據(jù)。 2) 安全程度不同,get方式傳輸數(shù)據(jù)能夠被別人輕易的看到數(shù)據(jù)內(nèi)容,所以安全程度較低, 而post則可以很好的隱藏。 3) 速度不同,post方式速度較慢,而get方式速度較快。 4) 在服務(wù)器上的作用不同,get是從服務(wù)器上獲取數(shù)據(jù),而post是向服務(wù)器上傳送數(shù)據(jù)。在實(shí)際開發(fā)中的應(yīng)用: 1)在重要數(shù)據(jù)進(jìn)行傳輸數(shù)據(jù)的時(shí)候,用post的方式進(jìn)行提交數(shù)據(jù)。 2)在做數(shù)據(jù)查詢的時(shí)候,用get的方式進(jìn)行提交數(shù)據(jù)。 3)在做增加、刪除和修改數(shù)據(jù)的時(shí)候,用post的方式進(jìn)行提交數(shù)據(jù)。
    009.行內(nèi)元素有哪些?塊級(jí)元素有哪些?空元素有哪些?
    答: 塊級(jí)元素:div、p、h1-h6、ol、ul、table、form 行內(nèi)元素:span、a、img、input、select、small 空元素:沒(méi)有內(nèi)容的元素、 br、 hr
    010.對(duì)于src以及href,它們之間有什么樣的區(qū)別呢?
    答: 1)src用于替換當(dāng)前元素;href用于在當(dāng)前文檔和引用資源之間確立聯(lián)系。 2)src是source的縮寫,指向外部資源的位置,指向的內(nèi)容將會(huì)嵌入到文 檔中當(dāng)前標(biāo)簽所在位置。 3)href是Hypertext Reference的縮寫,指向網(wǎng)絡(luò)資源所在位置,建立和 當(dāng)前元素(錨點(diǎn))或當(dāng)前文檔(鏈接)之間的鏈接。

    2.CSS

    001.談?wù)勀銓?duì)CSS布局的理解?

    常見(jiàn)的布局方式:固定布局、流式布局、彈性布局、浮動(dòng)布局、定位布局、margin和padding

    002.請(qǐng)列舉幾種可以清除浮動(dòng)的方法(至少兩種)
    a. 添加額外標(biāo)簽,例如 <div style="clear:both"></div>b. 父元素設(shè)置 overflow:hidden auto; c. 父元素也設(shè)置浮動(dòng)
    003.CSS中 link 和@import 的區(qū)別是什么?
    a. link屬于HTML標(biāo)簽,而@importCSS提供的,且只能加載 CSS b. 頁(yè)面被加載時(shí),link會(huì)同時(shí)被加載,而@import引用的CSS會(huì)等到頁(yè)面被加載完再加載 link方式的樣式的權(quán)重 高于@import的權(quán)重
    004.position的absolute與fixed共同點(diǎn)與不同點(diǎn)?
    相同: a. 改變行內(nèi)元素的呈現(xiàn)方式,display被置為block b. 讓元素脫離普通流,不占據(jù)空間 c. 默認(rèn)會(huì)覆蓋到非定位元素上區(qū)別: absolute的”根元素“是可以設(shè)置的,而fixed的”根元素“固定為瀏覽器窗口。 當(dāng)你滾動(dòng)網(wǎng)頁(yè),fixed元素與瀏覽器窗口之間的距離是不變的。
    005.position的值, relative和absolute分別是相對(duì)于誰(shuí)進(jìn)行定位的?
    absolute:生成絕對(duì)定位的元素,相對(duì)于 static 定位以外的第一個(gè)祖先元素進(jìn)行定位fixed:生成絕對(duì)定位的元素,相對(duì)于瀏覽器窗口進(jìn)行定位。 (IE6不支持)relative:生成相對(duì)定位的元素,相對(duì)于其在普通流中的位置進(jìn)行定位static:默認(rèn)值。沒(méi)有定位,元素出現(xiàn)在正常的流中
    006.CSS3有哪些新特性?
    CSS3實(shí)現(xiàn)圓角(border-radius),陰影(box-shadow),對(duì)文字加特效(text-shadow),線性漸變(gradient),變形(transform)
    007.什么是 FOUC(無(wú)樣式內(nèi)容閃爍)?你如何來(lái)避免 FOUC?
    如果使用import方法對(duì)CSS進(jìn)行導(dǎo)入,會(huì)導(dǎo)致某些頁(yè)面在Windows下的IE出現(xiàn)一些奇怪的現(xiàn)象: 以無(wú)樣式顯示頁(yè)面內(nèi)容的瞬間閃爍,這種現(xiàn)象稱之為文檔樣式短暫失效(Flash of Unstyled Content), 簡(jiǎn)稱為FOUC。 原理:當(dāng)樣式表晚于結(jié)構(gòu)性html加載,當(dāng)加載到此樣式表時(shí),頁(yè)面將停止之前的渲染。此樣式表被下載和解析后,將重新渲染頁(yè)面,也就出現(xiàn)了短暫的花屏現(xiàn)象。 解決方法:使用LINK標(biāo)簽將樣式表放在文檔HEAD中。
    008.怎么理解BFC?優(yōu)化前端性能的方法?
    BFC, 可以理解為他是運(yùn)用一些渲染規(guī)則的塊渲染區(qū)域,他是css世界中的結(jié)界,為何說(shuō)是結(jié)界, 因?yàn)樵谟|發(fā)了BFC 特性的容器下元素和容器外部元素完全隔離,子元素的布局不會(huì)影響外部元素, 反之亦然BFC 元素有如下一些特征:BFC 的塊不會(huì)和浮動(dòng)塊重疊計(jì)算BFC 元素的高度時(shí),會(huì)包括浮動(dòng)元素在一個(gè)BFC下的塊 margin 會(huì)發(fā)生重疊 ,不在同一個(gè)則不會(huì)BFC元素是一個(gè)獨(dú)立的容器,使得里面的元素和外部元素隔離開,互不影響觸發(fā)BFC: float的值不為 noneoverflow 的值為 auto ,scroll 和 hiddendisplay 的值為 table-cell , table-caption 和 inline-blockposition 設(shè)置為 absolute 和 fixed除此之外, html 元素本身默認(rèn)就是一個(gè) BFC 元素
    009.什么是css的盒子模型, 低版本IE 的盒子模型有什么不同的?
    把所有的網(wǎng)頁(yè)元素都看成一個(gè)盒子,它具有: content,padding,border,margin 四個(gè)屬性,這就是盒子模型。有兩種, IE盒子模型、W3C盒子模型; 盒模型: 內(nèi)容(content)、填充(padding)、邊界(margin)、 邊框(border); 區(qū) 別: IE的content部分把 border 和 padding計(jì)算了進(jìn)去;
    010.px 和 em 和 rem 的區(qū)別?
    px 是絕對(duì)單位 em 相對(duì)單位,基于父節(jié)點(diǎn)字體大小 rem 會(huì)繼承父級(jí)元素的字體大小 使用 rem 為元素設(shè)定字體大小時(shí),仍然是相對(duì)大小,但相對(duì)的只是HTML 跟元素
    011.重繪和回流?
    重繪:當(dāng)渲染樹中的元素外觀(如:顏色)發(fā)生改變,不影響布局時(shí),產(chǎn)生重繪 回流:當(dāng)渲染樹中的元素的布局(如:尺寸、位置、隱藏/狀態(tài)狀態(tài))發(fā)生改變時(shí),產(chǎn)生重繪回流
    012.BFC
    • 塊級(jí)格式化上下文,是一個(gè)獨(dú)立的渲染區(qū)域,讓處于BFC內(nèi)部元素與外部元素相互隔離,互不影響

    觸發(fā)BFC的條件:

  • float屬性不為none
  • Position為absolute或者fixed
  • display為inline-block,table-cell,table-caption,flex,inline-flex
  • overflow不為visible
  • 作用:

  • 可以包含浮動(dòng)元素
  • 不被浮動(dòng)元素所影響
  • 阻止父子元素的margin重疊
  • 013.清除浮動(dòng)的方法
  • 父級(jí)加高度
  • 父級(jí)也浮動(dòng),需要定義寬度
  • 父級(jí)加overflow:hidden
  • 父級(jí)添加偽類::after和zoom
  • 使用clear:both
  • 014.div水平垂直居中(必考)

    1.已知寬高的情況

    方法一:

    ? position:absolute;

    ? left:50%;top:50%;

    ? margin-top:-高度/2

    ? margin-left:-寬度/2

    方法二:

    ? position:absolute;

    ? margin:auto;

    ? top:0;

    ? right:0;

    ? bottom:0;

    ? left:0;

    2.未知寬高

    ? transform:translateX(-50%) translateY(-50%)

    3.父元素有高度的情況下并且只有一個(gè)div子元素

    ? display:flex;

    ? justify-content:center;

    ? align-items:center

    015.img圖片中線對(duì)齊

    在img標(biāo)簽后添加空span行內(nèi)標(biāo)簽,給控標(biāo)簽設(shè)置樣式

    span{width:0;height:100%line-height }

    給img添加屬性

    img{vertical-align: middle; }

    方法二:

    彈性盒布局

    二、JavaScript

    001.什么是閉包?優(yōu)缺點(diǎn)?
    • 什么是閉包?
      • 閉包是嵌套在一個(gè)函數(shù)內(nèi)部的函數(shù),
      • 閉包能夠讀取其他函數(shù)內(nèi)部的變量(參數(shù))
      • 閉包就是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中變量、參數(shù)的函數(shù)
    • 優(yōu)點(diǎn):
      • 避免命名沖突:創(chuàng)建命名空間 盡可能少的定義全局變量,避免全局空間的污染,減少協(xié)作時(shí)的干擾
      • 變量緩存
    • 缺點(diǎn):
      • 容易發(fā)生泄漏:一塊內(nèi)存空間既不能被使用也不能被銷毀
      • 占用內(nèi)存:當(dāng)閉包使用過(guò)多時(shí),消耗內(nèi)存
    002.什么是 Promise ?
    - Promise 是異步編程的一種解決方案,從語(yǔ)法上講,Promise是一個(gè)對(duì)象,可以獲取異步操作的消息 - Promise 最主要的交互方式:將回調(diào)函數(shù)傳入 then 方法來(lái)獲得最終結(jié)果或出錯(cuò)原因 - Promise 代碼書寫上的表現(xiàn):以“鏈?zhǔn)秸{(diào)用”代替回調(diào)函數(shù)層層嵌套(回調(diào)地獄)
    • Promise的三種狀態(tài):
    • pendding //正在請(qǐng)求
    • rejected //失敗
    • resolved //成功

    更多promise 介紹請(qǐng)看:https://blog.csdn.net/weixin_47076989/article/details/107200004

    003.宏任務(wù) & 微任務(wù)
    宏任務(wù)(macro-task):整體代碼script、setTimeOut、setInterval 微任務(wù)(mincro-task):promise.then、promise.nextTick(node)

    更多事件循環(huán)機(jī)制、宏任務(wù)、微任務(wù)介紹:

    https://blog.csdn.net/weixin_47076989/article/details/107890187

    004.服務(wù)器同源策略/解決跨域請(qǐng)求?

    什么是同源策略?

    • 同源策略,指的是瀏覽器對(duì)不同源的腳本或者文本的訪問(wèn)方式進(jìn)行的限制。
    • 同源指兩個(gè)頁(yè)面具有相同的協(xié)議,主機(jī)(也常說(shuō)域名),端口,三個(gè)要素缺一不可。
    • 同源策略就是為了保證網(wǎng)站的數(shù)據(jù)安全而存在。

    什么是跨域?你有幾中方式可以解決跨域問(wèn)題?

    • 跨域是指在瀏覽器上進(jìn)行非同源請(qǐng)求的行為

      1.因?yàn)闉g覽器處與安全考慮,有同源策略,也就是說(shuō),如果協(xié)議,域名或者端口號(hào)有一個(gè)不同就是跨域,ajax 請(qǐng)求會(huì)失敗

      2.那么是處于什么安全考慮才會(huì)引入這種機(jī)制呢,其實(shí)主要是用來(lái)防止,CSRF 攻擊的, 簡(jiǎn)單點(diǎn)說(shuō) CSRF 攻擊是利用用戶的登入狀態(tài)發(fā)起惡意請(qǐng)求也就是沒(méi)有同源策略的條件下,A網(wǎng)站可以被任意其他來(lái)源的Ajax訪問(wèn)到內(nèi)容,如果你當(dāng)前A 網(wǎng)站還存在登錄態(tài), 那么對(duì)方可以通過(guò)Ajax獲得你的任何信息,當(dāng)然跨域并不能完全阻止CSRF


    怎么解決跨域問(wèn)題?
    JSONP:(只限于get請(qǐng)求)

    script可以把請(qǐng)求內(nèi)容當(dāng)做字符串讀取,解析成js代碼
    src:不受同源策略的影響,只要返回的js代碼正確就可以了

    CORS :
    CORS 需要瀏覽器和后端同時(shí)支持,IE 8 和 9 需要通過(guò) XDomainRequest 來(lái)實(shí)現(xiàn)。
    后端設(shè)置(服務(wù)端) Access-Control-Allow-Origin
    nginx代理跨域

    005.bind call apply 區(qū)別?
  • call、apply和bind都可以改變函數(shù)的this指向
  • call、apply和bind第一個(gè)參數(shù)的是this要指向的對(duì)象
  • call、apply和bind都可以后續(xù)為函數(shù)傳參,apply是將參數(shù)并成一個(gè)數(shù)組,call和bind是將參數(shù)依次列出。
  • call、apply都是直接調(diào)用,bind生成的this指向改變函數(shù)需要手動(dòng)調(diào)用。
  • 詳細(xì)call apply bind 見(jiàn)CSDN網(wǎng)址 :https://blog.csdn.net/weixin_47076989/article/details/107200176

    006.token、cookie、session?
  • token 就是令牌,比如你授權(quán)(登錄) 一個(gè)程序時(shí),他就是一個(gè)依據(jù),判斷你是否已經(jīng)授權(quán)該軟件(最好是身份認(rèn)證,安全性好,且是唯一的) 用戶身份的驗(yàn)證方式
  • cookie 是寫在客戶端的一個(gè) txt文件,里面包括登錄信息之類的,這樣你下次再登錄某個(gè)網(wǎng)站,就會(huì)自動(dòng)調(diào)用cookie 自動(dòng)登錄用戶名服務(wù)器生成,發(fā)送到瀏覽器,瀏覽器保存,下次請(qǐng)求再次發(fā)送給服務(wù)器
  • session 是一類用來(lái)客戶端和服務(wù)器之間保存裝填的解決方案,會(huì)話完成被銷毀
  • 007.sessionStorage 、localStorage 和 cookie ?

    共同點(diǎn):用于瀏覽器端存儲(chǔ)的緩存數(shù)據(jù);
    不同點(diǎn):
    (1)、存儲(chǔ)內(nèi)容是否發(fā)送到服務(wù)器端:當(dāng)設(shè)置了Cookie后,數(shù)據(jù)會(huì)發(fā)送到服務(wù)器端,造成一定的寬帶浪費(fèi);
    web storage,會(huì)將數(shù)據(jù)保存到本地,不會(huì)造成寬帶浪費(fèi);
    (2)、數(shù)據(jù)存儲(chǔ)大小不同:Cookie數(shù)據(jù)不能超過(guò)4K,適用于會(huì)話標(biāo)識(shí);web storage數(shù)據(jù)存儲(chǔ)可以達(dá)到5M;
    (3)、數(shù)據(jù)存儲(chǔ)的有效期限不同:cookie只在設(shè)置了Cookid過(guò)期時(shí)間之前一直有效,即使關(guān)閉窗口或者瀏覽器;
    sessionStorage,僅在關(guān)閉瀏覽器之前有效;localStorage,數(shù)據(jù)存儲(chǔ)永久有效;
    (4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁(yè)面;

    008.安全類?

    1.xss-跨站腳本攻擊

    • XSS(Cross Site Scripting),跨站腳本攻擊。XSS是常見(jiàn)的Web攻擊技術(shù)之一.所謂的跨站腳本攻擊指得是:惡意攻擊者往Web頁(yè)面里注入惡意Script代碼,用戶瀏覽這些網(wǎng)頁(yè)時(shí),就會(huì)執(zhí)行其中的惡意代碼,可對(duì)用戶進(jìn)行盜取cookie信息、會(huì)話劫持等各種攻擊.

      解決方案

    • **輸入過(guò)濾:**永遠(yuǎn)不要相信用戶的輸入,對(duì)用戶輸入的數(shù)據(jù)做一定的過(guò)濾。如輸入的數(shù)據(jù)是否符合預(yù)期的格式,比如日期格式,Email格式,電話號(hào)碼格式等等。這樣可以初步對(duì)XSS漏洞進(jìn)行防御。上面的措施只在web端做了限制,攻擊者通抓包工具如Fiddler還是可以繞過(guò)前端輸入的限制,修改請(qǐng)求注入攻擊腳本。
    • 輸出轉(zhuǎn)義:對(duì)特定字符做轉(zhuǎn)義:用<替換<,用>代替>,用"代替",用’代替’
    009.原型鏈

    每個(gè)實(shí)例對(duì)象( object )都有一個(gè)私有屬性(稱之為 proto )指向它的構(gòu)造函數(shù)的原型對(duì)象(prototype )。該原型對(duì)象也有一個(gè)自己的原型對(duì)象( proto ) ,層層向上直到一個(gè)對(duì)象的原型對(duì)象為 null。根據(jù)定義,null 沒(méi)有原型,并作為這個(gè)原型鏈中的最后一個(gè)環(huán)節(jié) (原型鏈)

    閉包、原型、原型鏈 詳情:https://blog.csdn.net/weixin_47076989/article/details/106932640

    010深淺拷貝?
    • js數(shù)據(jù)類型分為基本數(shù)據(jù)類型復(fù)雜數(shù)據(jù)類型

    • 基本數(shù)據(jù)類型:String、Blooen、Number、undefind、null、

    • 復(fù)雜數(shù)據(jù)類型:Array、Object

    • 在電腦中存儲(chǔ)js數(shù)據(jù)的地方分為棧和堆

    • 基本數(shù)據(jù)類型是存儲(chǔ)在棧里面的,復(fù)雜數(shù)據(jù)類型是存儲(chǔ)在堆里面的,而暴露出來(lái)的是引用地址存在在棧中

      淺拷貝:

      //方法一: var obj1={name:"wangwu" } var obj2=obj1 //方法二: var obj3={...obj1} //方法三: for(var key in obj1){obj4[key]=obj1[key] }

      深拷貝:

      //方法一: var obj1={name:"yeshuai" } var obj2={} var obj2={...obj1} //方法二: var obj3=JSON.parse(JSON.stringify(obj1))
    011.token的原理?
    1. 客戶端輸入用戶名和密碼 2. 服務(wù)端來(lái)驗(yàn)證這個(gè)用戶名和密碼 如果是正確的 會(huì)簽發(fā)一個(gè)token 再把這個(gè) token 返回給客戶端 3. 客戶端把這個(gè)token 存儲(chǔ)起來(lái) 4. 客戶端每次像服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 token 5. 服務(wù)端 然后做比較 如果是驗(yàn)證成功 ,就會(huì)返回客戶端請(qǐng)求的數(shù)據(jù)
    012.解決異步操作的方式
  • 回調(diào)函數(shù)
  • 事件監(jiān)聽
  • Generator函數(shù)
  • Promise
  • Async await
  • 013.JS面向?qū)ο?/strong>

    基本思想是使用對(duì)象,類,繼承,封裝等基本概念來(lái)進(jìn)行程序設(shè)計(jì)

    優(yōu)點(diǎn):

  • 容易維護(hù),
  • 可讀性高縮短了開發(fā)周期
  • 繼承性高,降低重復(fù)工作量
  • 面向?qū)ο笈c面向過(guò)程的區(qū)別

    1、面向過(guò)程代碼復(fù)用性不高,面向?qū)ο髲?fù)用性高

    2、面向過(guò)程是對(duì)步驟進(jìn)行的操作及劃分,面向?qū)ο髣t是以功能去劃分,保證了功能的統(tǒng)一

    014.typeof類型判斷

    typeof 是否能正確判斷類型?instanceof 能正確判斷對(duì)象的原理是什么?

    • typeof 對(duì)于原始類型來(lái)說(shuō),除了 null 都可以顯示正確的類型

      typeof 1 // 'number' typeof '1' // 'string' typeof undefined // 'undefined' typeof true // 'boolean' typeof Symbol() // 'symbol'
    • typeof 對(duì)于對(duì)象來(lái)說(shuō),除了函數(shù)都會(huì)顯示 object,所以說(shuō) typeof 并不能準(zhǔn)確判斷變量到底是什么類型

      typeof [] // 'object' typeof {} // 'object' typeof console.log // 'function'
    • 如果我們想判斷一個(gè)對(duì)象的正確類型,這時(shí)候可以考慮使用 instanceof,因?yàn)閮?nèi)部機(jī)制是通過(guò)原型鏈來(lái)判斷的

      const Person = function() {} const p1 = new Person() p1 instanceof Person // truevar str = 'hello world' str instanceof String // falsevar str1 = new String('hello world') str1 instanceof String // true

      對(duì)于原始類型來(lái)說(shuō),你想直接通過(guò) instanceof來(lái)判斷類型是不行的

    015.字符串的常用方法

    1.計(jì)算字符串的長(zhǎng)度

    • str.length,會(huì)計(jì)算空格數(shù)。

    2.查找字符在字符串中的位置:

    • Str.indexof("要找的字符"),從前往后找,只找第一個(gè),返回值是索引。沒(méi)有找到返回值-1,兼容性很好。
    • Str.lastIndexof("要找的字符"),從后往前找,只找第一個(gè),返回值是索引。沒(méi)有找到返回值-1,兼容性很好。

    3.根據(jù)傳入索引,查找該元素是什么

    • Str.charAt(index)

    4.根據(jù)傳入索引,查找該元素編碼是什么

    • Str.charCodeAt(index)

    5.根據(jù)字符編碼查找該字符

    • String.fromCharCode()

    6.字符串截取的方法

    • Str.slice(start,end)

      • 作用:對(duì)字符串截取,start表示截取的開始元素,end表示截取的截止元素,包前不包后。

      • 返回值:截取的字符串

      • console.log(str.slice(0,4));//0是起始索引,4是結(jié)束索引,不包含4 console.log(str.slice(4));//表示從4到結(jié)束 console.log(str.slice(-3));//表示倒數(shù)第三到最后
    • Str.substr(start,length)

      • 作用:對(duì)字符串截取,start表示截取的開始元素,length表示截取的長(zhǎng)度

      • 返回值:截取的字符串

      • console.log(str.substr(0,2));//從0開始截取2個(gè)console.log(str.substr(2));//從2開始到最后console.log(str.substr(-3,2))//從倒數(shù)第三個(gè),截取2個(gè)
    • str.substring(start,end)

      • 作用:對(duì)字符串進(jìn)行截取
      • 參數(shù):start表示截取開始的索引,end表示截取結(jié)束的索引,end要大于start,不允許負(fù)數(shù)
      • 返回:從start到end的字符串,不包含end

    7.字符串變小寫

    • Str.toLowerCase()

    8.字符串變大寫

    • Str.toUpperCase()

    9.去除前后空格

    • str.trim()
    016.數(shù)組的常用方法

    1.1.增

    • 數(shù)組.unshift(item); 從數(shù)組前面增加一個(gè)元素
      • 作用:從數(shù)組前面增加一個(gè)元素
      • 參數(shù):item要新增的那個(gè)元素
      • 返回值:數(shù)組的長(zhǎng)度
      • 注意點(diǎn):直接在原數(shù)組操作
    • 數(shù)組.push(item)從數(shù)組后面增加一個(gè)元素
      • 作用:從數(shù)組后面增加一個(gè)元素
      • 參數(shù):item要新增的那個(gè)元素
      • 返回值:數(shù)組的長(zhǎng)度
      • 注意點(diǎn):直接在原數(shù)組操作

    1.2.刪

    • 數(shù)組.shift()刪除數(shù)組中的第一個(gè)元素

      • 作用:刪除數(shù)組中的第一個(gè)元素。
      • 返回值:被刪除的那個(gè)元素。
      • 參數(shù):無(wú)
      • 注意:直接在原數(shù)組操作,不會(huì)生成新數(shù)組。
    • 數(shù)組.pop()刪除數(shù)組中的最后一個(gè)元素

      • 作用:刪除數(shù)組中的最后一個(gè)元素
      • 返回值:被刪除的那個(gè)元素。
      • 參數(shù):無(wú)
      • 注意:直接在原數(shù)組操作,不會(huì)生成新數(shù)組。
    • 數(shù)組.splice(start,n):** 從數(shù)組的start位置開始刪除n個(gè)元素

      • 作用:從數(shù)組的start位置開始刪除n個(gè)元素
      • 參數(shù):start表示從哪個(gè)索引開始刪除,n表示要?jiǎng)h除幾個(gè)元素
      • 返回值:被刪除的元素的集合
      • 注意點(diǎn):直接在原數(shù)組操作

      數(shù)組.splice(start,n,.....)從數(shù)組的start位置開始刪除n個(gè)元素,然后再添加什么元素

      • 作用:從數(shù)組的start位置開始刪除n個(gè)元素,新增m個(gè)元素
      • 參數(shù):start表示從哪個(gè)索引開始刪除或者增加,n表示要?jiǎng)h除幾個(gè)元素,后面由m個(gè)參數(shù),就是要增加要數(shù)組中的新元素,從索引是start位置開始增加。
      • 返回值:被刪除的元素的集合
      • 注意點(diǎn):直接在原數(shù)組操作

    1.3.截取

    • 數(shù)組.slice(start,end):從數(shù)組中截取一部分
      • 作用:從數(shù)組中截取一部分
      • 參數(shù):start表示開始截取的索引,end表示結(jié)束截取的索引,包start,不包end,(包前不包后)
      • 返回值:返回一個(gè)新的數(shù)組,包含從 start 到 end (不包括該元素)的 所有元素
      • 注意點(diǎn):返回一個(gè)新數(shù)組,原數(shù)組不變

    1.4.顛倒數(shù)組

    • 數(shù)組.reverse()顛倒數(shù)組
      • 作用:顛倒數(shù)組
      • 參數(shù):無(wú)
      • 返回值:原數(shù)組
      • 注意點(diǎn):直接在原數(shù)組操作

    1.5.連接數(shù)組

    • 數(shù)組1.concat(數(shù)組2,數(shù)組3,......):
      • 作用:用于連接多個(gè)數(shù)組
      • 參數(shù):要被連接的那些數(shù)組
      • 返回值:連接好的新數(shù)組
      • 注意點(diǎn):不在原數(shù)組操作,會(huì)產(chǎn)生新數(shù)組

    1.6.數(shù)組變字符串

    • 數(shù)組.join(“分割符”):把數(shù)組變成字符串
      • 作用:把數(shù)組變成字符串
      • 參數(shù):默認(rèn)是逗號(hào),分隔符
      • 返回值:生成的那個(gè)字符串
      • 注意點(diǎn):不會(huì)改變?cè)瓟?shù)組

    1.7.查詢

    • 數(shù)組.indexof(ele,start)

      • 作用:查找數(shù)組中某個(gè)元素的索引

      • 返回值:如果沒(méi)找到就返回-1,如果找到了就返回該元素的索引值。

      • 參數(shù):第一個(gè)參數(shù)ele是:要查找的那個(gè)元素

        ? 第二個(gè)參數(shù)start:從哪里開始查找,默認(rèn)從零開始找

    • 數(shù)組.lastIndexof(ele,start)

      • 作用:查找數(shù)組中某個(gè)元素的索引

      • 返回值:如果沒(méi)找到就返回-1,如果找到了就返回該元素的索引值。

      • 參數(shù):第一個(gè)參數(shù)ele是:要查找的那個(gè)元素

        ? 第二個(gè)參數(shù)start:從哪里開始查找,默認(rèn)從零開始找

    1.8.數(shù)組排序

    • 數(shù)組.sort(fn);

      • 作用:按照指定規(guī)則進(jìn)行排序

      • 參數(shù):如果不寫參數(shù),默認(rèn)是按照字符編碼的順序進(jìn)行排序,如果寫參數(shù),參數(shù)fn是表示排序 規(guī)則的函數(shù)

      • 返回值:返回值就是拍好序的數(shù)組

      • 注意點(diǎn):直接在原數(shù)組操作

      • 有參數(shù):參數(shù)是表示排序規(guī)則的函數(shù)

      • 示例“

    017.數(shù)組的遍歷

    1.for循環(huán)

    for(var i=0;i<arr.length;i++){console.log(arr[i]) }

    2.for in 循環(huán)

    for( var index in arr){ //固定寫法,arr是要循環(huán)的數(shù)組,index是循環(huán)到的那個(gè)元素的索引 console.log("當(dāng)前循環(huán)到的是第"+index+'個(gè)元素,元素的值是:'+arr[index]) }

    3.forEach()循環(huán)

    數(shù)組.forEach(function(value,index){要循環(huán)執(zhí)行的函數(shù),數(shù)組里面有多少個(gè)元素,該函數(shù)就執(zhí)行多少次console.log("當(dāng)前循環(huán)到的是第"+index+'個(gè)元素,元素的值是:'+value) }) //參數(shù):要循環(huán)執(zhí)行的函數(shù),函數(shù)有兩個(gè)形參,第一個(gè)形參實(shí)循環(huán)到的那個(gè)數(shù)組元素的值,第二個(gè)形參實(shí)循環(huán)到的那個(gè)數(shù)組元素的索引 //注意點(diǎn):不會(huì)改變?cè)瓟?shù)組

    4.map()循環(huán)

    數(shù)組.map(function(value,index){要循環(huán)執(zhí)行的函數(shù),數(shù)組里面有多少個(gè)元素,該函數(shù)就執(zhí)行多少次return value-1 }) //作用:循環(huán)數(shù)組 //參數(shù):要循環(huán)執(zhí)行的函數(shù),函數(shù)有兩個(gè)形參,第一個(gè)形參實(shí)循環(huán)到的那個(gè)數(shù)組元素的值,第二個(gè)形參實(shí)循環(huán)到的那個(gè)數(shù)組元 素的索引 //返回值:整個(gè)map的返回值是每一次循環(huán)的函數(shù)的返回值的集合 //示例: var arr = [23,45,43,78,23,12,46,28,97]; console.log(arr) var newArr = arr.map(function(value,index){return value-1; }) console.log(newArr)//newArr = [22,44,42,77,22,11,45,27,96]

    5.fliter()循環(huán)

    數(shù)組.fliter(function(value,index){//要循環(huán)執(zhí)行的函數(shù),數(shù)組里面有多少個(gè)元素,該函數(shù)就執(zhí)行多少次//符合條件的返回true//不符合條件的返回falseif(value>40){return console.log(true);}else{return false;} }) //作用:過(guò)濾數(shù)組中符合條件的元素,返回值是新的數(shù)組

    6.every()循環(huán)

    數(shù)組.every(function(value,index){//要循環(huán)執(zhí)行的函數(shù),數(shù)組里面有多少個(gè)元素,該函數(shù)就執(zhí)行多少次 }) //作用:判斷數(shù)組中的每一個(gè)元素是否都符合條件,符合返回值true,不符合返回值false //示例: var arr = [1,15,26,48,45,25,14,44] var res = arr.every(function(value,index){return value>30; }) console.log(res)

    7.some()循環(huán)

    數(shù)組.some(function(value,index){//要循環(huán)執(zhí)行的函數(shù),數(shù)組里面有多少個(gè)元素,該函數(shù)就執(zhí)行多少次 }) //作用:判斷數(shù)組中的每一個(gè)元素是否有符合條件,符合返回值true,不符合返回值false //示例: var arr = [1,15,26,48,45,25,14,44] var res = arr.every(function(value,index){return value>30; }) console.log(res)
    018.遍歷對(duì)象

    1.for in()

    • 主要用于遍歷對(duì)象,可枚舉屬性,包括自有屬性,繼承自原型的屬性
    var obj = {"name":"tom","sex":"male"}; Object.defineProperty(obj, "age", {value:"18", enumerable:false});//增加不可枚舉的屬性age Object.prototype.protoPer1 = function(){console.log("name is tom");};//通過(guò)原型鏈增加屬性,為一個(gè)函數(shù) Object.prototype.protoPer2 = 2;通過(guò)原型鏈增加屬性,為一個(gè)整型值2 for(var key in obj){ console.log(key)//['name','sex','protoPer1','protoPer1'] }

    2.Object.keys()

    • Object.keys主要用于遍歷對(duì)象自有的可枚舉屬性,不包括繼承自原型的屬性和不可枚舉的屬性。

      var obj = {"name":"tom","sex":"male"};Object.defineProperty(obj, "age", {value:"18", enumerable:false});//增加不可枚舉的屬性ageObject.prototype.protoPer1 = function(){console.log("name is tom");};//通過(guò)原型鏈增加屬性,為一個(gè)函數(shù)Object.prototype.protoPer2 = 2;通過(guò)原型鏈增加屬性,為一個(gè)整型值2console.log("Object.keys:")console.log(Object.keys(obj));//["name",'sex']

    3.Object.getOwnPropertyNames()

    • Object.getOwnProperty主要用于返回對(duì)象的自有屬性,包括可枚舉和不可枚舉的屬性,不包括繼承自原型的屬性。

      var obj = {"name":"tom","sex":"male"};Object.defineProperty(obj, "age", {value:"18", enumerable:false});//增加不可枚舉的屬性ageObject.prototype.protoPer1 = function(){console.log("name is tom");};//通過(guò)原型鏈增加屬性,為一個(gè)函數(shù)Object.prototype.protoPer2 = 2;通過(guò)原型鏈增加屬性,為一個(gè)整型值2 console.log("Object.getOwnPropertyNames: "); console.log(Object.getOwnPropertyNames(obj));//["name","sex","age"]
    019.怎么判斷一個(gè)對(duì)象為空對(duì)象
    1. 將 json 對(duì)象轉(zhuǎn)化為 json 字符串,在判斷該字符串是否為 {} 2. for in 循環(huán)判斷 3. ES6 的 Object.keys() 方法,返回值也是對(duì)象中屬性名組成的數(shù)
    020.數(shù)組去重

    1.for循環(huán)嵌套,利用splice去重

    function newArr(arr){for(var i=0;i<arr.length;i++){for(var j=i+1;j<arr.length;j++){if(arr[i]==arr[j]){ //如果第一個(gè)等于第二個(gè),splice方法刪除第二個(gè)arr.splice(j,1);j--;}}}return arr; }let a= m.map((item,index,array)=>{console.log(array)}) console.log(a)

    2.建新數(shù)組,利用indexOf去重

    function newArr(array){ //一個(gè)新的數(shù)組 var arrs = []; //遍歷當(dāng)前數(shù)組 for(var i = 0; i < array.length; i++){ //如果臨時(shí)數(shù)組里沒(méi)有當(dāng)前數(shù)組的當(dāng)前值,則把當(dāng)前值push到新數(shù)組里面 if (arrs.indexOf(array[i]) == -1){ arrs.push(array[i])}; } return arrs; }

    3.ES6中利用Set,Array.from去重

    function newArr(arr){return Array.from(new Set(arr)) }

    4.ES6中利用Set,擴(kuò)展運(yùn)算符去重

    function newArr(array){return arr=[new Set(array)] }
    021.阻止事件傳播/阻止瀏覽器默認(rèn)行為

    1.事件捕獲

    event.stopPropagation()

    2.事件冒泡

    event.cancelBubble=false 低版本IE

    3.阻止瀏覽器默認(rèn)行為:火狐/谷歌

    event.preventDefault()

    4.阻止瀏覽器默認(rèn)行為:低版本IE

    event.returnValue=false

    022.ajax
    • ajax的優(yōu)點(diǎn):
    • 頁(yè)面無(wú)刷新更新數(shù)據(jù):ajax最大的優(yōu)點(diǎn)就是能夠在不刷新網(wǎng)頁(yè)的情況下與服務(wù)器通信維護(hù)數(shù)據(jù);
    • 異步與服務(wù)器通信:ajax使用異步方式與服務(wù)器通信 ,不需要打斷用戶的操作,具有更加迅速的響應(yīng)能力;
    • 前端和后端負(fù)載平衡:ajax可以把以前一些服務(wù)端負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本;
    • 基于標(biāo)準(zhǔn)被廣泛支持:ajax基本標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載瀏覽器插件;
    • 界面與應(yīng)用分離:ajax使WEB中的數(shù)據(jù)與呈現(xiàn)分離,有利于分工合作,提高效率。
    • ajax的缺點(diǎn)
    • ajax干掉了Back和History功能:即對(duì)瀏覽器機(jī)制的破壞,在動(dòng)態(tài)頁(yè)面的情況下,用戶無(wú)法回到前面一個(gè)頁(yè)面狀態(tài);
    • ajax有安全問(wèn)題:ajax技術(shù)給用戶帶來(lái)了很好的用戶體驗(yàn)的同時(shí)也帶來(lái)了新的安全威脅,ajax技術(shù)就如同對(duì)企業(yè)數(shù)據(jù)建立了一個(gè)直接的通道;
    • 對(duì)搜索引擎支持較弱:對(duì)搜索引擎優(yōu)化不太好;
    • 破壞程序的異常處理機(jī)制:像Ajax。dll,Ajaxpro.dll這些Ajax框架是會(huì)破壞程序的異常機(jī)制;
    • AJAX不能很好支持移動(dòng)端設(shè)備;

    更全面的 ajax 知識(shí),詳細(xì)見(jiàn)網(wǎng)址 :https://blog.csdn.net/weixin_47076989/article/details/107109094

    023.get/post區(qū)別
    1.語(yǔ)義化不一樣GET傾向于從服務(wù)器獲取數(shù)據(jù)post傾向于從服務(wù)器提交數(shù)據(jù) 2.傳遞參數(shù)的方式GET請(qǐng)求直接在地址欄后邊拼接post請(qǐng)求在請(qǐng)求體里面?zhèn)鬟f 3.參數(shù)大小限制 GET請(qǐng)求一般理論上不大于2KBpost請(qǐng)求理論上沒(méi)有上線 4.緩存能力GET會(huì)被瀏覽器主動(dòng)緩存POST不會(huì)被瀏覽器主動(dòng)緩存 5.安全性能GET請(qǐng)求相對(duì)安全性較低POST請(qǐng)求相對(duì)安全性較高 get/post本質(zhì)上都是tcp連接
    024.async await
    025.函數(shù)this指向
    • this,普通函數(shù)執(zhí)行的時(shí)候產(chǎn)生,箭頭函數(shù)沒(méi)有自己的this,它的this指向上下文中的this(即所處環(huán)境的this)
  • this指向函數(shù)的調(diào)用對(duì)象
  • this指事件的調(diào)用對(duì)象
  • 在構(gòu)造函數(shù)中this指向示例對(duì)象
  • 再prototype原型的方法中,this指向示例對(duì)象、
  • 找不到函數(shù)的調(diào)用的this指向window
  • 箭頭函數(shù)沒(méi)有自己的this,它的this指向上下文中的this(即所處環(huán)境的this)
  • 026.原型:
    • 每一個(gè)函數(shù)對(duì)象(Function.prototype除外)都有一個(gè)prototype屬性(這個(gè)屬性指向一個(gè)對(duì)象即原型)

    三、Vue

    001.Vue 項(xiàng)目?jī)?yōu)化:
    cdn 加速器 路由懶加載 v-if 和 v-show 的選擇使用 圖片懶加載 異步組件 第三方庫(kù)按需引入 瀏覽器緩存
    002.說(shuō)一說(shuō) Vue 響應(yīng)式原理
    • 基于ES5的object.definedProperty() 這個(gè)方法對(duì)數(shù)據(jù)做劫持。劫持?jǐn)?shù)據(jù)的set與get,然后結(jié)合watch監(jiān)聽(發(fā)布訂閱模式)在數(shù)據(jù)發(fā)生變化時(shí),通知頁(yè)面進(jìn)行更新

    特點(diǎn):
    由于ES5的object.definedProperty()這個(gè)方法不兼容 IE8,所以我們的vue的兼容性也是不兼容 IE8 及以下版本

    003.MVVM架構(gòu)思想

    MVVM分為Model、View、ViewModel三者。
    Model 代表數(shù)據(jù)模型,數(shù)據(jù)和業(yè)務(wù)邏輯都在Model層中定義;

  • View 代表UI視圖,負(fù)責(zé)數(shù)據(jù)的展示;
  • ViewModel 負(fù)責(zé)監(jiān)聽 Model 中數(shù)據(jù)的改變并且控制視圖的更新,處理用戶交互操作;
  • Model 和 View 并無(wú)直接關(guān)聯(lián),而是通過(guò) ViewModel 來(lái)進(jìn)行聯(lián)系的,Model 和 ViewModel 之間有著雙向數(shù)據(jù)綁定的聯(lián)系。
  • 這種模式實(shí)現(xiàn)了 Model 和 View 的數(shù)據(jù)自動(dòng)同步,因此開發(fā)者只需要專注對(duì)數(shù)據(jù)的維護(hù)操作即可,而不需要自己操作 dom。
  • 004.解釋單向數(shù)據(jù)流和雙向數(shù)據(jù)綁定
    • 單向數(shù)據(jù)流: 顧名思義,數(shù)據(jù)流是單向的。數(shù)據(jù)流動(dòng)方向可以跟蹤,流動(dòng)單一,追查問(wèn)題的時(shí)候可以更快捷。缺點(diǎn)就是寫起來(lái)不太方便。要使UI發(fā)生變更就必須創(chuàng)建各種 action 來(lái)維護(hù)對(duì)應(yīng)的 state雙向數(shù)據(jù)綁定:數(shù)據(jù)之間是相通的,將數(shù)據(jù)變更的操作隱藏在框架內(nèi)部。優(yōu)點(diǎn)是在表單交互較多的場(chǎng)景下,會(huì)簡(jiǎn)化大量與業(yè)務(wù)無(wú)關(guān)的代碼。缺點(diǎn)就是無(wú)法追蹤局部狀態(tài)的變化,增加了出錯(cuò)時(shí) debug 的難度
    005.hash、history 的區(qū)別?
    • vue-router 默認(rèn)使用 hash 模式,所以在路由加載的時(shí)候,項(xiàng)目中的 url 會(huì)自帶 #。如果不想使用 #, 可以使用 vue-router 的另一種模式 history

    !!!需要注意的是,當(dāng)我們啟用 history 模式的時(shí)候,由于我們的項(xiàng)目是一個(gè)單頁(yè)面應(yīng)用,所以在路由跳轉(zhuǎn)的時(shí)候,就會(huì)出現(xiàn)訪問(wèn)不到靜態(tài)資源而出現(xiàn) 404 的情況,這時(shí)候就需要服務(wù)端增加一個(gè)覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個(gè) index.html 頁(yè)面

    • url 展示上,hash 模式有“#”,history 模式?jīng)]有
    • 刷新頁(yè)面時(shí),hash 模式可以正常加載到 hash 值對(duì)應(yīng)的頁(yè)面,而 history 沒(méi)有處理的話,會(huì)返回 404,一般需要后端將所有頁(yè)面都配置重定向到首頁(yè)路由
    • 兼容性,hash 可以支持低版本瀏覽器和 IE。
    006.常用的Vue 指令有哪些?
    v-model:一般用在表達(dá)輸入,很輕松的實(shí)現(xiàn)表單控件和數(shù)據(jù)的雙向綁定 v-html:更新元素的innerHTML v-show與v-if:條件渲染,注意二者區(qū)別 v-on:click:可以簡(jiǎn)寫為@click,@綁定一個(gè)事件。如果事件觸發(fā)了,就可以指定事件的處理函數(shù) v-for:基于源數(shù)據(jù)多次渲染元素或模板 v-bind:當(dāng)表達(dá)式的值改變時(shí),將其產(chǎn)生的連帶影響,響應(yīng)式地作用于DOM語(yǔ)法 v-bind:title=”msg”簡(jiǎn)寫:title="msg"
    007.常用的Vue 指令有哪些
    v-model:一般用在表達(dá)輸入,很輕松的實(shí)現(xiàn)表單控件和數(shù)據(jù)的雙向綁定 v-html:更新元素的innerHTML v-show與v-if:條件渲染,注意二者區(qū)別 v-on:click:可以簡(jiǎn)寫為@click,@綁定一個(gè)事件。如果事件觸發(fā)了,就可以指定事件的處理函數(shù) v-for:基于源數(shù)據(jù)多次渲染元素或模板 v-bind:當(dāng)表達(dá)式的值改變時(shí),將其產(chǎn)生的連帶影響,響應(yīng)式地作用于DOM語(yǔ)法 v-bind:title=”msg”簡(jiǎn)寫:title="msg"
    008. computed 和 watch 有什么區(qū)別?
  • computed 是計(jì)算屬性,依賴其他屬性計(jì)算值,并且 computed 的值有緩存,只有當(dāng)計(jì)算值變化才會(huì)返回內(nèi)容。
  • watch 監(jiān)聽到值的變化就會(huì)執(zhí)行回調(diào),在回調(diào)中可以進(jìn)行一些邏輯操作。
  • 所以一般來(lái)說(shuō)需要依賴別的屬性來(lái)動(dòng)態(tài)獲得值的時(shí)候可以使用 computed,對(duì)于監(jiān)聽到值的變化需要做一些復(fù)雜業(yè)務(wù)邏輯的情況可以使用 watch。
  • 009. 介紹下 虛擬DOM

    虛擬dom與diff運(yùn)算:

    • 虛擬dom就是一個(gè)json對(duì)象,他用于對(duì)真實(shí)的dom進(jìn)行描述

    diff運(yùn)算:

    • 當(dāng)vue實(shí)例中的數(shù)據(jù)發(fā)生變化時(shí),vue會(huì)獲得一份對(duì)虛擬dom的拷貝,如此我們就有兩份虛擬dom,一份是數(shù)據(jù)變化前的虛擬dom,一份是數(shù)據(jù)變化后的虛擬dom,所謂的diff運(yùn)算就是對(duì)著兩份虛擬dom進(jìn)行差異比較,從而找出他們最小的差異,再把這份最小的差異渲染到真實(shí)dom中去
    • 同級(jí)比較,再比較子節(jié)點(diǎn)
      先判斷一方有子節(jié)點(diǎn)一方?jīng)]有子節(jié)點(diǎn)的情況(如果新的children沒(méi)有子節(jié)點(diǎn),將舊的子節(jié)點(diǎn)移除)
      比較都有子節(jié)點(diǎn)的情況(核心diff)
      遞歸比較子節(jié)點(diǎn)
    010.diff算法
    減少Dom操作 提高組件復(fù)用性 diff運(yùn)算:新的虛擬dom與舊的虛擬dom對(duì)比,找出**最小差異**,發(fā)送給真實(shí)的dom進(jìn)行更新
    011.vue生命周期的理解
    • beforeCreate: vue實(shí)例的掛載元素el和數(shù)據(jù)對(duì)象data都為undefined,還未初始化。
    • created: vue實(shí)例的數(shù)據(jù)對(duì)象data有了,el還沒(méi)有
    • beforeMount: vue實(shí)例的$el和data都初始化了,但還是掛載之前為虛擬的dom節(jié)點(diǎn),data.message還未替換。
    • mounted: vue實(shí)例掛載完成,data.message成功渲染。
    • beforeUpdate: 數(shù)據(jù)更新前調(diào)用
    • Update: 數(shù)據(jù)更新后調(diào)用
    • beforeDestroy:適合移除事件、定時(shí)器等等,否則可能會(huì)引起內(nèi)存泄露的問(wèn)題。
    • destroyed: 進(jìn)行一系列的銷毀操作,如果有子組件的話,也會(huì)遞歸銷毀子組件,所有子組件都銷毀完畢后才會(huì)執(zhí)行

    第一次頁(yè)面加載會(huì)觸發(fā)哪幾個(gè)鉤子?

    • 會(huì)觸發(fā)下面這幾個(gè)beforeCreate、created、beforeMount、mounted

    簡(jiǎn)單描述每個(gè)周期具體適合哪些場(chǎng)景?

    • 生命周期鉤子的一些使用方法: beforecreate : 可以在這加個(gè)loading事件,在加載實(shí)例時(shí)觸發(fā) created : 初始化完成時(shí)的事件寫在這里,如在這結(jié)束loading事件,異步請(qǐng)求也適宜在這里調(diào)用 mounted : 掛載元素,獲取到DOM節(jié)點(diǎn) updated : 如果對(duì)數(shù)據(jù)統(tǒng)一處理,在這里寫上相應(yīng)函數(shù) beforeDestroy : 可以做一個(gè)確認(rèn)停止事件的確認(rèn)框 nextTick : 更新數(shù)據(jù)后立即操作dom;
    012. 組件通信
    父組件向子組件通信 子組件通過(guò) props 屬性,綁定父組件數(shù)據(jù),實(shí)現(xiàn)雙方通信子組件向父組件通信 將父組件的事件在子組件中通過(guò) $emit 觸發(fā)非父子組件、兄弟組件之間的數(shù)據(jù)傳遞
    013.vue-rotuer 路由實(shí)現(xiàn)
    路由的概念就是, 能夠通過(guò)不同的請(qǐng)求地址來(lái)響應(yīng)不同的頁(yè)面或數(shù)據(jù) 視圖: router-view 路由坑 路由匹配到的組件將渲染在這里導(dǎo)航: router-link 路由跳轉(zhuǎn) 相當(dāng)于a標(biāo)簽 沒(méi)有a標(biāo)簽的#號(hào) 而且還自帶樣式 .router-link-active 還有起到跳轉(zhuǎn)作用
    014.v-if 和 v-show 的區(qū)別
    1. v-if 是真正的條件渲染, 默認(rèn)條件為false時(shí)元素不渲染,默認(rèn)條件為true時(shí)元素渲染 條件變?yōu)?span id="ozvdkddzhkzd" class="token boolean">false時(shí)元素會(huì)銷毀,條件變?yōu)?span id="ozvdkddzhkzd" class="token boolean">true時(shí)元素會(huì)重新創(chuàng)建。而 v-show 只是簡(jiǎn)單的去控制元素的css的display屬性。2. v-show 有更高的初始渲染開銷(因?yàn)椴还苣J(rèn)條件為真還是假,都會(huì)渲染出來(lái))v-if 有更高的切換開銷(切換時(shí)做銷毀與重建的操作) 如果需要頻繁切換顯示隱藏使用v-show更好,其余情況使用v-if就好。3. v-if 有 v-else v-else-if 去配套使用。v-show 沒(méi)有,它是孤零零的一個(gè)人4. v-if 能配合 template 元素使用,而 v-show 不能。
    015.Vue組件中 data 為什么必須是函數(shù)?
    • 組件時(shí)可以進(jìn)行復(fù)用的,如果 data直接寫成對(duì)象,復(fù)用的時(shí)候,會(huì)造成數(shù)據(jù)污染 (復(fù)用后影響其他實(shí)例) 因?yàn)閷?duì)象是引用數(shù)據(jù)類型
    • data方法返回一個(gè)對(duì)象作為組件的屬性,這樣做的目的是為了每一個(gè)組件實(shí)例都擁有獨(dú)立的data屬性
    016.vue 等單頁(yè)面應(yīng)用的優(yōu)缺點(diǎn)
    優(yōu)點(diǎn): 良好的交互體驗(yàn) 良好的前后端工作分離模式 減輕服務(wù)器壓力缺點(diǎn): SEO難度較高 前進(jìn)、后退管理 初次加載耗時(shí)多
    017. r o u t e 和 route 和 routerouter的區(qū)別
    • $router 為 VueRouter 實(shí)例,想要導(dǎo)航到不同 URL,則使用 r o u t e r . p u s h 方 法 router.push 方法 router.pushroute 為當(dāng)前 router 跳轉(zhuǎn)對(duì)象里面可以獲取 name 、 path 、 query 、 params 等
    018.NextTick 是做什么的
    • $nextTick 是在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào),在修改數(shù)據(jù)之后使用 $nextTick,則可以在回調(diào)中獲取更新后的 DOM
    019. 計(jì)算屬性computed 和 事件 methods 有什么區(qū)別
    • computed: 計(jì)算屬性是基于它們的依賴進(jìn)行緩存的,只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值對(duì)于 method ,只要發(fā)生重新渲染,method 調(diào)用總會(huì)執(zhí)行該函數(shù)
    020.對(duì)比 jQuery , Vue 有什么不同
    • jQuery 通過(guò)操作 DOM 去實(shí)現(xiàn)頁(yè)面的一些邏輯渲染;
    • Vue 通過(guò)數(shù)據(jù)的雙向綁定,最終表現(xiàn)在 DOM 層面,減少了 DOM 操作Vue 使用了組件化思想,使得項(xiàng)目子集職責(zé)清晰,提高了開發(fā)效率,方便重復(fù)利用,便于協(xié)同開發(fā)
    021.對(duì)keep-alive 的理解

    keep-alive 是 Vue 內(nèi)置的一個(gè)組件,可以使被包含的組件保留狀態(tài),或避免重新渲染

    • 如果你需要在組件切換的時(shí)候,保存一些組件的狀態(tài)防止多次渲染,就可以使用 keep-alive 組件包裹需要保存的組件。
    • 對(duì)于 keep-alive 組件來(lái)說(shuō),它擁有兩個(gè)獨(dú)有的生命周期鉤子函數(shù),分別為 activated 和 deactivated 。用 keep-alive 包裹的組件在切換時(shí)不會(huì)進(jìn)行銷毀,而是緩存到內(nèi)存中并執(zhí)行 deactivated 鉤子函數(shù),命中緩存渲染后會(huì)執(zhí)行 actived 鉤子函數(shù)。
    022.Vue 中 key 的作用
    • key 的特殊屬性主要用在 Vue 的虛擬 DOM 算法,在新舊 nodes 對(duì)比時(shí)辨識(shí) VNodes。如果不使用 key,Vue 會(huì)使用一種最大限度減少動(dòng)態(tài)元素并且盡可能的嘗試修復(fù)/再利用相同類型元素的算法。使用 key,它會(huì)基于 key 的變化重新排列元素順序,并且會(huì)移除 key 不存在的元素。有相同父元素的子元素必須有獨(dú)特的 key。重復(fù)的 key 會(huì)造成渲染錯(cuò)誤
    023.Vue 的核心是什么
    數(shù)據(jù)驅(qū)動(dòng) 組件系統(tǒng)
    024.hash模式與 history模式的區(qū)別?
    1.url 地址表現(xiàn)不同,hash模式有#號(hào),history模式?jīng)]有 2.實(shí)現(xiàn)原理不同 3. 兼容不同 :1.hash模式都可以兼容2.histyory 模式只能兼容到IE10及以上3.history 模式會(huì)出現(xiàn)404 找不到頁(yè)面這種問(wèn)題,需要后端配置相關(guān)的處理才行,而hash 模式?jīng)]有這個(gè)問(wèn)題4.history 模式時(shí),重定向會(huì)有些問(wèn)題 ,需要頁(yè)面的名字叫index.html才行
    025.

    四、React

    001.react 項(xiàng)目?jī)?yōu)化?
    使用代碼分割 實(shí)現(xiàn)代碼分割 讓組件按需加載 優(yōu)化項(xiàng)目 性能 使用 key shouldconmpoentUpdate 組件盡可能的進(jìn)行拆分 傳參優(yōu)化 多組件優(yōu)化
    002.Vue 和 reacat 的區(qū)別?
    相同點(diǎn): 1、 數(shù)據(jù)驅(qū)動(dòng)頁(yè)面,提供響應(yīng)式的視圖組件 2、 都有 virtual DOM 組件化的開發(fā), 通過(guò)props參數(shù)進(jìn)行父子之間組件傳遞數(shù)據(jù),都實(shí)現(xiàn)了 webComponents 規(guī)范 3、 數(shù)據(jù)流動(dòng)單向,都支持服務(wù)端的渲染 SSR 4、 都有支持native的方法, react 有 react native vue有 wexx不同點(diǎn): 1. 數(shù)據(jù)綁定: Vue實(shí)現(xiàn)了雙向的數(shù)據(jù)綁定,react 數(shù)據(jù)流動(dòng)是單向的 2. 數(shù)據(jù)渲染: 大規(guī)模的數(shù)據(jù)渲染, react更快 3. 使用場(chǎng)景: React 配合Redux 架構(gòu)適合大規(guī)模多人協(xié)作復(fù)雜項(xiàng)目,Vue 適合小快 的項(xiàng)目 4. 開發(fā)分格, react推薦做法 jsx+ inline style 把html和css都寫在js了 , vue是采用 webpack +vue-loader 單文件組件格式 html,js,css同一個(gè)文件
    003.React 的特點(diǎn)和優(yōu)勢(shì)?
    1. 聲明式設(shè)計(jì) - React采用聲明范式,可以輕松描述應(yīng)用 2. 高效 - React 通過(guò)對(duì)Dom的模擬(虛擬Dom),最大限度減少與Dom的交互 3. 靈活 - React 可以與一直的庫(kù)或框架很好的配合 4. JSX - JSX 是 JavaScript 的語(yǔ)法擴(kuò)展 5. 組件 - 通過(guò)React構(gòu)建組件,使得代碼更加容易得到復(fù)用,能夠很好的應(yīng)用在大項(xiàng)目的開發(fā)中 6. 單項(xiàng)響應(yīng)的數(shù)據(jù)流 - React 實(shí)現(xiàn)了單項(xiàng)響應(yīng)的數(shù)據(jù)流,從而減少了重復(fù)代碼,這也是它為什么比傳統(tǒng)的綁定更簡(jiǎn)單。
    004.函數(shù)式編程好處:
    1. 代碼簡(jiǎn)潔,開發(fā)快速 2. 接近自然語(yǔ)言,易于理解 3. 更方便的代碼管理 4. 易于"并發(fā)編程“ 5. 代碼的熱升級(jí)
    005.JSX 注意事項(xiàng)
  • 組件首字母是大寫 會(huì)被認(rèn)為是自定義組件,首字母是小寫,會(huì)被認(rèn)為是 原生dom 節(jié)點(diǎn)
  • 組件最外層需要被一個(gè)標(biāo)簽包裹,不能有兄弟節(jié)點(diǎn)
  • return (加上小括號(hào),可以回車)
  • 組件可以嵌套
  • 函數(shù)式寫法class 寫法 (無(wú)狀態(tài)組件的編寫方式 )
  • 注釋的寫法 {這里面寫注釋} {//單行} {/多行/}
  • 樣式
  • class ==> className , for ==> htmlFor(label)
  • 行內(nèi)樣式(facebook 推薦),注意font-size 的寫法
  • 事件
  • 箭頭函數(shù)
  • bind改變this指向
  • ref
  • 給標(biāo)簽設(shè)置ref=“username”
  • 通過(guò)這個(gè)獲取this.refs.username ,ref可以獲取到應(yīng)用的真實(shí)dom
  • 給組件設(shè)置ref=“username”
  • 通過(guò)這個(gè)獲取this.refs.username ,ref可以獲取到應(yīng)用的真實(shí)組件對(duì)象
  • 006.生命周期
    1.初始化階段

    componentWillMount :render之前最后一次修改狀態(tài)的機(jī)會(huì)

    render : 只能訪問(wèn)this.props和 this.state,不允許修改狀態(tài)和Dom 輸出

    componentDidMount :成功render并渲染完成真實(shí)Dom之后觸發(fā),可以修改DOM

    2.運(yùn)行中階段

    componentWillReceiveProps :父組件修改屬性觸發(fā)

    shouldComponentUpdate :返回false會(huì)阻止render調(diào)用

    componentWillUpdate :不能修改屬性和狀態(tài)

    render : 只能訪問(wèn)this.props和 this.state,不允許修改狀態(tài)和Dom 輸出

    componentDidUpdate : 可以修改DOM

    3.銷毀階段

    componentWillUnmount :在刪除這個(gè)組件前進(jìn)行清理操作

    問(wèn)題:

  • componentWillMount ,在ssr中 這個(gè)方法將會(huì)被多次調(diào)用, 所以會(huì)重復(fù)觸發(fā)多遍,同時(shí)在這里如果綁定事件, 將無(wú)法解綁,導(dǎo)致內(nèi)存泄漏 , 變得不夠安全高效逐步廢棄。
  • componentWillReceiveProps 外部組件多次頻繁更新傳入多次不同的 props,會(huì)導(dǎo)致不必要的異步請(qǐng)求。
  • componetWillupdate, 更新前記錄 DOM 狀態(tài), 可能會(huì)做一些處理,與componentDidUpdate相隔時(shí)間如果過(guò)長(zhǎng), 會(huì)導(dǎo)致 狀態(tài)不太信。
  • 解決:

  • getDerivedStateFromProps 第一次的初始化組件以及后續(xù)的更新過(guò)程中(包括自身狀態(tài)更新以及父?jìng)髯? ,返回一個(gè)對(duì)象作為新的state,返回null則說(shuō)明不需要在這里更新state

    static getDerivedStateFromProps(nextProps){if(nextProps.value!==undefined){return{current:nextProps.value}}return null }
  • getSnapshotBeforeUpdate 取代了 componetWillUpdate ,觸發(fā)時(shí)間為update發(fā)生的時(shí)候,在render之后dom渲染之前返回一個(gè)值,作為componentDidUpdate的第三個(gè)參數(shù)

  • 007.react中性能優(yōu)化的方案
  • shouldComponentUpdate
  • 控制組件自身或者子組件是否需要更新,尤其在子組件非常多的情況下, 需要進(jìn)行優(yōu)化
  • PureComponent
  • PureComponent會(huì)幫你 比較新props 跟 舊的props, 新的state和老的state(值相等,或者對(duì)象含有相同的屬性、且屬性值相等 ),決定shouldcomponentUpdate 返回true 或者false, 從而決定要不要呼叫 render function。
  • 注意:如果你的 state 或 props 『永遠(yuǎn)都會(huì)變』,那 PureComponent 并不會(huì)比較快,因?yàn)閟hallowEqual 也需要花時(shí)間。
  • 008.為什么虛擬 dom 會(huì)提高性能?(必考)
  • 虛擬 dom 相當(dāng)于在 js 和真實(shí) dom 中間加了一個(gè)緩存,利用 dom diff 算法避免了沒(méi)有必要的 dom 操作,從而提高性能。
  • 用 JavaScript 對(duì)象結(jié)構(gòu)表示 DOM 樹的結(jié)構(gòu);然后用這個(gè)樹構(gòu)建一個(gè)真正的 DOM 樹,插到文檔當(dāng)中當(dāng)狀態(tài)變更的時(shí)候,重新構(gòu)造一棵新的對(duì)象樹。然后用新的樹和舊的樹進(jìn)行比較,記錄兩棵樹差異把 2 所記錄的差異應(yīng)用到步驟 1 所構(gòu)建的真正的 DOM 樹上,視圖就更新了。
  • 采用虛擬DOM的話,當(dāng)數(shù)據(jù)變化的時(shí)候,只需要局部刷新變化的位置就好了。
    虛擬DOM具有批處理和高效的Diff算法,最終表現(xiàn)在DOM上的修改只是變更的部分,可以保證非常高效的渲染,優(yōu)化性能.
  • 009.區(qū)分Real DOM和Virtual DOM
    real Dom 1. 更新緩慢 2. 可以直接更新 HTML 3. 如果元素更新,則創(chuàng)建新DOM 4. DOM 操作代價(jià)很高 5. 消耗的內(nèi)存較多Virtual DOM 1. 更新更快 2. 無(wú)法直接更新 HTML 3. 如果元素更新,則更新JSX 4. DOM 操作非常簡(jiǎn)單 5. 很少的內(nèi)存消耗
    010.什么是React?
    React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。 React主要用于構(gòu)建UI,很多人認(rèn)為 React 是 MVC 中的 V(視圖)。 React 起源于 Facebook 的內(nèi)部項(xiàng)目,用來(lái)架設(shè) Instagram 的網(wǎng)站,并于 20135 月開源。 React 擁有較高的性能,代碼邏輯非常簡(jiǎn)單,越來(lái)越多的人已開始關(guān)注和使用它。
    011.React 的一些主要特點(diǎn)是:
    React 的一些主要特點(diǎn)是:它提高了應(yīng)用的性能可以方便地在客戶端和服務(wù)器端使用由于JSX ,代碼的可讀性很好使用 React,編寫UI 測(cè)試用例變得非常容易
    012.你怎樣理解“在React中,一切都是組件”這句話
    • 組件是 React 應(yīng)用 UI 的構(gòu)建塊。這些組件將整個(gè) UI 分成小的獨(dú)立并可重用的部分。每個(gè)組件彼此獨(dú)立,而不會(huì)影響 UI 的其余部分。
    013.什么是 Props?
    • Props 是 React 中屬性的簡(jiǎn)寫。它們是只讀組件,必須保持純,即不可變。它們總是在整個(gè)應(yīng)用中從父組件傳遞到子組件。子組件永遠(yuǎn)不能將 prop 送回父組件。這有助于維護(hù)單向數(shù)據(jù)流,通常用于呈現(xiàn)動(dòng)態(tài)生成的數(shù)據(jù)。
    014.react 中的高階函數(shù)
    高階函數(shù)就是一個(gè)純js且沒(méi)有副作用的函數(shù)。 高階組件是一個(gè)純函數(shù),也是容器組件.是參數(shù)為組件,返回值為新組件的函數(shù).高階組件就是一個(gè)函數(shù),且該函數(shù)接受一個(gè)組件作為參數(shù),并返回一個(gè)新的組件的函數(shù)。
    015.react 中的高階函數(shù)
    高階函數(shù)就是一個(gè)純js且沒(méi)有副作用的函數(shù)。 高階組件是一個(gè)純函數(shù),也是容器組件.是參數(shù)為組件,返回值為新組件的函數(shù).高階組件就是一個(gè)函數(shù),且該函數(shù)接受一個(gè)組件作為參數(shù),并返回一個(gè)新的組件的函數(shù)。
    016. 高階組件
    • 高階組件就是一個(gè)函數(shù),且該函數(shù)接受一個(gè)組件作為參數(shù),并返回一個(gè)新的組件。基本上,這是從React的組成性質(zhì)派生的一種模式,我們稱它們?yōu)椤凹儭苯M件, 因?yàn)樗鼈兛梢越邮苋魏蝿?dòng)態(tài)提供的子組件,但它們不會(huì)修改或復(fù)制其輸入組件的任何行為。
    高階函數(shù) : 一個(gè)函數(shù)內(nèi)部返回一個(gè)新的函數(shù),內(nèi)部采用閉包的寫法 var add = x => {return y => {return x+y} }高階組件:(HOC) Higher-Order-Component高階組件本質(zhì)上就是一個(gè)函數(shù),內(nèi)部可以接收一個(gè)組件,然后返回新的組件。例如: React.memo() connect()

    父子通信

  • 父組件通過(guò) props 傳遞數(shù)據(jù)給子組件,子組件通過(guò)調(diào)用父組件傳來(lái)的函數(shù)傳遞數(shù)據(jù)給父組件,這兩種方式是最常用的父子通信實(shí)現(xiàn)辦法
    2.這種父子通信方式也就是典型的單向數(shù)據(jù)流,父組件通過(guò)props 傳遞數(shù)據(jù),子組件不能直接修改props ,而是必須通過(guò)調(diào)用父組件函數(shù)的方式告知父組件修改數(shù)據(jù)
  • 兄弟組件通信:
    對(duì)于這種情況可以通過(guò)共同的父組件來(lái)管理狀態(tài)和事件函數(shù),比如說(shuō)其中一個(gè)兄弟組件調(diào)用父組件傳遞過(guò)來(lái)的事件函數(shù)修改父組件中的狀態(tài),然后父組件將狀態(tài)給另一個(gè)兄弟組件

    跨多層次組件通信:
    如果你使用16.3 以上版本的話,對(duì)于這種情況可以使用 Context API

    任意組件:
    這種方式可以通過(guò)Redux 或者 Event Bus 解決,另外如果你不怕麻煩的話,可以使用這種方式解決上述所有的通信情況

    018. Hoc 高階組件
    • 高階組件和高階函數(shù)就是同一個(gè)東西,我們實(shí)現(xiàn)一個(gè)函數(shù),傳入一個(gè)組件,然后在函數(shù)內(nèi)部再實(shí)現(xiàn)一個(gè)函數(shù)去擴(kuò)展傳入的組件,最后返回一個(gè)新的組件,這就是高階組件的概念,作用就是為了更好的復(fù)用代碼
    019. react中有多少種創(chuàng)建組件的方法?
    ES5組件 React.createElement()類組件 class User extends React.Component {}無(wú)狀態(tài)組件 function User(props) {}高階組件 function Hoc(Child) { }Hocks 組件
    020. jsx 語(yǔ)法糖:
    jsx = javascript xml 語(yǔ)法糖 jsx 變量、對(duì)象 jsx 不是強(qiáng)制的,但jsx讓代碼更具可讀性 jsx 可以嵌套 jsx 中可以使用表達(dá)式,使用方法用 單大括號(hào)進(jìn)行包裹 jsx 語(yǔ)法更接近javascript 而不是html
    021. React組件生命周期的階段是什么?
    React 組件的生命周期有三個(gè)不同的階段:1.初始化階段componentWillMount: rende之前最后一次修改狀態(tài)的機(jī)會(huì)render: 只能訪問(wèn) this.props和 this.state,不允許修改狀態(tài)和DOM 輸出componentDidMount: 成功render并渲染完成真實(shí)DOM 之后觸發(fā)可以修改DOM 2.運(yùn)行中階段componentWillReceiveProps: 父組件修改屬性觸發(fā)shouldComponentUpdata: 返回 false 會(huì)阻止render調(diào)用componentWillUpdate: 不能修改屬性和狀態(tài)render: 只能訪問(wèn)this.props 和this.state , 不允許修改態(tài)和DOM 輸出componentDidUpdate: :可以修改DOM3.銷毀階段componentWillUnmount: 再刪除組件之前進(jìn)行清理操作,比如計(jì)時(shí)器和事件監(jiān)聽器
    022. React 生命周期?

    一些最重要的生命周期方法是:

    componentWillMount 創(chuàng)建實(shí)例前

    render 渲染數(shù)據(jù)

    componentDidMount 創(chuàng)建實(shí)例完成

    componentWillUpdate 更新前

    componentDidUpdate 更新完成 這個(gè)每次都會(huì)重新請(qǐng)求 不會(huì)判斷如果是一樣的就不更新

    shouldcomponentUpdate(nextProps,nextState) nextProps新的值 nextState老的值 這個(gè)可以判斷是否更新 默認(rèn)是true更新 就會(huì)一直更新 不應(yīng)該更新就返回false 這里就是要判斷應(yīng)不應(yīng)該更新 如果更新之后的值和之前的值是一樣的話 就返回 false 不讓他更新了

    componentWillReceiveProps(nextProps) nextProps更改之后的值 這個(gè)生命周期 是在 父組件屬性發(fā)生改變才會(huì)觸發(fā)

    componentWillunmount 銷毀就會(huì)觸發(fā)這個(gè)

    新增生命周期:==========================
    初始化: getDeriveStateFromProps(nextProps,nextState) nextState老數(shù)據(jù) nextProps更新之后的數(shù)據(jù) 使用的時(shí)候要加 static getDerivedStateFromProps(nextProps,nextState)

    更新: getDeriveStateFromProps(nextProps,nextState) nextState老數(shù)據(jù) nextProps更新之后的數(shù)據(jù) 這個(gè)生命周期只要是父組件調(diào)用 setState 就會(huì)走整個(gè)的更新階段,
    getDeriveStateFromProps 這個(gè)生命周期 相當(dāng)于兩個(gè)作用 一個(gè)是初始化的時(shí)候一個(gè)更新就的時(shí)候就是父組件屬性發(fā)生屬性發(fā)生改變就會(huì)觸發(fā)這里

    更新:getSnapshotBeforeUpdate 這個(gè)就是更新之前會(huì)觸發(fā)的 ,但是的話就是先會(huì)執(zhí)行render渲染 然后立馬執(zhí)行 getSnapshotBeforeUpdate 然后這個(gè)必須有返回值 這個(gè)返回值可以在更新完成那個(gè)生命周期的第三個(gè)參數(shù)接收到

    這個(gè)相當(dāng)于有個(gè)快照的感覺(jué),就是一渲染立馬會(huì)記錄那個(gè)狀態(tài),這個(gè)是渲染在更新,會(huì)記錄那個(gè)瞬間的值

    023.受控組件和非受控組件的區(qū)別?
    其值由state控制的輸入表單元素稱為“受控組件”。 其值由真實(shí)DOM控制的輸入表單元素稱為“非受控組件”。
    024. 純函數(shù)?
    原則:不會(huì)改變參數(shù) 相同的輸入一定產(chǎn)生相同的輸出
    025.react 中key的作用是什么?
    • key是React中用于追蹤哪些列表中元素被修改、刪除或者被添加的輔助標(biāo)識(shí)。在diff算法中,key用來(lái)判斷該元素節(jié)點(diǎn)是被移動(dòng)過(guò)來(lái)的還是新創(chuàng)建的元素,減少不必要的元素重復(fù)渲染。
    026.setState
    異步的 首先 setState 的調(diào)用并不會(huì)馬上引起。 state 的改變,并且如果你一次調(diào)用了多個(gè), setState ,那么結(jié)果可能并不如你期待的一樣 可以傳第二個(gè)參數(shù)
    027.通信
    父組件通過(guò) props 傳遞給子組件 子-父 通過(guò) 自定義事件 兄弟組件通信 context 任意組件 redux event Bus
    028.傳入 setState 函數(shù)的第二個(gè)參數(shù)的作用是什么?
    • 因?yàn)閟etState是一個(gè)異步的過(guò)程,所以說(shuō)執(zhí)行完setState之后不能立刻更改state里面的值。如果需要對(duì)state數(shù)據(jù)更改監(jiān)聽,setState提供第二個(gè)參數(shù),就是用來(lái)監(jiān)聽state里面數(shù)據(jù)的更改,當(dāng)數(shù)據(jù)更改完成,調(diào)用回調(diào)函數(shù)。
    029. React 中 refs 的作用是什么
    • refs就想一個(gè)逃生窗,允許我們之間訪問(wèn)dom元素或者組件實(shí)例,可以向組件添加一個(gè)ref屬性的值是一個(gè)回調(diào)函數(shù),它將接受地城dom元素或組件的已掛在實(shí)例,作為第一個(gè)參數(shù)
    030. 在生命周期中的哪一步你應(yīng)該發(fā)起AJAX 請(qǐng)求

    我們應(yīng)該將 AJAX 請(qǐng)求放到 componentDidMount 函數(shù)中執(zhí)行,主要原因有下:

  • React 下一代調(diào)和算法, fiber會(huì)通過(guò)開始或停止渲染的方式優(yōu)化應(yīng)用性能,其會(huì)影響到 componentWillMount 的觸發(fā)次數(shù),對(duì)于 componentWillMount 這個(gè)生命周期函數(shù)的調(diào)用次數(shù)會(huì)變得不確定,react 可能會(huì)對(duì)次頻繁調(diào)用, componentWillMount . 如果我們將AJAX 請(qǐng)求放到 componentWillMount 函數(shù)中,那么顯而易見(jiàn)其會(huì)觸發(fā)多次,自然也就不是好的選擇
  • 如果我們將 AJAX 請(qǐng)求放置在生命周期的其他函數(shù)中,我們并不能保證請(qǐng)求僅在組件掛載完畢后才會(huì)要求響應(yīng),如果我們的數(shù)據(jù)請(qǐng)求在組件掛載之前就完成,并且調(diào)用了 setState 函數(shù)將數(shù)據(jù)添加到組件狀態(tài)中,對(duì)于未掛載的組件則會(huì)報(bào)錯(cuò),而在 componentDidMount 函數(shù)中進(jìn)行AJAX 請(qǐng)求則能有效避免這個(gè)問(wèn)題
  • 031. shouldComponentUpdate 的作用
    • shouldComponentUpdate 允許我們手動(dòng)地判斷是否要進(jìn)行組件更新,根據(jù)組件的應(yīng)用場(chǎng)景設(shè)置函數(shù)的合理返回值能夠幫我們避免不必要的更新
    032.當(dāng)你調(diào)用setState的時(shí)候,發(fā)生了什么事?
    • 當(dāng)調(diào)用 setState 時(shí),React會(huì)做的第一件事情是將傳遞給 setState 的對(duì)象合并到組件的當(dāng)前狀態(tài)。這將啟動(dòng)一個(gè)稱為和解(reconciliation)的過(guò)程。和解(reconciliation)的最終目標(biāo)是以最有效的方式,根據(jù)這個(gè)新的狀態(tài)來(lái)更新UI。 為此,React將構(gòu)建一個(gè)新的 React 元素樹(您可以將其視為 UI 的對(duì)象表示)。

    • 一旦有了這個(gè)樹,為了弄清 UI 如何響應(yīng)新的狀態(tài)而改變,React 會(huì)將這個(gè)新樹與上一個(gè)元素樹相比較( diff )。

    • 通過(guò)這樣做, React 將會(huì)知道發(fā)生的確切變化,并且通過(guò)了解發(fā)生什么變化,只需在絕對(duì)必要的情況下進(jìn)行更新即可最小化 UI 的占用空間。

    033.在 React 當(dāng)中 Element 和 Component 有何區(qū)別?
    • 簡(jiǎn)單地說(shuō),一個(gè) React element 描述了你想在屏幕上看到什么。換個(gè)說(shuō)法就是,一個(gè) React element 是一些 UI 的對(duì)象表示。
    • 一個(gè) React Component 是一個(gè)函數(shù)或一個(gè)類,它可以接受輸入并返回一個(gè) React element t(通常是通過(guò) JSX ,它被轉(zhuǎn)化成一個(gè) createElement 調(diào)用)。
    034. createElement 與 cloneElement 的區(qū)別是什么?
    createElement 函數(shù)式JSX 編譯之后使用的創(chuàng)建 React Element 的函數(shù) , 而cloneElement 則是用于復(fù)制某個(gè)元素并傳入新的Props
    035.redux中間件
    • 中間件提供第三方插件的模式, 自定義攔截 action -> reducer 的過(guò)程,變?yōu)?action -> middewares ->reducer . 這種機(jī)制可以讓我們改表數(shù)據(jù)流。實(shí)現(xiàn)如異步 action 、 action 過(guò)濾、日志輸出,異常報(bào)告等功能

    redux-logger : 提供日志輸出
    redux-thunk : 處理異步操作
    redux-promise : 處理異步操作,actionCreator的返回值是 promise

    036.redux的設(shè)計(jì)思想
    1. web 應(yīng)用是一個(gè)狀態(tài)機(jī), 視圖與狀態(tài)是 -- 對(duì)應(yīng)的 2. 所有的狀態(tài),保存在一個(gè)對(duì)象里面(唯一數(shù)據(jù)源)
    037.redux?

    是一個(gè)應(yīng)用數(shù)據(jù)流框架,集中式管理
    **怎么用:**view調(diào)用 store 的 dispath 接收 action 傳入 store ,reducer 進(jìn)行 state 操作, view 通過(guò) store 提供的 getState 獲取最新的數(shù)據(jù)
    缺點(diǎn): state必須由父組件傳過(guò)來(lái),子組件相關(guān)數(shù)據(jù)更新,父組件會(huì)強(qiáng)制渲染

    038.redux 有什么特點(diǎn)
    1.一個(gè)組件所需要的數(shù)據(jù),必須由父組件傳過(guò)來(lái), 而不能像 flux 中直接從 store取 2.當(dāng)一個(gè)組件相關(guān)數(shù)據(jù)更新時(shí),即使父組件不需要用到這個(gè)組件,父組件還是會(huì)重新 render,可能會(huì)有效率影響,或者需要些復(fù)雜的 shouldComponentUpdate 進(jìn)行判斷
    039.Redux三大原則
    唯一數(shù)據(jù)源:整個(gè)應(yīng)用的state都被存儲(chǔ)到一個(gè)狀態(tài)樹里面,并且這個(gè)狀態(tài)樹,只存在于唯一的store中state 保持只讀狀態(tài):state是只讀的,唯一改變state的方法就是觸發(fā)action,action是一個(gè)用于描述以發(fā)生時(shí)間的普通對(duì)象數(shù)據(jù)改變只能通過(guò)純函數(shù)來(lái)執(zhí)行:使用純函數(shù)來(lái)執(zhí)行修改,為了描述action如何改變state的,你需要編寫reducers
    040.Redux有四個(gè)組成部分
    Redux 由以下組件組成:**store:用來(lái)存儲(chǔ)數(shù)據(jù)** **reducer:真正的來(lái)管理數(shù)據(jù)** **actionCreators:創(chuàng)建action,交由reducer處理** **view: 用來(lái)使用數(shù)據(jù),在這里,一般用react組件來(lái)充當(dāng)**
    041.解釋 Reducer 的作用?
    • Reducers 是純函數(shù),它規(guī)定應(yīng)用程序的狀態(tài)怎樣因響應(yīng) ACTION 而改變。Reducers 通過(guò)接受先前的狀態(tài)和 action 來(lái)工作,然后它返回一個(gè)新的狀態(tài)。它根據(jù)操作的類型確定需要執(zhí)行哪種更新,然后返回新的值。如果不需要完成任務(wù),它會(huì)返回原來(lái)的狀態(tài)。
    042.Store 在 Redux 中的意義是什么?
    • Store 是一個(gè) JavaScript 對(duì)象,它可以保存程序的狀態(tài),并提供一些方法來(lái)訪問(wèn)狀態(tài)、調(diào)度操作和注冊(cè)偵聽器。應(yīng)用程序的整個(gè)狀態(tài)/對(duì)象樹保存在單一存儲(chǔ)中。因此,Redux 非常簡(jiǎn)單且是可預(yù)測(cè)的。我們可以將中間件傳遞到 store 來(lái)處理數(shù)據(jù),并記錄改變存儲(chǔ)狀態(tài)的各種操作。所有操作都通過(guò) reducer 返回一個(gè)新狀態(tài)。
    043.為啥要用 redux?
    1.很多非父子通信需要管理2.緩存后端數(shù)據(jù),減少重復(fù)的后端請(qǐng)求,減輕服務(wù)器壓力,提高用戶體驗(yàn)減少Dom操作 提高組件復(fù)用性
    044.react-redux?
    安裝 : $ cnpm install react-redux -S核心組件:**Provider 提供者 屬性上通過(guò)store將數(shù)據(jù)派給容器組件****connect 用于連接容器組件與UI組件**`connect() 返回一個(gè)函數(shù),函數(shù)參數(shù)接收UI組件,返回容器組件` connect(mapStateToProps,mapDispatchToProps)(ui組件)容器組件內(nèi)部幫你做了 store.subscribe() 的方法訂閱 ? 狀態(tài)變化 ==> 容器組件監(jiān)聽狀態(tài)改變了 ==> 通過(guò)屬性的方式傳給UI組件? 把`store.getState()`的狀態(tài)轉(zhuǎn)化為展示組件的`props`使用
    045.Redux與Flux有何不同?
    046.react性能優(yōu)化是哪個(gè)周期函數(shù)
  • shouldComponentUpdate 這個(gè)方法用來(lái)判斷是否需要調(diào)用render方法重新描繪dom。因?yàn)閐om的描繪非常消耗性能,如果我們能在shouldComponentUpdate方法中能夠?qū)懗龈鼉?yōu)化的dom diff算法,可以極大的提高性能
  • PureComponent 可以判斷組價(jià)更不更新 一樣的就不更新 就是與之前的數(shù)據(jù)是不是一樣, 就是做了判斷組件應(yīng)該更新嗎? 應(yīng)該 true ,不應(yīng)該返回 false
  • 047.虛擬DOM
    虛擬dom相當(dāng)于在js和真實(shí)dom中間加了一個(gè)緩存,利用dom diff算法避免了沒(méi)有必要的dom操作,從而提高性能:具體實(shí)現(xiàn)步驟如下: 用 JavaScript 對(duì)象結(jié)構(gòu)表示 DOM 樹的結(jié)構(gòu);然后用這個(gè)樹構(gòu)建一個(gè)真正的 DOM 樹,插到文檔當(dāng)中 當(dāng)狀態(tài)變更的時(shí)候,重新構(gòu)造一棵新的對(duì)象樹。然后用新的樹和舊的樹進(jìn)行比較,記錄兩棵樹差異 把2所記錄的差異應(yīng)用到步驟1所構(gòu)建的真正的DOM樹上,視圖就更新
    048.diff算法?
    把樹形結(jié)構(gòu)按照層級(jí)分解,只比較同級(jí)元素。 給列表結(jié)構(gòu)的每個(gè)單元添加唯一的key屬性,方便比較。 React 只會(huì)匹配相同 class 的 component(這里面的class指的是組件的名字) 合并操作,調(diào)用 component 的 setState 方法的時(shí)候, React 將其標(biāo)記為 - dirty.到每一個(gè)事件循環(huán)結(jié)束, React 檢查所有標(biāo)記 dirty的 component重新繪制. 選擇性子樹渲染。開發(fā)人員可以重寫shouldComponentUpdate提高diff的性能
    049.react性能優(yōu)化方案
  • shouldComponentUpdate 這個(gè)方法用來(lái)判斷是否需要調(diào)用render方法重新描繪dom。因?yàn)閐om的描繪非常消耗性能,如果我們能在shouldComponentUpdate方法中能夠?qū)懗龈鼉?yōu)化的dom diff算法,可以極大的提高性能
  • PureComponent 可以判斷組價(jià)更不更新 一樣的就不更新 就是與之前的數(shù)據(jù)是不是一樣, 就是做了判斷組件應(yīng)該更新嗎? 應(yīng)該 true ,不應(yīng)該返回 false
  • 050.簡(jiǎn)述flux 思想?
    Flux 的最大特點(diǎn),就是數(shù)據(jù)的"單向流動(dòng)"。Flux 是一種強(qiáng)制單向數(shù)據(jù)流的架構(gòu)模式。它控制派生數(shù)據(jù),并使用具有所有數(shù)據(jù)權(quán)限的中心 store 實(shí)現(xiàn)多個(gè)組件之間的通信。整個(gè)應(yīng)用中的數(shù)據(jù)更新必須只能在此處進(jìn)行。 Flux 為應(yīng)用提供穩(wěn)定性并減少運(yùn)行時(shí)的錯(cuò)誤。用戶訪問(wèn) View View發(fā)出用戶的 Action Dispatcher 收到Action,要求 Store 進(jìn)行相應(yīng)的更新 Store 更新后,發(fā)出一個(gè)"change"事件 View 收到"change"事件后,更新頁(yè)面
    051.Redux 有哪些優(yōu)點(diǎn)?
  • 結(jié)果的可預(yù)測(cè)性 - 由于總是存在一個(gè)真實(shí)來(lái)源,即 store ,因此不存在如何將當(dāng)前狀態(tài)與動(dòng)作和應(yīng)用的其他部分同步的問(wèn)題。
  • 可維護(hù)性 - 代碼變得更容易維護(hù),具有可預(yù)測(cè)的結(jié)果和嚴(yán)格的結(jié)構(gòu)。
  • 服務(wù)器端渲染 - 你只需將服務(wù)器上創(chuàng)建的 store 傳到客戶端即可。這對(duì)初始渲染非常有用,并且可以優(yōu)化應(yīng)用性能,從而提供更好的用戶體驗(yàn)。
  • 開發(fā)人員工具 - 從操作到狀態(tài)更改,開發(fā)人員可以實(shí)時(shí)跟蹤應(yīng)用中發(fā)生的所有事情。
  • 社區(qū)和生態(tài)系統(tǒng) - Redux 背后有一個(gè)巨大的社區(qū),這使得它更加迷人。一個(gè)由才華橫溢的人組成的大型社區(qū)為庫(kù)的改進(jìn)做出了貢獻(xiàn),并開發(fā)了各種應(yīng)用。
  • 易于測(cè)試 - Redux 的代碼主要是小巧、純粹和獨(dú)立的功能。這使代碼可測(cè)試且獨(dú)立。
  • 組織 - Redux 準(zhǔn)確地說(shuō)明了代碼的組織方式,這使得代碼在團(tuán)隊(duì)使用時(shí)更加一致和簡(jiǎn)單。
  • 052.Hooks?
    hooks 他是一組函數(shù)api 解決問(wèn)題: 類組件 (無(wú)狀態(tài)組件) hooks 讓類組件可以擁有 state, 生命周期等特性
    053.狀態(tài)提升?
    • 如果多個(gè)組件需要反映相同的變化數(shù)據(jù),建議將共享狀態(tài)提升到最近的共同父組件中去,從而依靠自上而下的數(shù)據(jù)流,而不是嘗試在不同組件間同步 state
    054.高階組件(higher order component)
    • 高階組件是一個(gè)以組件為參數(shù)并返回一個(gè)新組件的函數(shù)。HOC 運(yùn)行你重用代碼、邏輯和引導(dǎo)抽象。最常見(jiàn)的可能是 Redux 的 connect 函數(shù)。除了簡(jiǎn)單分享工具庫(kù)和簡(jiǎn)單的組合,HOC 最好的方式是共享 React 組件之間的行為。如果你發(fā)現(xiàn)你在不同的地方寫了大量代碼來(lái)做同一件事時(shí),就應(yīng)該考慮將代碼重構(gòu)為可重用的 HOC。
    055.State和props的區(qū)別
    • state 和 props都直接和組件的UI渲染有關(guān),它們的變化都會(huì)觸發(fā)組件重新渲染,
    • 但props對(duì)于使用它的組件來(lái)說(shuō)是只讀的,是通過(guò)父組件傳遞過(guò)來(lái)的,要想修改props,只能在父組件中修改;而state是組件內(nèi)部自己維護(hù)的狀態(tài),是可變的

    五、微信小程序

    六、其他

    001.一次完整的HTTP事務(wù)是怎么一個(gè)過(guò)程?
    • 域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶
    002.HTTPS是如何實(shí)現(xiàn)加密?
  • HTTP 協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議):是客戶端瀏覽器或其他程序與Web服務(wù)器之間的應(yīng)用層通信協(xié)議 。
  • https是一種http與SSL證書共同協(xié)作構(gòu)建的網(wǎng)絡(luò)協(xié)議,https優(yōu)勢(shì)就在于能夠保證網(wǎng)絡(luò)傳輸高效的同時(shí),可以很好的維護(hù)網(wǎng)絡(luò)傳輸過(guò)程的安全。
  • 如何進(jìn)行https加密?這涉及到了對(duì)SSL證書的申請(qǐng),不同類型的網(wǎng)站所需的SSL證書類型不同,申請(qǐng)這一數(shù)字證書需要想數(shù)字證書頒發(fā)機(jī)構(gòu)驗(yàn)證域名的所有權(quán)以及公司相關(guān)的信息,這也是為什么網(wǎng)站部署了SSL證書之后就擁有了一個(gè)安全可信的形象。完成申請(qǐng)之后,根據(jù)申請(qǐng)證書的教程,完成下載以及安裝。這就實(shí)現(xiàn)了對(duì)http到https的轉(zhuǎn)變,即完成了https加密。
  • 003.瀏覽器是如何渲染頁(yè)面的?
    先簡(jiǎn)要概述瀏覽器渲染的步驟:1.處理HTML標(biāo)記并構(gòu)建DOM2.處理CSS標(biāo)記并構(gòu)建CSSOM3.DOMCSSOM合并成一個(gè)渲染樹 4.根據(jù)渲染樹來(lái)布局,計(jì)算每個(gè)節(jié)點(diǎn)的布局信息 5.將各個(gè)節(jié)點(diǎn)繪制到屏幕上
    004.響應(yīng)式布局原理?
    • 響應(yīng)式布局指的是同一頁(yè)面在不同屏幕尺寸下有不同的布局。傳統(tǒng)的開發(fā)方式是PC端開發(fā)一套,手機(jī)端再開發(fā)一套,而使用響應(yīng)式布局只要開發(fā)一套就夠,缺點(diǎn)就是CSS比較重。

    響應(yīng)式設(shè)計(jì)與自適應(yīng)設(shè)計(jì)的區(qū)別:

    • 響應(yīng)式開發(fā)一套界面,通過(guò)檢測(cè)視口分辨率,針對(duì)不同客戶端在客戶端做代碼處理,來(lái)展現(xiàn)不同的布局和內(nèi)容;自適應(yīng)需要開發(fā)多套界面,通過(guò)檢測(cè)視口分辨率,來(lái)判斷當(dāng)前訪問(wèn)的設(shè)備是pc端、平板、手機(jī),從而請(qǐng)求服務(wù)層,返回不同的頁(yè)面。
    005.http協(xié)議和tcp協(xié)議?
    • TCP是傳輸層協(xié)議,定義數(shù)據(jù)傳輸和連接方式的規(guī)范。握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù).
    • HTTP 超文本傳送協(xié)議(Hypertext Transfer Protocol )是應(yīng)用層協(xié)議,定義的是傳輸數(shù)據(jù)的內(nèi)容的規(guī)范。
    • HTTP協(xié)議中的數(shù)據(jù)是利用TCP協(xié)議傳輸?shù)?#xff0c;特點(diǎn)是客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),它是TCP協(xié)議族中的一種,默認(rèn)使用 TCP 80端口。
    • 好比網(wǎng)絡(luò)是路,TCP是跑在路上的車,HTTP是車上的人。每個(gè)網(wǎng)站內(nèi)容不一樣,就像車上的每個(gè)人有不同的故事一樣。
    006.如何對(duì)網(wǎng)站的文件和資源進(jìn)行優(yōu)化?
    1、文件合并(目的是減少http請(qǐng)求) 2、文件壓縮(目的是直接減少文件下載的體積) 3、使用cdn托管資源 4、使用緩存 5、gizp壓縮你的js和css文件 6、meta標(biāo)簽優(yōu)化(title,description,keywords)、heading標(biāo)簽的優(yōu)化、alt優(yōu)化 7、反向鏈接,網(wǎng)站外鏈接優(yōu)化
    007.你對(duì)web標(biāo)準(zhǔn)和W3C重要性的理解?
    • web標(biāo)準(zhǔn)簡(jiǎn)單來(lái)說(shuō)可以分為結(jié)構(gòu)、表現(xiàn)和行為。其中結(jié)構(gòu)主要是有HTML標(biāo)簽組成?;蛟S通俗點(diǎn)說(shuō),在頁(yè)面body里面我們寫入的標(biāo)簽都是為了頁(yè)面的結(jié)構(gòu)。表現(xiàn)即指css樣式表,通過(guò)css可以是頁(yè)面的結(jié)構(gòu)標(biāo)簽更具美感。行為是指頁(yè)面和用戶具有一定的交互,同時(shí)頁(yè)面結(jié)構(gòu)或者表現(xiàn)發(fā)生變化,主要是有js組成。

    • web標(biāo)準(zhǔn)一般是將該三部分獨(dú)立分開,使其更具有模塊化。但一般產(chǎn)生行為時(shí),就會(huì)有結(jié)構(gòu)或者表現(xiàn)的變化,也使這三者的界限并不那么清晰。

    • W3C對(duì)web標(biāo)準(zhǔn)提出了規(guī)范化的要求,也就是在實(shí)際編程中的一些代碼規(guī)范:
      1.對(duì)于結(jié)構(gòu)要求:(標(biāo)簽規(guī)范可以提高搜索引擎對(duì)頁(yè)面的抓取效率,對(duì)SEO很有幫助)

      • 標(biāo)簽字母要小寫
      • 標(biāo)簽要閉合
      • 標(biāo)簽不允許隨意嵌套

      2.對(duì)于css和js來(lái)說(shuō)

    • 盡量使用外鏈css樣式表和js腳本。是結(jié)構(gòu)、表現(xiàn)和行為分為三塊,符合規(guī)范。同時(shí)提高頁(yè)面渲染速度,提高用戶的體驗(yàn)。
    • 樣式盡量少用行間樣式表,使結(jié)構(gòu)與表現(xiàn)分離,標(biāo)簽的id和class等屬性命名要做到見(jiàn)文知義,標(biāo)簽越少,加載越快,用戶體驗(yàn)提高,代碼維護(hù)簡(jiǎn)單,便于改版
      不需要變動(dòng)頁(yè)面內(nèi)容,便可提供打印版本而不需要復(fù)制內(nèi)容,提高網(wǎng)站易用性。
    008.http的幾種請(qǐng)求方法和區(qū)別?

    HTTP協(xié)議是一個(gè)廣泛應(yīng)用的Internet協(xié)議。在其中有8個(gè)不同的請(qǐng)求方法:
    GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT
    GET:向特定的資源發(fā)出請(qǐng)求。
    POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。

    009.瀏覽器緩存機(jī)制?

    緩存策略的分類:

  • 強(qiáng)緩存
  • 協(xié)商緩存
  • 對(duì)于強(qiáng)緩存,瀏覽器在第一次請(qǐng)求的時(shí)候,會(huì)直接下載資源,然后緩存在本地,第二次請(qǐng)求的時(shí)候,直接使用緩存。
    對(duì)于協(xié)商緩存,第一次請(qǐng)求緩存且保存緩存標(biāo)識(shí)與時(shí)間,重復(fù)請(qǐng)求向服務(wù)器發(fā)送緩存標(biāo)識(shí)和最后緩存時(shí)間,服務(wù)端進(jìn)行校驗(yàn),如果失效則使用緩存

    010.http 狀態(tài)碼?
    1XX:信息狀態(tài)碼100 Continue 繼續(xù),一般在發(fā)送post請(qǐng)求時(shí),已發(fā)送了http header之后服務(wù)端將返回此信息, 表示確認(rèn),之后發(fā)送具體參數(shù)信息 2XX:成功狀態(tài)碼200 OK 正常返回信息201 Created 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源202 Accepted 服務(wù)器已接受請(qǐng)求,但尚未處理 3XX:重定向301 Moved Permanently 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。302 Found 臨時(shí)性重定向。303 See Other 臨時(shí)性重定向,且總是使用 GET 請(qǐng)求新的 URI。304 Not Modified 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。 4XX:客戶端錯(cuò)誤400 Bad Request 服務(wù)器無(wú)法理解請(qǐng)求的格式,客戶端不應(yīng)當(dāng)嘗試再次使用相同的內(nèi)容發(fā)起請(qǐng)求。401 Unauthorized 請(qǐng)求未授權(quán)。403 Forbidden 禁止訪問(wèn)。404 Not Found 找不到如何與 URI 相匹配的資源。 5XX: 服務(wù)器錯(cuò)誤500 Internal Server Error 最常見(jiàn)的服務(wù)器端錯(cuò)誤。503 Service Unavailable 服務(wù)器端暫時(shí)無(wú)法處理請(qǐng)求(可能是過(guò)載或維護(hù))
    011.說(shuō)說(shuō)從輸入U(xiǎn)RL到看到頁(yè)面發(fā)生的全過(guò)程?
    瀏覽器根據(jù)請(qǐng)求的URL 交給 DNS 域名解析,找到真實(shí)IP, 向服務(wù)器發(fā)起請(qǐng)求; 服務(wù)器交給后臺(tái)處理完成后返回?cái)?shù),瀏覽器接受文件(HTML.JS,CSS 圖像等) 瀏覽器對(duì)加載到的資源(HTML、JS、CSS等)進(jìn)行語(yǔ)法解析,建立相應(yīng)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如HTMLDOM); 載入解析到的資源文件,渲染頁(yè)面,完成。 ----------------------------------------------- 1、瀏覽器的地址欄輸入URL并按下回車。 2、瀏覽器查找當(dāng)前URLDNS緩存記錄。 3DNS解析URL對(duì)應(yīng)的IP。 4、根據(jù)IP建立TCP連接(三次握手)。 5、HTTP發(fā)起請(qǐng)求。 6、服務(wù)器處理請(qǐng)求,瀏覽器接收HTTP響應(yīng)。 7、渲染頁(yè)面,構(gòu)建DOM樹。 8、關(guān)閉TCP連接(四次揮手)
    012.http 與 https 的區(qū)別?
    為了數(shù)據(jù)傳輸?shù)陌踩?#xff0c; HTTPSHTTP 的基礎(chǔ)上加入SSL協(xié)議,SSL 依靠證書來(lái)驗(yàn)證服務(wù)器的身份, 并未瀏覽器和服務(wù)器之間的通信加密http 是超文本傳輸協(xié)議,信息是明文傳輸, https 則是具有安全性的 ssl 加密傳輸協(xié)議http 的連接很簡(jiǎn)單, 是無(wú)狀態(tài)的; https 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸,身份認(rèn)證的網(wǎng)絡(luò)協(xié)議, 比 http 協(xié)議安全
    013.什么是內(nèi)存 ?
    就是該內(nèi)存空間使用了 但是沒(méi)有回收 所以導(dǎo)致了泄漏 以下會(huì)造成內(nèi)存泄漏:1)意外的全局變量引起的內(nèi)存泄露。 (2)閉包引起的內(nèi)存泄露。 (3)沒(méi)有清理的DOM元素引用。 (4)被遺忘的定時(shí)器或者回調(diào) (5)子元素存在引起的內(nèi)存泄露
    014.兼容問(wèn)題?
    • png24位的圖片在iE6瀏覽器上出現(xiàn)背景,解決方案是做成PNG8
    • 瀏覽器默認(rèn)的margin和paddin不同。解決方案是body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{margin:00;padding:000;}
    • IE下,event對(duì)象有x,y屬性,但是沒(méi)有pageX,pageY屬性
    • Firefox下,event對(duì)象有pageX,pageY屬性,但是沒(méi)有x,y屬性.
    015.說(shuō)說(shuō)移動(dòng)端是如何調(diào)試的?
    (1)模擬手機(jī)調(diào)試 (2)真機(jī)調(diào)試之a(chǎn)ndroid手機(jī)+Chrome (3)真機(jī)調(diào)試之 iphone+ safari ⑷UC瀏覽器 (1)微信內(nèi)置瀏覽器調(diào)試 (2)debuggap (3)抓包
    016.項(xiàng)目測(cè)試沒(méi)問(wèn)題。但是放到線上就有問(wèn)題了,你是怎么分析解決的?
    可能的原因: (1)后端原因:后端接口,后端服務(wù)器 (2)域名、IP和路徑問(wèn)題 (3)網(wǎng)絡(luò)環(huán)境問(wèn)題 (4)線上庫(kù)、框架、工具的版本和本地不—致問(wèn)題 (5)線上和本地?cái)?shù)據(jù)資源不—致問(wèn)題 (6)程序bug
    017.對(duì)前端界面工程師這個(gè)職位是怎么樣理解的?
    1. 前端是最貼近用戶的程序員,前端的能力就是能讓產(chǎn)品從 90分進(jìn)化到 100 分,甚至更好 2. 參與項(xiàng)目,快速高質(zhì)量完成實(shí)現(xiàn)效果圖,精確到1px; 3. 與團(tuán)隊(duì)成員,UI設(shè)計(jì),產(chǎn)品經(jīng)理的溝通; 4. 做好的頁(yè)面結(jié)構(gòu),頁(yè)面重構(gòu)和用戶體驗(yàn); 5. 處理hack,兼容、寫出優(yōu)美的代碼格式; 6. 針對(duì)服務(wù)器的優(yōu)化、擁抱最新前端技術(shù)。
    018.說(shuō)一下瀏覽器的緩存機(jī)制?
    • 瀏覽器緩存機(jī)制有兩種,一種為強(qiáng)緩存,一種為協(xié)商緩存
      • 對(duì)于強(qiáng)緩存,瀏覽器在第一次請(qǐng)求的時(shí)候,會(huì)直接下載資源,然后緩存在本地,第二次請(qǐng)求的時(shí)候,直接使用緩存。
      • 對(duì)于協(xié)商緩存,第一次請(qǐng)求緩存且保存緩存標(biāo)識(shí)與時(shí)間,重復(fù)請(qǐng)求向服務(wù)器發(fā)送緩存標(biāo)識(shí)和最后緩存時(shí)間,服務(wù)端進(jìn)行校驗(yàn),如果失效則使用緩存
    019.Tcp連接: TCP 三次握手/Tcp 四次揮手
    第一次握手,由瀏覽器發(fā)起,告訴服務(wù)器,我要發(fā)起請(qǐng)求了, 第二次握手,由服務(wù)器發(fā)起,告訴瀏覽器我準(zhǔn)備接受了,你發(fā)送吧 第三次握手,由瀏覽器發(fā)送,告訴服務(wù)器,我馬上發(fā)送了準(zhǔn)備接受吧第一次揮手, 瀏覽器發(fā)起,發(fā)送給服務(wù)器 ,我東西發(fā)送完了,你準(zhǔn)備關(guān)閉吧 第二次揮手,服務(wù)器發(fā)送,告訴瀏覽器,我東西接收完了(請(qǐng)求報(bào)文) 我準(zhǔn)備關(guān)閉了 你也準(zhǔn)備吧 第三個(gè)揮手, 服務(wù)器發(fā)起,告訴瀏覽器,我東西發(fā)送完了,(響應(yīng)報(bào)文) 我準(zhǔn)備關(guān)閉了 你也準(zhǔn)備吧 第四次揮手, 瀏覽器發(fā)起,告訴瀏覽器,我東西接受完了,我準(zhǔn)備關(guān)閉,你也準(zhǔn)備吧
    020.怎么用css 實(shí)現(xiàn)一個(gè)三角形?
    /* 把上、左、右三條邊隱藏掉(顏色設(shè)為 transparent) */ #demo {width: 0;height: 0;border-width: 20px;border-style: solid;border-color: transparent transparent red transparent; }// 給其他三個(gè)邊框都設(shè)為 透明 div {width: 0 ; height: 0 ;border: 100px solid red;border-right-color: transparent;border-bottom-color: transparent;border-left-color: transparent; }
    021.介紹一下 webpack
    • webpack是一個(gè)前端模塊化打包工具,主要由入口,出口,loader,plugins四個(gè)部分。前端的打包工具還有一個(gè)gulp,不過(guò)gulp側(cè)重于前端開發(fā)的過(guò)程,而webpack側(cè)重于模塊,例如他會(huì)將css文件看作一個(gè)模塊,通過(guò)css-loader將css打包成符合css的靜態(tài)資源。
    022.HTTP2.0

    總結(jié)

    以上是生活随笔為你收集整理的整理的最新的前端面试题必问集锦 (持续更新)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。