中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

中國化工第九建設(shè)公司網(wǎng)站專業(yè)seo優(yōu)化推廣

中國化工第九建設(shè)公司網(wǎng)站,專業(yè)seo優(yōu)化推廣,一呼百應(yīng)網(wǎng),做網(wǎng)站怎么掙錢HTTP世界全覽 互聯(lián)網(wǎng)上絕大部分資源都使用 HTTP 協(xié)議傳輸;瀏覽器是 HTTP 協(xié)議里的請求方,即 User Agent;服務(wù)器是 HTTP 協(xié)議里的應(yīng)答方,常用的有 Apache 和 Nginx;CDN 位于瀏覽器和服務(wù)器之間,主要起到緩存…

HTTP世界全覽

  • 互聯(lián)網(wǎng)上絕大部分資源都使用 HTTP 協(xié)議傳輸;
  • 瀏覽器是 HTTP 協(xié)議里的請求方,即 User Agent
  • 服務(wù)器是 HTTP 協(xié)議里的應(yīng)答方,常用的有 ApacheNginx
  • CDN 位于瀏覽器和服務(wù)器之間,主要起到緩存加速的作用;
  • 爬蟲是另一類 User Agent,是自動訪問網(wǎng)絡(luò)資源的程序。
  • TCP/IP 是網(wǎng)絡(luò)世界最常用的協(xié)議,HTTP 通常運行在 TCP/IP 提供的可靠傳輸基礎(chǔ)上
  • DNS 域名是 IP 地址的等價替代,需要用域名解析實現(xiàn)到 IP 地址的映射;
  • URI 是用來標(biāo)記互聯(lián)網(wǎng)上資源的一個名字,由“協(xié)議名 + 主機(jī)名 + 路徑”構(gòu)成,俗稱 URL;
  • HTTPS 相當(dāng)于“HTTP+SSL/TLS+TCP/IP”,為 HTTP 套了一個安全的外殼;
  • 代理是 HTTP 傳輸過程中的“中轉(zhuǎn)站”,可以實現(xiàn)緩存加速、負(fù)載均衡等功能

協(xié)商緩存和強(qiáng)緩存的區(qū)別

(1)強(qiáng)緩存

使用強(qiáng)緩存策略時,如果緩存資源有效,則直接使用緩存資源,不必再向服務(wù)器發(fā)起請求。

強(qiáng)緩存策略可以通過兩種方式來設(shè)置,分別是 http 頭信息中的 Expires 屬性和 Cache-Control 屬性。

(1)服務(wù)器通過在響應(yīng)頭中添加 Expires 屬性,來指定資源的過期時間。在過期時間以內(nèi),該資源可以被緩存使用,不必再向服務(wù)器發(fā)送請求。這個時間是一個絕對時間,它是服務(wù)器的時間,因此可能存在這樣的問題,就是客戶端的時間和服務(wù)器端的時間不一致,或者用戶可以對客戶端時間進(jìn)行修改的情況,這樣就可能會影響緩存命中的結(jié)果。

(2)Expires 是 http1.0 中的方式,因為它的一些缺點,在 HTTP 1.1 中提出了一個新的頭部屬性就是 Cache-Control 屬性,它提供了對資源的緩存的更精確的控制。它有很多不同的值,

Cache-Control可設(shè)置的字段:

  • public:設(shè)置了該字段值的資源表示可以被任何對象(包括:發(fā)送請求的客戶端、代理服務(wù)器等等)緩存。這個字段值不常用,一般還是使用max-age=來精確控制;
  • private:設(shè)置了該字段值的資源只能被用戶瀏覽器緩存,不允許任何代理服務(wù)器緩存。在實際開發(fā)當(dāng)中,對于一些含有用戶信息的HTML,通常都要設(shè)置這個字段值,避免代理服務(wù)器(CDN)緩存;
  • no-cache:設(shè)置了該字段需要先和服務(wù)端確認(rèn)返回的資源是否發(fā)生了變化,如果資源未發(fā)生變化,則直接使用緩存好的資源;
  • no-store:設(shè)置了該字段表示禁止任何緩存,每次都會向服務(wù)端發(fā)起新的請求,拉取最新的資源;
  • max-age=:設(shè)置緩存的最大有效期,單位為秒;
  • s-maxage=:優(yōu)先級高于max-age=,僅適用于共享緩存(CDN),優(yōu)先級高于max-age或者Expires頭;
  • max-stale[=]:設(shè)置了該字段表明客戶端愿意接收已經(jīng)過期的資源,但是不能超過給定的時間限制。

一般來說只需要設(shè)置其中一種方式就可以實現(xiàn)強(qiáng)緩存策略,當(dāng)兩種方式一起使用時,Cache-Control 的優(yōu)先級要高于 Expires。

no-cache和no-store很容易混淆:

  • no-cache 是指先要和服務(wù)器確認(rèn)是否有資源更新,在進(jìn)行判斷。也就是說沒有強(qiáng)緩存,但是會有協(xié)商緩存;
  • no-store 是指不使用任何緩存,每次請求都直接從服務(wù)器獲取資源。

(2)協(xié)商緩存

如果命中強(qiáng)制緩存,我們無需發(fā)起新的請求,直接使用緩存內(nèi)容,如果沒有命中強(qiáng)制緩存,如果設(shè)置了協(xié)商緩存,這個時候協(xié)商緩存就會發(fā)揮作用了。

上面已經(jīng)說到了,命中協(xié)商緩存的條件有兩個:

  • max-age=xxx 過期了
  • 值為no-store

使用協(xié)商緩存策略時,會先向服務(wù)器發(fā)送一個請求,如果資源沒有發(fā)生修改,則返回一個 304 狀態(tài),讓瀏覽器使用本地的緩存副本。如果資源發(fā)生了修改,則返回修改后的資源。

協(xié)商緩存也可以通過兩種方式來設(shè)置,分別是 http 頭信息中的EtagLast-Modified屬性。

(1)服務(wù)器通過在響應(yīng)頭中添加 Last-Modified 屬性來指出資源最后一次修改的時間,當(dāng)瀏覽器下一次發(fā)起請求時,會在請求頭中添加一個 If-Modified-Since 的屬性,屬性值為上一次資源返回時的 Last-Modified 的值。當(dāng)請求發(fā)送到服務(wù)器后服務(wù)器會通過這個屬性來和資源的最后一次的修改時間來進(jìn)行比較,以此來判斷資源是否做了修改。如果資源沒有修改,那么返回 304 狀態(tài),讓客戶端使用本地的緩存。如果資源已經(jīng)被修改了,則返回修改后的資源。使用這種方法有一個缺點,就是 Last-Modified 標(biāo)注的最后修改時間只能精確到秒級,如果某些文件在1秒鐘以內(nèi),被修改多次的話,那么文件已將改變了但是 Last-Modified 卻沒有改變,這樣會造成緩存命中的不準(zhǔn)確。

(2)因為 Last-Modified 的這種可能發(fā)生的不準(zhǔn)確性,http 中提供了另外一種方式,那就是 Etag 屬性。服務(wù)器在返回資源的時候,在頭信息中添加了 Etag 屬性,這個屬性是資源生成的唯一標(biāo)識符,當(dāng)資源發(fā)生改變的時候,這個值也會發(fā)生改變。在下一次資源請求時,瀏覽器會在請求頭中添加一個 If-None-Match 屬性,這個屬性的值就是上次返回的資源的 Etag 的值。服務(wù)接收到請求后會根據(jù)這個值來和資源當(dāng)前的 Etag 的值來進(jìn)行比較,以此來判斷資源是否發(fā)生改變,是否需要返回資源。通過這種方式,比 Last-Modified 的方式更加精確。

當(dāng) Last-Modified 和 Etag 屬性同時出現(xiàn)的時候,Etag 的優(yōu)先級更高。使用協(xié)商緩存的時候,服務(wù)器需要考慮負(fù)載平衡的問題,因此多個服務(wù)器上資源的 Last-Modified 應(yīng)該保持一致,因為每個服務(wù)器上 Etag 的值都不一樣,因此在考慮負(fù)載平衡時,最好不要設(shè)置 Etag 屬性。

總結(jié):

強(qiáng)緩存策略和協(xié)商緩存策略在緩存命中時都會直接使用本地的緩存副本,區(qū)別只在于協(xié)商緩存會向服務(wù)器發(fā)送一次請求。它們緩存不命中時,都會向服務(wù)器發(fā)送請求來獲取資源。在實際的緩存機(jī)制中,強(qiáng)緩存策略和協(xié)商緩存策略是一起合作使用的。瀏覽器首先會根據(jù)請求的信息判斷,強(qiáng)緩存是否命中,如果命中則直接使用資源。如果不命中則根據(jù)頭信息向服務(wù)器發(fā)起請求,使用協(xié)商緩存,如果協(xié)商緩存命中的話,則服務(wù)器不返回資源,瀏覽器直接使用本地資源的副本,如果協(xié)商緩存不命中,則瀏覽器返回最新的資源給瀏覽器。

JS 整數(shù)是怎么表示的?

  • 通過 Number 類型來表示,遵循 IEEE754 標(biāo)準(zhǔn),通過 64 位來表示一個數(shù)字,(1 + 11 + 52),最大安全數(shù)字是 Math.pow(2, 53) - 1,對于 16 位十進(jìn)制。(符號位 + 指數(shù)位 + 小數(shù)部分有效位)

瀏覽器的垃圾回收機(jī)制

(1)垃圾回收的概念

垃圾回收:JavaScript代碼運行時,需要分配內(nèi)存空間來儲存變量和值。當(dāng)變量不在參與運行時,就需要系統(tǒng)收回被占用的內(nèi)存空間,這就是垃圾回收。

回收機(jī)制

  • Javascript 具有自動垃圾回收機(jī)制,會定期對那些不再使用的變量、對象所占用的內(nèi)存進(jìn)行釋放,原理就是找到不再使用的變量,然后釋放掉其占用的內(nèi)存。
  • JavaScript中存在兩種變量:局部變量和全局變量。全局變量的生命周期會持續(xù)要頁面卸載;而局部變量聲明在函數(shù)中,它的生命周期從函數(shù)執(zhí)行開始,直到函數(shù)執(zhí)行結(jié)束,在這個過程中,局部變量會在堆或棧中存儲它們的值,當(dāng)函數(shù)執(zhí)行結(jié)束后,這些局部變量不再被使用,它們所占有的空間就會被釋放。
  • 不過,當(dāng)局部變量被外部函數(shù)使用時,其中一種情況就是閉包,在函數(shù)執(zhí)行結(jié)束后,函數(shù)外部的變量依然指向函數(shù)內(nèi)部的局部變量,此時局部變量依然在被使用,所以不會回收。

(2)垃圾回收的方式

瀏覽器通常使用的垃圾回收方法有兩種:標(biāo)記清除,引用計數(shù)。 1)標(biāo)記清除

  • 標(biāo)記清除是瀏覽器常見的垃圾回收方式,當(dāng)變量進(jìn)入執(zhí)行環(huán)境時,就標(biāo)記這個變量“進(jìn)入環(huán)境”,被標(biāo)記為“進(jìn)入環(huán)境”的變量是不能被回收的,因為他們正在被使用。當(dāng)變量離開環(huán)境時,就會被標(biāo)記為“離開環(huán)境”,被標(biāo)記為“離開環(huán)境”的變量會被內(nèi)存釋放。
  • 垃圾收集器在運行的時候會給存儲在內(nèi)存中的所有變量都加上標(biāo)記。然后,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的標(biāo)記。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了。最后。垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值,并回收他們所占用的內(nèi)存空間。

2)引用計數(shù)

  • 另外一種垃圾回收機(jī)制就是引用計數(shù),這個用的相對較少。引用計數(shù)就是跟蹤記錄每個值被引用的次數(shù)。當(dāng)聲明了一個變量并將一個引用類型賦值給該變量時,則這個值的引用次數(shù)就是1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數(shù)就減1。當(dāng)這個引用次數(shù)變?yōu)?時,說明這個變量已經(jīng)沒有價值,因此,在在機(jī)回收期下次再運行時,這個變量所占有的內(nèi)存空間就會被釋放出來。
  • 這種方法會引起循環(huán)引用的問題:例如: obj1obj2通過屬性進(jìn)行相互引用,兩個對象的引用次數(shù)都是2。當(dāng)使用循環(huán)計數(shù)時,由于函數(shù)執(zhí)行完后,兩個對象都離開作用域,函數(shù)執(zhí)行結(jié)束,obj1obj2還將會繼續(xù)存在,因此它們的引用次數(shù)永遠(yuǎn)不會是0,就會引起循環(huán)引用。
function fun() {let obj1 = {};let obj2 = {};obj1.a = obj2; // obj1 引用 obj2obj2.a = obj1; // obj2 引用 obj1
}

這種情況下,就要手動釋放變量占用的內(nèi)存:

obj1.a =  nullobj2.a =  null

(3)減少垃圾回收

雖然瀏覽器可以進(jìn)行垃圾自動回收,但是當(dāng)代碼比較復(fù)雜時,垃圾回收所帶來的代價比較大,所以應(yīng)該盡量減少垃圾回收。

  • 對數(shù)組進(jìn)行優(yōu)化: 在清空一個數(shù)組時,最簡單的方法就是給其賦值為[ ],但是與此同時會創(chuàng)建一個新的空對象,可以將數(shù)組的長度設(shè)置為0,以此來達(dá)到清空數(shù)組的目的。
  • object進(jìn)行優(yōu)化: 對象盡量復(fù)用,對于不再使用的對象,就將其設(shè)置為null,盡快被回收。
  • 對函數(shù)進(jìn)行優(yōu)化: 在循環(huán)中的函數(shù)表達(dá)式,如果可以復(fù)用,盡量放在函數(shù)的外面。

什么是同源策略

跨域問題其實就是瀏覽器的同源策略造成的。

同源策略限制了從同一個源加載的文檔或腳本如何與另一個源的資源進(jìn)行交互。這是瀏覽器的一個用于隔離潛在惡意文件的重要的安全機(jī)制。同源指的是:協(xié)議、端口號、域名必須一致。

同源策略:protocol(協(xié)議)、domain(域名)、port(端口)三者必須一致。

同源政策主要限制了三個方面:

  • 當(dāng)前域下的 js 腳本不能夠訪問其他域下的 cookie、localStorage 和 indexDB。
  • 當(dāng)前域下的 js 腳本不能夠操作訪問操作其他域下的 DOM。
  • 當(dāng)前域下 ajax 無法發(fā)送跨域請求。

同源政策的目的主要是為了保證用戶的信息安全,它只是對 js 腳本的一種限制,并不是對瀏覽器的限制,對于一般的 img、或者script 腳本請求都不會有跨域的限制,這是因為這些操作都不會通過響應(yīng)結(jié)果來進(jìn)行可能出現(xiàn)安全問題的操作。

請實現(xiàn) DOM2JSON 一個函數(shù),可以把一個 DOM 節(jié)點輸出 JSON 的格式

題目描述:

<div><span><a></a></span><span><a></a><a></a></span>
</div>把上訴dom結(jié)構(gòu)轉(zhuǎn)成下面的JSON格式{tag: 'DIV',children: [{tag: 'SPAN',children: [{ tag: 'A', children: [] }]},{tag: 'SPAN',children: [{ tag: 'A', children: [] },{ tag: 'A', children: [] }]}]
}

實現(xiàn)代碼如下:

function dom2Json(domtree) {let obj = {};obj.name = domtree.tagName;obj.children = [];domtree.childNodes.forEach((child) => obj.children.push(dom2Json(child)));return obj;
}

擴(kuò)展思考:如果給定的不是一個 Dom 樹結(jié)構(gòu) 而是一段 html 字符串 該如何解析?

那么這個問題就類似 Vue 的模板編譯原理 我們可以利用正則 匹配 html 字符串 遇到開始標(biāo)簽 結(jié)束標(biāo)簽和文本 解析完畢之后生成對應(yīng)的 ast 并建立相應(yīng)的父子關(guān)聯(lián) 不斷的 advance 截取剩余的字符串 直到 html 全部解析完畢

參考 前端進(jìn)階面試題詳細(xì)解答

代碼輸出結(jié)果

var a = 10
var obj = {a: 20,say: () => {console.log(this.a)}
}
obj.say() var anotherObj = { a: 30 } 
obj.say.apply(anotherObj) 

輸出結(jié)果:10 10

我么知道,箭頭函數(shù)時不綁定this的,它的this來自原其父級所處的上下文,所以首先會打印全局中的 a 的值10。后面雖然讓say方法指向了另外一個對象,但是仍不能改變箭頭函數(shù)的特性,它的this仍然是指向全局的,所以依舊會輸出10。

但是,如果是普通函數(shù),那么就會有完全不一樣的結(jié)果:

var a = 10  
var obj = {  a: 20,  say(){console.log(this.a)  }  
}  
obj.say()   
var anotherObj={a:30}   
obj.say.apply(anotherObj)

輸出結(jié)果:20 30

這時,say方法中的this就會指向他所在的對象,輸出其中的a的值。

實現(xiàn)一個寬高自適應(yīng)的正方形

  • 利用vw來實現(xiàn):
.square {width: 10%;height: 10vw;background: tomato;
}
  • 利用元素的margin/padding百分比是相對父元素width的性質(zhì)來實現(xiàn):
.square {width: 20%;height: 0;padding-top: 20%;background: orange;
}
  • 利用子元素的margin-top的值來實現(xiàn):
.square {width: 30%;overflow: hidden;background: yellow;
}
.square::after {content: '';display: block;margin-top: 100%;
}

label 的作用是什么?如何使用?

label標(biāo)簽來定義表單控件的關(guān)系:當(dāng)用戶選擇label標(biāo)簽時,瀏覽器會自動將焦點轉(zhuǎn)到和label標(biāo)簽相關(guān)的表單控件上。

  • 使用方法1:
<label for="mobile">Number:</label>
<input type="text" id="mobile"/>
  • 使用方法2:
<label>Date:<input type="text"/></label>

對盒模型的理解

CSS3中的盒模型有以下兩種:標(biāo)準(zhǔn)盒子模型、IE盒子模型 盒模型都是由四個部分組成的,分別是margin、border、padding和content。

標(biāo)準(zhǔn)盒模型和IE盒模型的區(qū)別在于設(shè)置width和height時,所對應(yīng)的范圍不同:

  • 標(biāo)準(zhǔn)盒模型的width和height屬性的范圍只包含了content,
  • IE盒模型的width和height屬性的范圍包含了border、padding和content。

可以通過修改元素的box-sizing屬性來改變元素的盒模型:

  • box-sizeing: content-box表示標(biāo)準(zhǔn)盒模型(默認(rèn)值)
  • box-sizeing: border-box表示IE盒模型(怪異盒模型)

瀏覽器的渲染過程

瀏覽器渲染主要有以下步驟:

  • 首先解析收到的文檔,根據(jù)文檔定義構(gòu)建一棵 DOM 樹,DOM 樹是由 DOM 元素及屬性節(jié)點組成的。
  • 然后對 CSS 進(jìn)行解析,生成 CSSOM 規(guī)則樹。
  • 根據(jù) DOM 樹和 CSSOM 規(guī)則樹構(gòu)建渲染樹。渲染樹的節(jié)點被稱為渲染對象,渲染對象是一個包含有顏色和大小等屬性的矩形,渲染對象和 DOM 元素相對應(yīng),但這種對應(yīng)關(guān)系不是一對一的,不可見的 DOM 元素不會被插入渲染樹。還有一些 DOM元素對應(yīng)幾個可見對象,它們一般是一些具有復(fù)雜結(jié)構(gòu)的元素,無法用一個矩形來描述。
  • 當(dāng)渲染對象被創(chuàng)建并添加到樹中,它們并沒有位置和大小,所以當(dāng)瀏覽器生成渲染樹以后,就會根據(jù)渲染樹來進(jìn)行布局(也可以叫做回流)。這一階段瀏覽器要做的事情是要弄清楚各個節(jié)點在頁面中的確切位置和大小。通常這一行為也被稱為“自動重排”。
  • 布局階段結(jié)束后是繪制階段,遍歷渲染樹并調(diào)用渲染對象的 paint 方法將它們的內(nèi)容顯示在屏幕上,繪制使用 UI 基礎(chǔ)組件。

大致過程如圖所示:

注意: 這個過程是逐步完成的,為了更好的用戶體驗,渲染引擎將會盡可能早的將內(nèi)容呈現(xiàn)到屏幕上,并不會等到所有的html 都解析完成之后再去構(gòu)建和布局 render 樹。它是解析完一部分內(nèi)容就顯示一部分內(nèi)容,同時,可能還在通過網(wǎng)絡(luò)下載其余內(nèi)容。

什么情況會阻塞渲染?

首先渲染的前提是生成渲染樹,所以 HTML 和 CSS 肯定會阻塞渲染。如果你想渲染的越快,你越應(yīng)該降低一開始需要渲染的文件大小,并且扁平層級,優(yōu)化選擇器。然后當(dāng)瀏覽器在解析到 script 標(biāo)簽時,會暫停構(gòu)建 DOM,完成后才會從暫停的地方重新開始。也就是說,如果你想首屏渲染的越快,就越不應(yīng)該在首屏就加載 JS 文件,這也是都建議將 script 標(biāo)簽放在 body 標(biāo)簽底部的原因。

當(dāng)然在當(dāng)下,并不是說 script 標(biāo)簽必須放在底部,因為你可以給 script 標(biāo)簽添加 defer 或者 async 屬性。當(dāng) script 標(biāo)簽加上 defer 屬性以后,表示該 JS 文件會并行下載,但是會放到 HTML 解析完成后順序執(zhí)行,所以對于這種情況你可以把 script 標(biāo)簽放在任意位置。對于沒有任何依賴的 JS 文件可以加上 async 屬性,表示 JS 文件下載和解析不會阻塞渲染。

對媒體查詢的理解?

媒體查詢由?個可選的媒體類型和零個或多個使?媒體功能的限制了樣式表范圍的表達(dá)式組成,例如寬度、?度和顏?。媒體查詢,添加?CSS3,允許內(nèi)容的呈現(xiàn)針對?個特定范圍的輸出設(shè)備?進(jìn)?裁剪,?不必改變內(nèi)容本身,適合web??應(yīng)對不同型號的設(shè)備?做出對應(yīng)的響應(yīng)適配。

媒體查詢包含?個可選的媒體類型和滿?CSS3規(guī)范的條件下,包含零個或多個表達(dá)式,這些表達(dá)式描述了媒體特征,最終會被解析為true或false。如果媒體查詢中指定的媒體類型匹配展示?檔所使?的設(shè)備類型,并且所有的表達(dá)式的值都是true,那么該媒體查詢的結(jié)果為true。那么媒體查詢內(nèi)的樣式將會?效。

<!-- link元素中的CSS媒體查詢 --> 
<link rel="stylesheet" media="(max-width: 800px)" href="example.css" /> 
<!-- 樣式表中的CSS媒體查詢 --> 
<style> 
@media (max-width: 600px) {   .facet_sidebar {     display: none;   } }
</style>

簡單來說,使用 @media 查詢,可以針對不同的媒體類型定義不同的樣式。@media 可以針對不同的屏幕尺寸設(shè)置不同的樣式,特別是需要設(shè)置設(shè)計響應(yīng)式的頁面,@media 是非常有用的。當(dāng)重置瀏覽器大小的過程中,頁面也會根據(jù)瀏覽器的寬度和高度重新渲染頁面。

代碼輸出結(jié)果

var F = function() {};
Object.prototype.a = function() {console.log('a');
};
Function.prototype.b = function() {console.log('b');
}
var f = new F();
f.a();
f.b();
F.a();
F.b()

輸出結(jié)果:

a
Uncaught TypeError: f.b is not a function
a
b

解析:

  1. f 并不是 Function 的實例,因為它本來就不是構(gòu)造函數(shù),調(diào)用的是 Function 原型鏈上的相關(guān)屬性和方法,只能訪問到 Object 原型鏈。所以 f.a() 輸出 a? ,而 f.b() 就報錯了。
  2. F 是個構(gòu)造函數(shù),而 F 是構(gòu)造函數(shù) Function 的一個實例。因為 F instanceof? Object === true,F instanceof Function === true,由此可以得出結(jié)論:F 是 Object 和 Function 兩個的實例,即 F 能訪問到 a, 也能訪問到 b。所以 F.a() 輸出 a ,F.b() 輸出 b。

對 CSSSprites 的理解

CSSSprites(精靈圖),將一個頁面涉及到的所有圖片都包含到一張大圖中去,然后利用CSS的 background-image,background-repeat,background-position屬性的組合進(jìn)行背景定位。

優(yōu)點:

  • 利用CSS Sprites能很好地減少網(wǎng)頁的http請求,從而大大提高了頁面的性能,這是CSS Sprites最大的優(yōu)點;
  • CSS Sprites能減少圖片的字節(jié),把3張圖片合并成1張圖片的字節(jié)總是小于這3張圖片的字節(jié)總和。

缺點:

  • 在圖片合并時,要把多張圖片有序的、合理的合并成一張圖片,還要留好足夠的空間,防止板塊內(nèi)出現(xiàn)不必要的背景。在寬屏及高分辨率下的自適應(yīng)頁面,如果背景不夠?qū)?#xff0c;很容易出現(xiàn)背景斷裂;
  • CSSSprites在開發(fā)的時候相對來說有點麻煩,需要借助photoshop或其他工具來對每個背景單元測量其準(zhǔn)確的位置。
  • 維護(hù)方面:CSS Sprites在維護(hù)的時候比較麻煩,頁面背景有少許改動時,就要改這張合并的圖片,無需改的地方盡量不要動,這樣避免改動更多的CSS,如果在原來的地方放不下,又只能(最好)往下加圖片,這樣圖片的字節(jié)就增加了,還要改動CSS。

如何?webpack來優(yōu)化前端性能?

?webpack優(yōu)化前端性能是指優(yōu)化webpack的輸出結(jié)果,讓打包的最終結(jié)果在瀏覽器運?快速?效。

  • 壓縮代碼:刪除多余的代碼、注釋、簡化代碼的寫法等等?式。可以利?webpack的 UglifyJsPlugin 和 ParallelUglifyPlugin 來壓縮JS?件, 利? cssnano (css-loader?minimize)來壓縮css
  • 利?CDN加速: 在構(gòu)建過程中,將引?的靜態(tài)資源路徑修改為CDN上對應(yīng)的路徑??梢岳?webpack對于 output 參數(shù)和各loader的 publicPath 參數(shù)來修改資源路徑
  • Tree Shaking: 將代碼中永遠(yuǎn)不會?到的?段刪除掉??梢酝ㄟ^在啟動webpack時追加參數(shù) --optimize-minimize 來實現(xiàn)
  • Code Splitting: 將代碼按路由維度或者組件分塊(chunk),這樣做到按需加載,同時可以充分利?瀏覽器緩存
  • 提取公共第三?庫: SplitChunksPlugin插件來進(jìn)?公共模塊抽取,利?瀏覽器緩存可以?期緩存這些?需頻繁變動的公共代碼

代碼輸出結(jié)果

// a
function Foo () {getName = function () {console.log(1);}return this;
}
// b
Foo.getName = function () {console.log(2);
}
// c
Foo.prototype.getName = function () {console.log(3);
}
// d
var getName = function () {console.log(4);
}
// e
function getName () {console.log(5);
}Foo.getName();           // 2
getName();               // 4
Foo().getName();         // 1
getName();               // 1 
new Foo.getName();       // 2
new Foo().getName();     // 3
new new Foo().getName(); // 3

輸出結(jié)果:2 4 1 1 2 3 3

解析:

  1. Foo.getName(), Foo為一個函數(shù)對象,對象都可以有屬性,b 處定義Foo的getName屬性為函數(shù),輸出2;
  2. getName(), 這里看d、e處,d為函數(shù)表達(dá)式,e為函數(shù)聲明,兩者區(qū)別在于變量提升,函數(shù)聲明的 5 會被后邊函數(shù)表達(dá)式的 4 覆蓋;
  3. **?Foo().getName(),** 這里要看a處,在Foo內(nèi)部將全局的getName重新賦值為 console.log(1) 的函數(shù),執(zhí)行Foo()返回 this,這個this指向window,Foo().getName() 即為window.getName(),輸出 1;
  4. getName(), 上面3中,全局的getName已經(jīng)被重新賦值,所以這里依然輸出 1;
  5. new Foo.getName(), 這里等價于?new (Foo.getName()),先執(zhí)行 Foo.getName(),輸出 2,然后new一個實例;
  6. new Foo().getName(), 這 里等價于 (new Foo()).getName(), 先new一個Foo的實例,再執(zhí)行這個實例的getName方法,但是這個實例本身沒有這個方法,所以去原型鏈__protot__上邊找,實例.protot === Foo.prototype,所以輸出 3;
  7. new new Foo().getName(), 這里等價于new (new Foo().getName()),如上述6,先輸出 3,然后new 一個?new Foo().getName() 的實例。

::before 和 :after 的雙冒號和單冒號有什么區(qū)別?

(1)冒號(:)用于CSS3偽類,雙冒號(::)用于CSS3偽元素。
(2)::before就是以一個子元素的存在,定義在元素主體內(nèi)容之前的一個偽元素。并不存在于dom之中,只存在在頁面之中。

注意: :before:after 這兩個偽元素,是在CSS2.1里新出現(xiàn)的。起初,偽元素的前綴使用的是單冒號語法,但隨著Web的進(jìn)化,在CSS3的規(guī)范里,偽元素的語法被修改成使用雙冒號,成為::before、::after

代碼輸出結(jié)果

var myObject = {foo: "bar",func: function() {var self = this;console.log(this.foo);  console.log(self.foo);  (function() {console.log(this.foo);  console.log(self.foo);  }());}
};
myObject.func();

輸出結(jié)果:bar bar undefined bar

解析:

  1. 首先func是由myObject調(diào)用的,this指向myObject。又因為var self = this;所以self指向myObject。
  2. 這個立即執(zhí)行匿名函數(shù)表達(dá)式是由window調(diào)用的,this指向window 。立即執(zhí)行匿名函數(shù)的作用域處于myObject.func的作用域中,在這個作用域找不到self變量,沿著作用域鏈向上查找self變量,找到了指向 myObject對象的self。

瀏覽器亂碼的原因是什么?如何解決?

產(chǎn)生亂碼的原因:

  • 網(wǎng)頁源代碼是gbk的編碼,而內(nèi)容中的中文字是utf-8編碼的,這樣瀏覽器打開即會出現(xiàn)html亂碼,反之也會出現(xiàn)亂碼;
  • html網(wǎng)頁編碼是gbk,而程序從數(shù)據(jù)庫中調(diào)出呈現(xiàn)是utf-8編碼的內(nèi)容也會造成編碼亂碼;
  • 瀏覽器不能自動檢測網(wǎng)頁編碼,造成網(wǎng)頁亂碼。

解決辦法:

  • 使用軟件編輯HTML網(wǎng)頁內(nèi)容;
  • 如果網(wǎng)頁設(shè)置編碼是gbk,而數(shù)據(jù)庫儲存數(shù)據(jù)編碼格式是UTF-8,此時需要程序查詢數(shù)據(jù)庫數(shù)據(jù)顯示數(shù)據(jù)前進(jìn)程序轉(zhuǎn)碼;
  • 如果瀏覽器瀏覽時候出現(xiàn)網(wǎng)頁亂碼,在瀏覽器中找到轉(zhuǎn)換編碼的菜單進(jìn)行轉(zhuǎn)換。
http://www.risenshineclean.com/news/55514.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)工作室 建設(shè) 方案python培訓(xùn)
  • 高德地圖可以搜索國外嗎360搜索引擎優(yōu)化
  • WordPress網(wǎng)站hym地圖百度一下電腦版首頁網(wǎng)址
  • 靜態(tài)網(wǎng)站作品seo怎樣優(yōu)化網(wǎng)站
  • 簡約中國風(fēng)免費ppt模板seo網(wǎng)站編輯優(yōu)化招聘
  • 建設(shè)網(wǎng)站不顯示添加白名單全網(wǎng)營銷系統(tǒng)
  • 鐵道部網(wǎng)上訂票網(wǎng)站素材百度識圖掃一掃
  • wordpress相冊插件中文海外aso優(yōu)化
  • 自己如何網(wǎng)站建設(shè)seo查詢百科
  • 工商聯(lián)網(wǎng)站建設(shè)作用湖州seo排名
  • 先搭建網(wǎng)站還是先做ui怎么創(chuàng)建網(wǎng)站教程
  • 化妝培訓(xùn)網(wǎng)站模板百度網(wǎng)頁網(wǎng)址
  • 網(wǎng)站開發(fā)費用多少錢如何學(xué)會推廣和營銷
  • 做的比較好的返利網(wǎng)站知乎網(wǎng)站搭建一般要多少錢
  • 做盜版視頻網(wǎng)站違法嗎自己制作網(wǎng)頁的網(wǎng)站
  • 電子商務(wù)網(wǎng)站建設(shè)專業(yè)主修課程關(guān)鍵詞挖掘排名
  • wordpress 頁面?zhèn)戊o態(tài)界首網(wǎng)站優(yōu)化公司
  • 企業(yè)網(wǎng)站建設(shè)電話網(wǎng)絡(luò)推廣方案七步法
  • 廣東工廠網(wǎng)站建設(shè)sem是什么公司
  • 渭南網(wǎng)站建設(shè)網(wǎng)站代發(fā)外鏈
  • 做設(shè)計想接外單去哪個網(wǎng)站好怎樣推廣自己的商城
  • 東西湖做網(wǎng)站中國最厲害的營銷策劃公司
  • 企業(yè)如何注冊自己的網(wǎng)站網(wǎng)站分析
  • 最簡單的網(wǎng)站模板下載資深seo顧問
  • html5企業(yè)網(wǎng)站建設(shè)湖南營銷型網(wǎng)站建設(shè)
  • 網(wǎng)站域名被做網(wǎng)站的公司擅自更改寧波優(yōu)化網(wǎng)站哪家好
  • 營銷型網(wǎng)站建設(shè)極速建站佛山疫情最新消息
  • 做我網(wǎng)站個人網(wǎng)站怎么制作
  • 建設(shè)一個廣告聯(lián)盟的網(wǎng)站上海城市分站seo
  • 網(wǎng)站建設(shè)如何提高瀏覽量廣州30萬人感染