前端面試3

1.::before 和 :after中雙冒號(hào)和單冒號(hào) 有什么區(qū)別?解釋一下這2個(gè)偽元素的作用
經(jīng)常會(huì)遇到的的偽元素有:::before, ::after(在CSS3中唯一引入的偽元素是::selection),偽類包括::focus, :hover, :link。
在css2中,對(duì)兩者沒(méi)有特別的區(qū)分,單冒號(hào)和雙冒號(hào)都可以;css3中的偽元素需要用雙冒號(hào)表示。
2.script中的async defer:

  • <script src="script.js"></script>
    沒(méi)有 defer 或 async,瀏覽器會(huì)立即加載并執(zhí)行指定的腳本,“立即”指的是在渲染該 script 標(biāo)簽之下的文檔元素之前,也就是說(shuō)不等待后續(xù)載入的文檔元素,讀到就加載并執(zhí)行。
  • <script async src="script.js"></script>
    有 async,加載和渲染后續(xù)文檔元素的過(guò)程將和 script.js 的加載與執(zhí)行并行進(jìn)行(異步)。
  • <script defer src="myscript.js"></script>
    有 defer,加載后續(xù)文檔元素的過(guò)程將和 script.js 的加載并行進(jìn)行(異步),但是 script.js 的執(zhí)行要在所有元素解析完成之后,DOMContentLoaded 事件觸發(fā)之前完成。

3.CSS中 link 和@import 的區(qū)別是?

  • link屬于HTML標(biāo)簽,而@import是CSS提供的;
  • 頁(yè)面被加載的時(shí),link會(huì)同時(shí)被加載,而@import引用的CSS會(huì)等到頁(yè)面被加載完再加載;
  • import只在IE5以上才能識(shí)別,而link是HTML標(biāo)簽,無(wú)兼容問(wèn)題;
  • link方式的樣式的權(quán)重 高于@import的權(quán)重.

@import 的不推薦原因:link混合@import會(huì)破壞并行下載,這是一個(gè)很嚴(yán)重的問(wèn)題,這會(huì)導(dǎo)致原本并行下載的樣式變成一個(gè)一個(gè)的同步下載
4.BFC
參考1
參考2

BFC全稱”Block Formatting Context”, 中文為“塊級(jí)格式化上下文”。

Formatting Context:指頁(yè)面中的一個(gè)渲染區(qū)域,并且擁有一套渲染規(guī)則,他決定了其子元素如何定位,以及與其他元素的相互關(guān)系和作用。

BFC:塊級(jí)格式化上下文,它是指一個(gè)獨(dú)立的塊級(jí)渲染區(qū)域,只有Block-level BOX參與,該區(qū)域擁有一套渲染規(guī)則來(lái)約束塊級(jí)盒子的布局,且與區(qū)域外部無(wú)關(guān)。(不嚴(yán)謹(jǐn)?shù)恼f(shuō)只有 塊元素 參與)

BFC的生成(滿足以下條件之一):

  • 根元素
  • float的值不為none
  • overflow的值不為visible
  • display的值為inline-block、flex、 inline-flex、table-cell、table-caption
  • position的值為absolute或fixed

BFC的約束規(guī)則:

  • 生成BFC元素的子元素會(huì)一個(gè)接一個(gè)的放置。垂直方向上他們的起點(diǎn)是一個(gè)包含塊的頂部,兩個(gè)相鄰子元素之間的垂直距離取決于元素的margin特性。在BFC中相鄰的塊級(jí)元素外邊距會(huì)折疊。
  • 生成BFC元素的子元素中,每一個(gè)子元素做外邊距與包含塊的左邊界相接觸,(對(duì)于從右到左的格式化,右外邊距接觸右邊界),即使浮動(dòng)元素也是如此(盡管子元素的內(nèi)容區(qū)域會(huì)由于浮動(dòng)而壓縮),除非這個(gè)子元素也創(chuàng)建了一個(gè)新的BFC(如它自身也是一個(gè)浮動(dòng)元素)。

通俗的解釋就是:

  • 內(nèi)部的Box會(huì)在垂直方向上一個(gè)接一個(gè)的放置
  • 垂直方向上的距離由margin決定。(完整的說(shuō)法是:屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊,與方向無(wú)關(guān)。)
  • 每個(gè)元素的左外邊距與包含塊的左邊界相接觸(從左向右),即使浮動(dòng)元素也是如此。(這說(shuō)明BFC中子元素不會(huì)超出他的包含塊,而position為absolute的元素可以超出他的包含塊邊界)
  • BFC的區(qū)域不會(huì)與float的元素區(qū)域重疊
    計(jì)算BFC的高度時(shí),浮動(dòng)子元素也參與計(jì)算
    BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面元素,反之亦然

看到以上的幾條約束,讓我想起學(xué)習(xí)css時(shí)的幾條規(guī)則

  • Block元素會(huì)擴(kuò)展到與父元素同寬,所以block元素會(huì)垂直排列
  • 垂直方向上的兩個(gè)相鄰DIV的margin會(huì)重疊,而水平方向不會(huì)(此規(guī)則并不完全正確)
  • 浮動(dòng)元素會(huì)盡量接近往左上方(或右上方)
  • 為父元素設(shè)置overflow:hidden或浮動(dòng)父元素,則會(huì)包含浮動(dòng)元素
    5.margin重疊
    CSS CSS 外邊距(margin)重疊及防止方法
    CSS外邊距合并的問(wèn)題

margin重疊計(jì)算方法:()

  • 全部都為正值,取最大者(1, 2 , 3 中 取 3)
  • 不全是正值,則取絕對(duì)值,然后 最大的正邊界 減去 絕對(duì)值最大的負(fù)邊界 ([1, 2, 6] 和 [ -1, -3, -9] 中 取 6 - |-9| 的值);
  • 沒(méi)有正值,則都取絕對(duì)值,然后用0減去最大值。(-1, -2 , -3 中 取 -3)

注意:

  • 水平邊距永遠(yuǎn)不會(huì)重合
  • BFC后,消除了margin重疊
  • 根元素的垂直margin不會(huì)被重疊
  • float : 相鄰的盒模型中,如果其中的一個(gè)是浮動(dòng)的(float),垂直margin不會(huì)重疊,并且浮動(dòng)的盒模型和它的子元素之間也是這樣。
  • overflow : 設(shè)置了overflow屬性的元素和它的子元素之間的margin不被重疊(overflow取值為visible除外)
  • position : 設(shè)置了絕對(duì)定位(position:absolute)的盒模型,垂直margin不會(huì)被重疊,并且和他們的子元素之間也是一樣。
  • display : 設(shè)置了display:inline-block的元素,垂直margin不會(huì)重疊,甚至和他們的子元素之間也是一樣。

防止外邊距重疊解決方案:

  • 外層元素padding代替
  • 內(nèi)層元素透明邊框 border:1px solid transparent;
  • 內(nèi)層元素絕對(duì)定位 postion:absolute:
  • 外層元素 overflow:hidden;
  • 內(nèi)層元素 加float:left;或display:inline-block;
  • 內(nèi)層元素padding:1px;

6.js異步編程的4種方法

  • 回調(diào)函數(shù)
  • 事件監(jiān)聽(tīng)
  • 發(fā)布/訂閱
  • Promises對(duì)象

單線程
如何自定義事件

dom.addEventListener('自定義事件',function(){
  console.log('自定義事件');
});

var eve = new Event('自定義事件');
dom.dispatchEvent(eve);

寫(xiě)一個(gè)promise

var promise = new Promise(function(resolve, reject) {
 if (/* 異步操作成功 */){
 resolve(value);
 } else {
 reject(error);
 }
});

promise.then(function(value) {
 // success
}, function(value) {
 // failure
});

同時(shí)發(fā)送多個(gè)請(qǐng)求:關(guān)于promises,你理解了多少?

其它:

寫(xiě)一個(gè)原生ajax

//var xhr=new ActiveXObject()(IE5/IE6使用,現(xiàn)在基本不用)
var xhr= new XMLHttpRequest(); // 新建XMLHttpRequest對(duì)象

xhr.onreadystatechange = function () { // 狀態(tài)發(fā)生變化時(shí),函數(shù)被回調(diào)
    if (xhr.readyState === 4) { // 成功完成
        // 判斷響應(yīng)結(jié)果:
        if (xhr.status === 200) {
            // 成功
        } else {
            // 失敗
        }
    } else {
        // HTTP請(qǐng)求還在繼續(xù)...
    }
}

// 發(fā)送請(qǐng)求:
xhr.open('GET', 'url','true(異步)或 false(同步)');
xhr.send();

7.虛擬DOM
實(shí)現(xiàn)虛擬 DOM 所需的技術(shù)背景可以分為兩個(gè)方面:

  • 需要了解的是與 DOM 緊密相關(guān)的樹(shù)形數(shù)據(jù)結(jié)構(gòu),及對(duì)樹(shù)進(jìn)行增查改刪等操作的算法
  • 需要了解的是用于轉(zhuǎn)譯 JSX 代碼的工具鏈(可以用Babel 的 transform-react-jsx 插件來(lái)實(shí)現(xiàn))
    更新虛擬 DOM:差量更新

JSX:
React 使用 JSX 來(lái)替代常規(guī)的 JavaScript,JSX語(yǔ)法像是在Javascript代碼里直接寫(xiě)XML的語(yǔ)法,實(shí)質(zhì)上這只是一個(gè)語(yǔ)法糖,每一個(gè)XML標(biāo)簽都會(huì)被JSX轉(zhuǎn)換工具轉(zhuǎn)換成純Javascript代碼
優(yōu)點(diǎn):

  • JSX 執(zhí)行更快,因?yàn)樗诰幾g為 JavaScript 代碼后進(jìn)行了優(yōu)化。
  • 它是類型安全的,在編譯過(guò)程中就能發(fā)現(xiàn)錯(cuò)誤。
  • 使用 JSX 編寫(xiě)模板更加簡(jiǎn)單快速,組件的結(jié)構(gòu)和組件之間的關(guān)系看上去更加清晰

8.react和vue

react和vue的相似之處:
1.使用虛擬dom
2.提供了響應(yīng)式和組件化的視圖組件
3.關(guān)注核心庫(kù),伴隨于此,有配套的路由和負(fù)責(zé)處理全局狀態(tài)管理的庫(kù)

性能方面的差異:
1.渲染性能

  • 渲染用戶界面的時(shí)候,dom的操作成本是最高的,那為了盡可能的減少對(duì)dom的操作,Vue和React都利用虛擬DOM來(lái)實(shí)現(xiàn)這一點(diǎn),但Vue的Virtual DOM實(shí)現(xiàn)(一個(gè)陷阱的叉子)的權(quán)重要輕得多,因此比React的引入開(kāi)銷更少。
  • Vue 和 React 也提供功能性組件,這些組件因?yàn)槎际菦](méi)有聲明,沒(méi)有實(shí)例化的,因此會(huì)花費(fèi)更少的開(kāi)銷。當(dāng)這些都用于關(guān)鍵性能的場(chǎng)景時(shí),Vue 將會(huì)更快。

2.更新性能
在react中,當(dāng)一個(gè)組件的狀態(tài)發(fā)生變化時(shí),它將會(huì)引起整個(gè)組件的子樹(shù)都進(jìn)行重新渲染,從這個(gè)組件的根部開(kāi)始。那為了避免子組件不必要的重新渲染,您需要隨時(shí)使用shouldComponentUpdate,并使用不可變的數(shù)據(jù)結(jié)構(gòu)。 在Vue中,組件的依賴關(guān)系在它的渲染期間被自動(dòng)跟蹤,因此系統(tǒng)準(zhǔn)確地知道哪些組件實(shí)際上需要重新渲染。這就意味著在更新方面,vue也是快于React

3.開(kāi)發(fā)中
在開(kāi)發(fā)中,Vue 每秒最高處理 10 幀,而 React 每秒最高處理不到 1 幀。這是由于 React 有大量的檢查機(jī)制,這會(huì)讓它提供許多有用的警告和錯(cuò)誤提示信息。vue在實(shí)現(xiàn)這些檢查時(shí),也更加密切地關(guān)注了性能方面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,095評(píng)論 1 92
  • 介紹一下標(biāo)準(zhǔn)的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有兩種, IE 盒子模型、W3C 盒子模...
    無(wú)目的閱讀 405評(píng)論 0 1
  • 31.事件、IE與火狐的事件機(jī)制有什么區(qū)別? 如何阻止冒泡? 1.我們?cè)诰W(wǎng)頁(yè)中的某個(gè)操作(有的操作對(duì)應(yīng)多個(gè)事件)。...
    熊孩子CEO閱讀 409評(píng)論 0 5
  • <a name='html'>HTML</a> Doctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)、<...
    clark124閱讀 3,808評(píng)論 1 19
  • 01307汪慧美 現(xiàn)在我覺(jué)得大人也需要看的圖畫(huà)書(shū),而這一本正是大人需要看的書(shū)。這本書(shū)可以告訴我們很多——看...
    ameimay閱讀 2,071評(píng)論 0 2

友情鏈接更多精彩內(nèi)容