前端面試題總結(jié)

HTML

HTML5標(biāo)簽

媒體查詢(xún)head部分寫(xiě)法

Doctype作用? 嚴(yán)格模式與混雜模式如何區(qū)分邮辽?它們有何意義?

  1. <!DOCTYPE>聲明位于文檔中的最前面活喊,處于<html>標(biāo)簽之前玄捕。告知瀏覽器以何種模式來(lái)渲染文檔袍镀。
  2. 嚴(yán)格模式的排版和JS運(yùn)作模式是以該瀏覽器支持的最高標(biāo)準(zhǔn)運(yùn)行刘莹。
  3. 在混雜模式中祝沸,頁(yè)面以寬松的向后兼容的方式顯示使套。模擬老式瀏覽器的行為以防止站點(diǎn)無(wú)法工作病往。
  4. DOCTYPE不存在或格式不正確會(huì)導(dǎo)致文檔以混雜模式呈現(xiàn)美尸。

你知道多少種Doctype文檔類(lèi)型冤议?

該標(biāo)簽可聲明三種 DTD 類(lèi)型,分別表示嚴(yán)格版本师坎、過(guò)渡版本以及基于框架的 HTML 文檔恕酸。

  1. HTML 4.01 規(guī)定了三種文檔類(lèi)型:Strict、Transitional 以及 Frameset胯陋。
  2. XHTML 1.0 規(guī)定了三種 XML 文檔類(lèi)型:Strict蕊温、Transitional 以及 Frameset。
  3. Standards (標(biāo)準(zhǔn))模式(也就是嚴(yán)格呈現(xiàn)模式)用于呈現(xiàn)遵循最新標(biāo)準(zhǔn)的網(wǎng)頁(yè)惶岭,而 Quirks
    (包容)模式(也就是松散呈現(xiàn)模式或者兼容模式)用于呈現(xiàn)為傳統(tǒng)瀏覽器而設(shè)計(jì)的網(wǎng)頁(yè)寿弱。

HTML與XHTML,二者有什么區(qū)別

區(qū)別:

  1. 所有的標(biāo)記都必須要有一個(gè)相應(yīng)的結(jié)束標(biāo)記
  2. 所有標(biāo)簽的元素和屬性的名字都必須使用小寫(xiě)
  3. 所有的XML標(biāo)記都必須合理嵌套
  4. 所有的屬性必須用引號(hào)""括起來(lái)
  5. 把所有<和&特殊符號(hào)用編碼表示
  6. 給所有屬性賦一個(gè)值
  7. 不要在注釋內(nèi)容中使“--”
  8. 圖片必須有說(shuō)明文字

html5有哪些新特性按灶、移除了那些元素症革?如何處理HTML5新標(biāo)簽的瀏覽器兼容問(wèn)題?如何區(qū)分 HTML 和 HTML5鸯旁?

  • HTML5 現(xiàn)在已經(jīng)不是 SGML 的子集噪矛,主要是關(guān)于圖像量蕊,位置,存儲(chǔ)艇挨,多任務(wù)等功能的增加残炮。
  • 新特性:
    • 拖拽釋放(Drag and drop) API
    • 語(yǔ)義化更好的內(nèi)容標(biāo)簽(header,nav,footer,aside,article,section)
    • 音頻、視頻API(audio,video)
    • 畫(huà)布(Canvas) API
    • 地理(Geolocation) API
    • 本地離線(xiàn)存儲(chǔ)
      • localStorage 長(zhǎng)期存儲(chǔ)數(shù)據(jù)缩滨,瀏覽器關(guān)閉后數(shù)據(jù)不丟失势就;
      • sessionStorage 的數(shù)據(jù)在瀏覽器關(guān)閉后自動(dòng)刪除
    • 表單控件,calendar脉漏、date苞冯、time、email侧巨、url舅锄、search
    • 新的技術(shù)webworker, websocket, Geolocation
  • 移除的元素
    • 純表現(xiàn)的元素:basefont,big司忱,center皇忿,font, s,strike坦仍,tt鳍烁,u;
    • 對(duì)可用性產(chǎn)生負(fù)面影響的元素:frame繁扎,frameset老翘,noframes;
  • 支持HTML5新標(biāo)簽:
    • IE8/IE7/IE6支持通過(guò)document.createElement方法產(chǎn)生的標(biāo)簽锻离,
      可以利用這一特性讓這些瀏覽器支持HTML5新標(biāo)簽,
      瀏覽器支持新標(biāo)簽后墓怀,還需要添加標(biāo)簽?zāi)J(rèn)的樣式:
    • 當(dāng)然最好的方式是直接使用成熟的框架汽纠、使用最多的是html5shim框架
       <!--[if lt IE 9]> 
       <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> 
       <![endif]-->
    

iframe的優(yōu)缺點(diǎn)?

  1. <iframe>優(yōu)點(diǎn):
    • 解決加載緩慢的第三方內(nèi)容如圖標(biāo)和廣告等的加載問(wèn)題
    • Security sandbox
    • 并行加載腳本
  2. <iframe>的缺點(diǎn):
    • iframe會(huì)阻塞主頁(yè)面的Onload事件傀履;
    • 即使內(nèi)容為空虱朵,加載也需要時(shí)間
    • 沒(méi)有語(yǔ)意

如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)之間的通信?

調(diào)用localstorge、cookies等本地存儲(chǔ)方式

CSS

css垂直居中方法

css居中完整指南

自適應(yīng)布局

關(guān)于左右自適應(yīng)的,不低于10種解決方案,還要看dom結(jié)構(gòu)要求是并列還是嵌套,是否允許有父級(jí)元素,是否允許使用CSS3, 是否有背景色,是否要兩列等高,等等
而關(guān)于自適應(yīng)高度的解決方案就略少一些,大致也是靠,CSS3的calc屬性,內(nèi)padding,絕對(duì)定位后拉伸,動(dòng)態(tài)js計(jì)算等等解決 方案,同樣也是要看應(yīng)用場(chǎng)景能用哪個(gè)

移動(dòng)端自適應(yīng)

  1. rem方法
<script>
  document.getElementsByTagName('html')[0].style.fontSize = 
    window.innerWidth/320 * 100 + 'px';
</script>

Position屬性

  1. position有五個(gè)屬性: static | relative | absolute | fixed | inherit
    • static 和 inherit : 沒(méi)什么值得介紹的钓账。
    • relative : 相對(duì)于元素自身的定位碴犬。
    • absolute :相對(duì)于包含塊的定位。
    • fixed : 相對(duì)于窗口的定位梆暮。
  2. 包含塊就是 top | right | bottom | left 參考的元素
    • absolute的包含塊指的是:最近的position屬性值不為static的祖先元素
    • relative的包含塊指的是:元素自身
  3. top | right | bottom | left值指的是“定位父元素”border內(nèi)邊到該元素margin外邊的距離服协,“border內(nèi),margin外”。
  4. postion 與文檔流
    • postion : absolute | relative | fixed : 元素脫離文檔流
    • relative : 原本所占的空間仍然占據(jù)文檔流
  5. absolute和fixed?會(huì)將元素重置為區(qū)塊元素啦粹,relative保持原來(lái)類(lèi)型偿荷。
  6. absolute和fixed?不能在設(shè)置float窘游,relative可以。

CSS盒模型

  1. 標(biāo)準(zhǔn)盒模型寬高只計(jì)算content
  2. IE盒模型寬高是border跳纳、padding和content的和
  3. 如果在頁(yè)面開(kāi)頭寫(xiě)了<!doctype...所有瀏覽器都將使用標(biāo)準(zhǔn)盒模型,如果沒(méi)有寫(xiě),那么 在IE下就將會(huì)使用IE盒模型解析盒子,即IE的怪異模式忍饰。
  4. CSS3 box-sizing
    • box-sizing: content-box|border-box|inherit;
    • content-box: 標(biāo)準(zhǔn)盒模型
    • border-box: IE盒模型
    • inherit: 從父元素繼承box-sizing的值

隱藏元素的幾種方法

  1. display:none
    元素在頁(yè)面上將徹底消失,元素本來(lái)占有的空間就會(huì)被其他元素占有寺庄,會(huì)導(dǎo)致瀏覽器的重排和重繪艾蓝。
    不會(huì)觸發(fā)其點(diǎn)擊事件。
  2. visibility:hidden
    隱藏對(duì)應(yīng)的元素斗塘,但是在文檔布局中仍保留原來(lái)的空間赢织。只會(huì)導(dǎo)致瀏覽器重繪而不會(huì)重排。不會(huì)觸發(fā)點(diǎn)擊事件逛拱。
  3. opacity:0
    元素隱藏后依舊占據(jù)著空間敌厘,元素只是隱身了,它依舊存在頁(yè)面中朽合【懔剑可以觸發(fā)點(diǎn)擊事件。
  4. 設(shè)置height曹步,width等盒模型屬性為0
    不常用宪彩,但是可以用來(lái)制作頁(yè)面效果,如jquery的slideUp讲婚。事件觸發(fā)開(kāi)padding尿孔、border大小。
  5. 設(shè)置元素的position與left筹麸,top活合,bottom,right等物赶,將元素移出至屏幕外
  6. 設(shè)置元素的position與z-index白指,將z-index設(shè)置成盡量小的負(fù)數(shù)

能否相應(yīng)事件看的是鼠標(biāo)是否能接觸到

對(duì)動(dòng)畫(huà)的影響:

  1. display:none:完全不受transition屬性的影響,元素立即消失酵紫。
  2. visibility:hidden:元素消失的時(shí)間跟transition屬性設(shè)置的時(shí)間一樣告嘲,但是沒(méi)有動(dòng)畫(huà)效果。
  3. opacity和height等屬性能夠進(jìn)行正常的動(dòng)畫(huà)效果奖地。

CSS中 link 和@import 的區(qū)別是橄唬?

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

position:absolute和float屬性的異同

  1. 共同點(diǎn):
    對(duì)內(nèi)聯(lián)元素設(shè)置floatabsolute屬性缸血,可以讓元素脫離文檔流蜜氨,并且可以設(shè)置其寬高。
  2. 不同點(diǎn):
    float仍會(huì)占據(jù)位置捎泻,position會(huì)覆蓋文檔流中的其他元素飒炎。

CSS 選擇符有哪些?

  1. id選擇器( # myid)
  2. 類(lèi)選擇器(.myclassname)
  3. 標(biāo)簽選擇器(div, h1, p)
  4. 相鄰選擇器(h1 + p)
  5. 子選擇器(ul > li)
  6. 后代選擇器(li a)
  7. 通配符選擇器( * )
  8. 屬性選擇器(a[rel = "external"])
  9. 偽類(lèi)選擇器(a: hover, li:nth-child)

CSS樣式繼承

  • 可繼承的樣式:
    1. font-size
    2. font-family
    3. color
    4. text-indent
  • 不可繼承的樣式:
    1. border
    2. padding
    3. margin
    4. width
    5. height

CSS優(yōu)先級(jí)

!important > 內(nèi)聯(lián) > id > class > tag

CSS3新增偽類(lèi)舉例

  • p:first-of-type 選擇屬于其父元素的首個(gè) <p> 元素的每個(gè) <p> 元素笆豁。
  • p:last-of-type 選擇屬于其父元素的最后 <p> 元素的每個(gè) <p> 元素郎汪。
  • p:only-of-type 選擇屬于其父元素唯一的 <p> 元素的每個(gè) <p> 元素。
  • p:only-child 選擇屬于其父元素的唯一子元素的每個(gè) <p> 元素闯狱。
  • p:nth-child(2) 選擇屬于其父元素的第二個(gè)子元素的每個(gè) <p> 元素煞赢。
  • :enabled :disabled 控制表單控件的禁用狀態(tài)。
  • :checked 單選框或復(fù)選框被選中哄孤。

CSS3有哪些新特性

  • CSS3實(shí)現(xiàn)圓角(border-radius)照筑,陰影(box-shadow)
  • 對(duì)文字加特效(text-shadow、)瘦陈,線(xiàn)性漸變(gradient)凝危,旋轉(zhuǎn)(transform)
  • transform:
    • rotate(9deg) 旋轉(zhuǎn)
    • scale(0.85,0.90) 縮放
    • translate(0px,-30px) 定位
    • skew(-9deg,0deg) 傾斜
  • 增加了更多的CSS選擇器 多背景 rgba
  • 在CSS3中唯一引入的偽元素是::selection.
  • 媒體查詢(xún),多欄布局
  • border-image

對(duì)BFC規(guī)范的理解晨逝?

BFC蛾默,塊級(jí)格式化上下文(Block Fromatting Context)。
浮動(dòng)元素和絕對(duì)定位元素捉貌,非塊級(jí)盒子的塊級(jí)容器(例如 inline-blocks, table-cells,
和 table-captions)支鸡,以及overflow值不為“visiable”的塊級(jí)盒子,
都會(huì)為他們的內(nèi)容創(chuàng)建新的BFC(塊級(jí)格式上下文)趁窃。
一個(gè)創(chuàng)建了新的BFC的盒子是獨(dú)立布局的牧挣,盒子里面的子元素的樣式不會(huì)影響到外面的元素。
在同一個(gè)BFC中的兩個(gè)毗鄰的塊級(jí)盒在垂直方向(和布局方向有關(guān)系)的margin會(huì)發(fā)生折疊醒陆。
(W3C CSS 2.1 規(guī)范中的一個(gè)概念浸踩,它決定了元素如何對(duì)其內(nèi)容進(jìn)行布局,
以及與其他元素的關(guān)系和相互作用统求。)
一個(gè)HTML元素要?jiǎng)?chuàng)建BFC,則滿(mǎn)足下列的任意一個(gè)或多個(gè)條件即可:

  1. float的值不是none据块。
  2. position的值不是static或者relative码邻。
  3. display的值是inline-block、table-cell另假、flex像屋、table-caption或者inline-flex
  4. overflow的值不是visible

BFC可以做什么呢?

  1. 利用BFC避免外邊距折疊
  2. BFC包含浮動(dòng)
  3. 使用BFC避免文字環(huán)繞
  4. 在多列布局中使用BFC

margin折疊

  1. 兩個(gè)相鄰的外邊距都是正數(shù)時(shí)边篮,折疊結(jié)果是它們兩者之間較大的值己莺。
  2. 兩個(gè)相鄰的外邊距都是負(fù)數(shù)時(shí)奏甫,折疊結(jié)果是兩者絕對(duì)值的較大值。
  3. 兩個(gè)外邊距一正一負(fù)時(shí)凌受,折疊結(jié)果是兩者的相加的和阵子。

產(chǎn)生折疊的必備條件:margin必須是鄰接的!

解釋下浮動(dòng)和它的工作原理?清除浮動(dòng)的技巧

浮動(dòng)元素脫離文檔流胜蛉,不占據(jù)空間挠进。浮動(dòng)元素碰到包含它的邊框或者浮動(dòng)元素的邊框停留。

  1. 使用空標(biāo)簽清除浮動(dòng)誊册。
    這種方法是在所有浮動(dòng)標(biāo)簽后面添加一個(gè)空標(biāo)簽 定義css clear:both. 弊端就是增加了無(wú)意義標(biāo)簽领突。
  2. 使用overflow。
    給包含浮動(dòng)元素的父標(biāo)簽添加css屬性 overflow:auto; zoom:1; zoom:1用于兼容IE6案怯。
  3. 使用after偽對(duì)象清除浮動(dòng)君旦。
    該方法只適用于非IE瀏覽器。具體寫(xiě)法可參照以下示例嘲碱。
    .clear-fix:after{
      content: ".";
      height: 0;
      visibility: hidden;
      clear: both;
      display: block;
    }
    
  4. 浮動(dòng)外部元素

浮動(dòng)元素引起的問(wèn)題和解決辦法金砍?

  1. 父元素的高度無(wú)法被撐開(kāi),影響與父元素同級(jí)的元素
  2. 與浮動(dòng)元素同級(jí)的非浮動(dòng)元素(內(nèi)聯(lián)元素)會(huì)跟隨其后
  3. 若非第一個(gè)元素浮動(dòng)悍汛,則該元素之前的元素也需要浮動(dòng)捞魁,否則會(huì)影響頁(yè)面顯示的結(jié)構(gòu)

JavaScript

JavaScript中的七種原始類(lèi)型

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Object
  7. Symbols(ES6)

創(chuàng)建函數(shù)的幾種方式

  1. 聲明函數(shù)
function fn1(){}
  1. 創(chuàng)建匿名函數(shù)表達(dá)式
var fn1=function (){}
// 注意采用這種方法創(chuàng)建的函數(shù)為匿名函數(shù),即沒(méi)有函數(shù)name
getFunctionName(fn1).length;//0
  1. 創(chuàng)建具名函數(shù)表達(dá)式
var fn1=function xxcanghai(){};
// 具名函數(shù)表達(dá)式的函數(shù)名只能在創(chuàng)建函數(shù)內(nèi)部使用
  1. Function構(gòu)造函數(shù)
Function("console.log('test')")
// 這種方法創(chuàng)建的是匿名函數(shù)
  1. 自執(zhí)行函數(shù)
(function(){
  alert(1);
})();
(function fn1(){
  alert(1);
})();
  1. 其他創(chuàng)建函數(shù)的方法
    eval , setTimeout , setInterval 等非常用方法

函數(shù)作用域鏈

測(cè)試1,對(duì)象內(nèi)部的函數(shù)表達(dá)式:

var o={
  fn:function (){
    console.log(fn);
  }
};
o.fn();// ERROR報(bào)錯(cuò)

測(cè)試2,非對(duì)象內(nèi)部的函數(shù)表達(dá)式:

var fn = function() {
  console.log(fn);
};
fn();// 正確
var fnn = function() {
  console.log(fnn);
};
fnn();// 正確

兼容IE的獲取函數(shù)name方法

/**
* 獲取指定函數(shù)的函數(shù)名稱(chēng)(用于兼容IE)
* @param {Function} fun 任意函數(shù)
*/
function getFunctionName(fun) {
  if (fun.name !== undefined) {
    return fun.name;
  }
  var ret = fun.toString();
  ret = ret.substr('function '.length);
  ret = ret.substr(0, ret.indexOf('('));
  return ret;
}

閉包的原理及應(yīng)用

使用閉包主要是為了設(shè)計(jì)私有的方法和變量。
閉包的優(yōu)點(diǎn)是可以避免全局變量的污染,
缺點(diǎn)是閉包會(huì)常駐內(nèi)存,會(huì)增大內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄露离咐。
閉包有三個(gè)特性:

  1. 函數(shù)嵌套函數(shù)
  2. 函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
  3. 參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收

題目一

function fun(n,o) { 
  console.log(o);
  return {
    fun:function(m){
      return fun(m,n);
    } 
  };
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,? 

問(wèn):三行a,b,c的輸出 分別是什么?
答案:

a: undefined,0,0,0  
b: undefined,0,1,2  
c: undefined,0,1,1 

什么情況下會(huì)發(fā)生閉包,為什么需要閉包,什么場(chǎng)景下需要,閉包閉了誰(shuí),怎么釋放被閉包的變量?jī)?nèi)存,閉包的優(yōu)點(diǎn)是什么,缺點(diǎn)是什么等等谱俭。

手寫(xiě)bind函數(shù)

首先會(huì)要求解釋下這個(gè)函數(shù)的作用,以及在什么場(chǎng)景下需要用到它,最后手寫(xiě)一個(gè)Function.bind函數(shù)。 只要掌握核心幾點(diǎn)就沒(méi)問(wèn)題:

  1. Function.bind返回的也是一個(gè)函數(shù),所以注定發(fā)生了閉包,
  2. 在返回的這個(gè)函數(shù)中去調(diào)用一個(gè)其他的函數(shù),這其實(shí)本質(zhì)上就是函數(shù)鉤子(HOOK)

關(guān)于在JS里的函數(shù)鉤子,我認(rèn)為只需要維護(hù)以下三點(diǎn)即可:

  1. 保持函數(shù)的this指向
  2. 保持函數(shù)的所有參數(shù)都傳遞到目標(biāo)函數(shù)
  3. 保持函數(shù)的返回值
    有了以上這幾點(diǎn),這個(gè)函數(shù)就非常好寫(xiě)了,下面是MSDN上的標(biāo)準(zhǔn)Polyfill:
if(!Function.prototype.bind) { 
  Function.prototype.bind = function(oThis) {
    if(typeof this !== "function") {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      thrownewTypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }
    var aArgs = Array.prototype.slice.call(arguments,1),
        fToBind = this,
        fNOP = function(){},// 用于bind后的函數(shù)用于構(gòu)造函數(shù)時(shí)
        fBound = function() {
          return fToBind.apply(this instanceof fNOP ?
          this : oThis || this, aArgs.concat(Array.prototype.slice.call(arguments)));
        };
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound; 
  };
}

定義提升

  1. 題目一:
(function(a){
  console.log(a);
  var a = 10;
  function a(){}; 
}(100));
  1. 題目二:
function Foo() {
  getName = function() {
    alert (1);
  };
  return this;
}
Foo.getName = function() {
  alert (2);
};
Foo.prototype.getName = function() {
  alert (3);
};
var getName = function () {
  alert(4);
};
function getName() {
  alert (5);
}

請(qǐng)寫(xiě)出以下輸出結(jié)果:

Foo.getName();2  
getName();5  
Foo().getName();5  
getName();  
new Foo.getName();2  
new Foo().getName();3  
new new Foo().getName();3

答案:

Foo.getName();//2  
getName();//4  
Foo().getName();//1  
getName();//1  
new Foo.getName();//2  
new Foo().getName();//3  
new new Foo().getName();//3  

第二問(wèn):變量提升宵蛀。
第三問(wèn):函數(shù)中沒(méi)有使用var昆著,因此修改了window對(duì)象。
第五問(wèn):.的優(yōu)先級(jí)高于new的優(yōu)先級(jí)术陶,因此相當(dāng)于new (Foo.getName)();
第六問(wèn):括號(hào)優(yōu)先級(jí)高于new凑懂,(new Foo()).getName();
第七問(wèn):new ((new Foo()).getName)();

new過(guò)程:

  1. 創(chuàng)建一個(gè)空對(duì)象,其prototype是構(gòu)造函數(shù)的prototype梧宫,將構(gòu)造函數(shù)的this指向該對(duì)象
  2. 運(yùn)行構(gòu)造函數(shù)中的內(nèi)容
  3. 返回相應(yīng)值接谨。

構(gòu)造函數(shù)的返回值

  1. 沒(méi)有返回值則按照其他語(yǔ)言一樣返回實(shí)例化對(duì)象。
  2. 若有返回值則檢查其返回值是否為引用類(lèi)型塘匣。如果是非引用類(lèi)型,如基本類(lèi)型 (string,number,boolean,null,undefined)則與無(wú)返回值相同,實(shí)際返回其實(shí)例化對(duì)象脓豪。
  3. 若返回值是引用類(lèi)型,則實(shí)際返回值為這個(gè)引用類(lèi)型。

null和undefined的區(qū)別忌卤?

  • null是一個(gè)表示"無(wú)"的對(duì)象扫夜,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無(wú)"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN笤闯。
  • 當(dāng)聲明的變量還未被初始化時(shí)堕阔,變量的默認(rèn)值為undefined。 null用來(lái)表示尚未存在的對(duì)象颗味,常用來(lái)表示函數(shù)企圖返回一個(gè)不存在的對(duì)象超陆。
  • undefined表示"缺少值",就是此處應(yīng)該有一個(gè)值脱衙,但是還沒(méi)有定義侥猬。典型用法是:
    • 變量被聲明了,但沒(méi)有賦值時(shí)捐韩,就等于undefined退唠。
    • 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供荤胁,該參數(shù)等于undefined瞧预。
    • 對(duì)象沒(méi)有賦值的屬性,該屬性的值為undefined仅政。
    • 函數(shù)沒(méi)有返回值時(shí)垢油,默認(rèn)返回undefined。
  • null表示"沒(méi)有對(duì)象"圆丹,即該處不應(yīng)該有值滩愁。典型用法是:
    • 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象辫封。
    • 作為對(duì)象原型鏈的終點(diǎn)硝枉。

this

.call和.apply的區(qū)別

  • apply()函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是上下文,第二個(gè)參數(shù)是參數(shù)組成的數(shù)組倦微。如果上下文是null妻味,則使用全局對(duì)象代替。例如:
function.apply(this,[1,2,3])
  • call()的第一個(gè)參數(shù)是上下文欣福,后續(xù)是實(shí)例傳入的參數(shù)序列责球,例如:
function.call(this,1,2,3);

哪些操作會(huì)造成內(nèi)存泄漏?

setTimeout 的第一個(gè)參數(shù)使用字符串而非函數(shù)的話(huà)拓劝,會(huì)引發(fā)內(nèi)存泄漏雏逾。
閉包、控制臺(tái)日志郑临、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí)校套,就會(huì)產(chǎn)生一個(gè)循環(huán))

DOM操作

手寫(xiě)事件模型

  1. 事件的三個(gè)階段:捕獲、目標(biāo)牧抵、冒泡。(低版本IE不支持捕獲階段,IE<=8)

  2. js中事件監(jiān)聽(tīng)方法總共有三種:

    • element.addEventListener(type, listener[, useCapture]); // IE6~8不支持
    • element.attachEvent(’on’ + type, listener); // IE6~10犀变,IE11不支持
    • element[’on’ + type] = function(){} // 所有瀏覽器
  3. e的不同

    ?目標(biāo) IE 其他
    ?源 srcElement target
    當(dāng)前 this currentTarget

跨瀏覽器事件處理相關(guān)JS代碼

var EventUtil = {
  // 事件處理程序,3個(gè)參數(shù):要操作的元素妹孙,事件名稱(chēng),事件處理程序函數(shù)
  addHandler: function(element, type, handler) {
    if(element.addEventListener){
      // DOM2級(jí)事件處理程序,false表示事件冒泡階段調(diào)用事件處理程序
      element.addEventListener(type, handler, false);
    }else if(element.attachEvent){
      // IE事件處理程序获枝,記得加“on”
      element.attachEvent("on" + type, handler);
    }else {
      element["on"+type] = handler;
    }
  },
  removeHandler: function(element, type, handler) {
    if(element.removeEventListener){
      element.removeEventListener(type, handler, false);
    }else if(element.detachEvent){
      element.detachEvent("on"+ type, handler);
    }else{
      element["on"+type] = null;
    }
  },
  // 獲得event對(duì)象
  getEvent: function(event) {
    // 主要是為了IE中蠢正,當(dāng)用DOM0級(jí)方法添加事件處理程序時(shí),
    // event對(duì)象是作為windows對(duì)象的一個(gè)屬性存在
    return event ? event : window.event;
  },
  // 獲得事件的目標(biāo)
  getTarget: function(event) {
    return event.target || event.srcElement;
  }省店,
  // 取消事件的默認(rèn)行為
  preventDefault: function(event) {
    if(event.preventDefault){
      event.preventDefault();
    }else{
      event.returnValue = fasle;// IE
    }
  }
  // 阻止事件冒泡,IE不支持事件捕獲嚣崭,所以只能取消事件冒泡
  stopPropagation: function(event) {
    if(event.stopPropagation){
      event.stopPropagation();
    }else{
      event.cancelBubble = true;
    }
  }
};

事件代理/委托

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

  1. 可以大量節(jié)省內(nèi)存占用,減少事件注冊(cè)
  2. 可以實(shí)現(xiàn)當(dāng)新增子對(duì)象時(shí)無(wú)需再次對(duì)其綁定事件,對(duì)于動(dòng)態(tài)內(nèi)容部分尤為合適
// 事件委托
var list = document.getElementById("myLinks");
EventUtil.addHandler(list, "click", function  (event) {
  event = EventUtil.getEvent(event);
  var target = EventUtil.getTarget(event);
  switch(target.id){
    case "1": 
      document.title = "I change the document's title";
      break;
    case "2": 
      location.;
      break;
    case "3": 
      alert('xxx');
      break;
  }
});

實(shí)現(xiàn)事件模型

即寫(xiě)一個(gè)類(lèi)或是一個(gè)模塊,有兩個(gè)函數(shù),一個(gè)bind一個(gè)trigger,
分別實(shí)現(xiàn)綁定事件和觸發(fā)事件,核心需求就是可以對(duì)某一個(gè)事件名稱(chēng)綁定多個(gè)事件響應(yīng)函數(shù),
然后觸發(fā)這個(gè)事件名稱(chēng)時(shí),依次按 綁定順序觸發(fā)相應(yīng)的響應(yīng)函數(shù)。
大致實(shí)現(xiàn)思路就是創(chuàng)建一個(gè)類(lèi)或是匿名函數(shù),
在bind和trigger函數(shù)外層作用域創(chuàng)建一個(gè)字典對(duì)象,用于存儲(chǔ)注冊(cè) 的事件及響應(yīng)函數(shù)列表,
bind時(shí),如果字典沒(méi)有則創(chuàng)建一個(gè),key是事件名稱(chēng),value是數(shù)組,里面放著當(dāng)前注冊(cè)的響應(yīng)函數(shù),
如果字段中有,那么就直接push到數(shù)組即可懦傍。trigger時(shí)調(diào)出來(lái)依次觸發(fā)事件響應(yīng)函數(shù)即可雹舀。
不過(guò)還有很多細(xì)節(jié),比如觸發(fā)響應(yīng)函數(shù)時(shí)的上下文應(yīng)該是什么,觸發(fā)響應(yīng)函數(shù)的參數(shù)列表應(yīng)該是什么,
如果要求把調(diào)用trigger的參數(shù)列表都傳到響應(yīng)函數(shù)中還要考慮到吧arguments對(duì)象轉(zhuǎn)化為純數(shù)
組才行等等。
還有一些面試官會(huì)問(wèn)到事件如何派發(fā)也就是事件廣播(dispatchEvent)等等,這里不再展開(kāi)粗俱。

JS原生AJAX實(shí)現(xiàn)

// XHR(XMLHttpRequest)1級(jí)方法 
/*
* 新建XHR對(duì)象的函數(shù)
* 如果只想支持IE7及更高版本,可以只用原生的XHR實(shí)現(xiàn)
* 即var xhr = new XMLHttpRequest();
*/
function creatXHR() {
  if(typeof XMLHttpRequest != "undefined"){
    //原生XHR對(duì)象
    return new XMLHttpRequest(); 
  }else if(typeof ActiveXObject != "undefined"){
    if(typeof arguments.callee.activeXString != "string"){
      var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0",
        "MSXML2.XMLHttp"],
        i,
        len;
      for(i=0, len=versions.length; i < len; i++){
          ersions[i];
      }
    }
    try{
      new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i];
      break;
    }catch(ex){
      // 處理錯(cuò)誤 
    }
    // MSXML庫(kù)中的ActiveX對(duì)象
    return new ActiveXObject(arguments.callee.activeXString);
  }else{
    throw new Error("No XHR object availabel.")
  }
}
function submitData() {
  var xhr = creatXHR();//新建XHR對(duì)象
  xhr.onreadystatechange = function() {
    if(xhr.readystate == 4){
      // 前一條件代表接收到全部相應(yīng)數(shù)據(jù),而且可以在客戶(hù)端使用了覽器中緩存的版本
      // 后一條件表示請(qǐng)求的資源沒(méi)有修改,可以直接使用瀏
      if ((xhr.status >= 200 && xhr.status < 300)|| xhr.status == 304){
        alert(xhr.responseText);//處理接收到的響應(yīng) 
      }else{
        alert("Request was unsuccessful: " + xhr.status);//請(qǐng)求不成功
      }
    }
  }
  // get方法,名稱(chēng)和值都必須使用encodeURIComponent(),true代表異步發(fā)送請(qǐng)求
  xhr.open("get", "example.txt?name1=value1&name2=value2", true);
  xhr.send(null);
  // post方法
  xhr.open("post", "postexample.php", true);
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//模仿表單提交
  var form = document.getElementById("user-info");
  xhr.send(serialize(form));
}
// XMLHttpRequest 2級(jí)方法 
var xhr = creatXHR(); 
xhr.onload = function() {
  if((xhr.status >= 200 && xhr.status < 300)|| xhr.status == 304){
    alert(xhr.responseText);
  }else{
    alert("Request was unsuccessful: " + xhr.status);//請(qǐng)求不成功
  }
};
xhr.open("get", "altevents.php", true); 
xnr.send(null);

怎樣添加说榆、移除、移動(dòng)寸认、復(fù)制签财、創(chuàng)建和查找節(jié)點(diǎn)。

  1. 創(chuàng)建新節(jié)點(diǎn)
    • createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
    • createElement() //創(chuàng)建一個(gè)具體的元素
    • createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
  2. 添加偏塞、移除唱蒸、替換、插入
    • appendChild()
    • removeChild()
    • replaceChild()
    • insertBefore() //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)
  3. 查找
    • getElementsByTagName() //通過(guò)標(biāo)簽名稱(chēng)
    • getElementsByName() //通過(guò)元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng)灸叼,會(huì)得到一個(gè)數(shù)組神汹,其中包括id等于name值的)
    • getElementById() //通過(guò)元素Id,唯一性
    • querySelector()

documen.writeinnerHTML的區(qū)別

  • document.write只能重繪整個(gè)頁(yè)面
  • innerHTML可以重繪頁(yè)面的一部分

瀏覽器相關(guān)

跨域

正統(tǒng)的跨全域的解決方法大致也就三種:

  1. JSONP
  2. Access Control
  3. 服務(wù)器代理

其他

  • document.domain+iframe
  • window.name
  • window.postMessage

JavaScript跨域總結(jié)與解決辦法
跨域-知識(shí)
跨域資源共享的10種方式
詳解js跨域問(wèn)題

JSONP原理

只要你聊到跨域,就必須聊到JSONP,那么就必須要講一下JSONP的實(shí)現(xiàn)原理,以及你在項(xiàng)目中那個(gè)需求使用了JSONP,這里 簡(jiǎn)單講就是HTML里面所有帶src屬性的標(biāo)簽都可以跨域,如iframe,img,script等怜姿。
所以可以把需要跨域的請(qǐng)求改成用script腳本加載即可,服務(wù)器返回執(zhí)行字符串,但是這個(gè)字符串是在window全局作用域下執(zhí)行 的,你需要把他返回到你的代碼的作用域內(nèi),這里就需要臨時(shí)創(chuàng)建一個(gè)全局的回調(diào)函數(shù),并把到傳到后臺(tái),最后再整合實(shí)際要請(qǐng) 求的數(shù)組,返回給前端,讓瀏覽器直接調(diào)用,用回調(diào)的形式回到你的原代碼流程中慎冤。
基本講到這也就沒(méi)什么要再講的了。

將url的查詢(xún)參數(shù)解析成字典對(duì)象

使用正則:

function getQueryObject(url) {
  url = url == null ? window.location.href : url;
  var search = url.substring(url.lastIndexOf("?") + 1);
  var obj = {};
  var reg = /([^?&=]+)=([^?&=]*)/g;
  search.replace(reg, function(rs,$1,$2){
    var name = decodeURIComponent($1);
    var val = decodeURIComponent($2);
    val = String(val);
    obj[name]=val;
    return rs; 
  });
  return obj;
} 

輸出任意格式的時(shí)間字符串

function formatDate(date, fmt) {
  var o = {
    "Y+": date.getFullYear(),
    "M+": date.getMonth() + 1, // 月份
    "d+": date.getDate(), // 日
    "h+": date.getHours(), // 小時(shí)
    "H+": date.getHours(), // 小時(shí)
    "m+": date.getMinutes(), // 分
    "s+": date.getSeconds(), // 秒
    "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
    "S": date.getMilliseconds() // 毫秒
  };
  for (var k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(RegExp.$1,
        (RegExp.$1.length === 1 || RegExp.$1.length === 4) ?
          (o[k]) : ("00" + o[k]).substr(-RegExp.$1.length));
    }
  }
  return fmt;
}
time = formatDate(time, "YY-MM-dd hh:mm:ss");

函數(shù)節(jié)流

  1. 函數(shù)節(jié)流,就是讓一個(gè)函數(shù)無(wú)法在很短的時(shí)間間隔內(nèi)連續(xù)調(diào)用,只有當(dāng)上一次函數(shù)執(zhí)行后過(guò)了你規(guī)定的時(shí)間間隔,才能進(jìn)行下一次該函數(shù)的調(diào)用
  2. 原理:使用定時(shí)器沧卢,當(dāng)觸發(fā)一個(gè)事件時(shí),先setTimout讓這個(gè)事件延遲一會(huì)再執(zhí)行,如果在這個(gè)時(shí)間間隔內(nèi)又觸發(fā)了事件,那就clear掉原來(lái)的定時(shí)器,再setTimeout一個(gè)新的定時(shí)器延遲一會(huì)執(zhí)行蚁堤。
  3. 實(shí)現(xiàn)一:
function throttle(method, context) {
  clearTimeout(method.tId);
  method.tId = setTimeout(function(){
    method.call(context);
  }, 100);
}
  1. 實(shí)現(xiàn)二:
var throttle = function(fn, delay){
  var timer = null;
  return function(){
    var context = this,
        args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function(){
      fn.apply(context, args);
    }, delay);
  };
};

Cookie的優(yōu)點(diǎn)和弊端

  • 優(yōu)點(diǎn)
    1. 通過(guò)良好的編程,控制保存在cookie中的session對(duì)象的大小。
    2. 通過(guò)加密和安全傳輸技術(shù)(SSL),減少cookie被破解的可能性但狭。
    3. 只在cookie中存放不敏感數(shù)據(jù),即使被盜也不會(huì)有重大損失披诗。
    4. 控制cookie的生命期,使之不會(huì)永遠(yuǎn)有效。偷盜者很可能拿到一個(gè)過(guò)期的cookie立磁。
  • 缺點(diǎn)
    1. Cookie數(shù)量和長(zhǎng)度的限制呈队。
      每個(gè)domain最多只能有20條cookie,每個(gè)cookie長(zhǎng)度不能超過(guò)4KB,否則會(huì)被截掉。
    2. 安全性問(wèn)題唱歧。
      如果cookie被人攔截了,那人就可以取得所有的session信息宪摧。
      即使加密也與事無(wú)補(bǔ),因?yàn)閿r截者并不需要知道cookie的意義,
      他只要原樣轉(zhuǎn)發(fā)cookie就可以達(dá)到目的了粒竖。
    3. 有些狀態(tài)不可能保存在客戶(hù)端。
      例如,為了防止重復(fù)提交表單,我們需要在服務(wù)器端保存一個(gè)計(jì)數(shù)器几于。
      如果我們把這個(gè)計(jì)數(shù)器保存在客戶(hù)端,那么它起不到任何作用蕊苗。

瀏覽器本地存儲(chǔ)

在較高版本的瀏覽器中,js提供了sessionStorage和globalStorage沿彭。
在HTML5中提供了localStorage來(lái)取代globalStorage朽砰。
html5中的Web Storage包括了兩種存儲(chǔ)方式:sessionStorage和localStorage。

  1. sessionStorage用于本地存儲(chǔ)一個(gè)會(huì)話(huà)(session)中的數(shù)據(jù)喉刘,
    這些數(shù)據(jù)只有在同一個(gè)會(huì)話(huà)中的頁(yè)面才能訪問(wèn)并且當(dāng)會(huì)話(huà)結(jié)束后數(shù)據(jù)也隨之銷(xiāo)毀瞧柔。
    因此sessionStorage不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話(huà)級(jí)別的存儲(chǔ)睦裳。
  2. localStorage用于持久化的本地存儲(chǔ)造锅,除非主動(dòng)刪除數(shù)據(jù),否則數(shù)據(jù)是永遠(yuǎn)不會(huì)過(guò)期的推沸。

web storage和cookie的區(qū)別

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

  1. Web Storage是為了更大容量存儲(chǔ)設(shè)計(jì)的备绽,Cookie的大小是受限的。
  2. 每次請(qǐng)求一個(gè)新的頁(yè)面Cookie都會(huì)被發(fā)送過(guò)去鬓催,無(wú)形中浪費(fèi)了帶寬肺素。
  3. cookie需要指定作用域,不可以跨域調(diào)用宇驾。
  4. Web Storage擁有setItem,getItem,removeItem,clear等方法倍靡,cookie需要前端開(kāi)發(fā)者自己封裝setCookie,getCookie课舍。

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

  1. cookie的作用是與服務(wù)器進(jìn)行交互塌西,作為HTTP規(guī)范的一部分而存在 ,
    而Web Storage僅僅是為了在本地“存儲(chǔ)”數(shù)據(jù)而生

cookie 和session 的區(qū)別

  1. cookie數(shù)據(jù)存放在客戶(hù)的瀏覽器上筝尾,session數(shù)據(jù)放在服務(wù)器上捡需。
  2. cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙筹淫。
  3. session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上站辉。當(dāng)訪問(wèn)增多,會(huì)比較占用服務(wù)器的性能损姜。
  4. 單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K饰剥,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

js延遲加載的方式有哪些摧阅?

  • defer和async
  • 動(dòng)態(tài)創(chuàng)建DOM方式(創(chuàng)建script汰蓉,插入到DOM中,加載完畢后callBack)
  • 按需異步載入js

前端性能優(yōu)化

盡量挑會(huì)的說(shuō)棒卷,看yahoo的文章

  1. 網(wǎng)絡(luò)性能優(yōu)化,加快訪問(wèn)速度,瀏覽器并行加載數(shù)量,怎樣實(shí)現(xiàn)原生JS異步載入,CDN加速的原理,
    如何將不同靜態(tài)資源發(fā)布到多個(gè)域名服務(wù)器 上,發(fā)布后這些靜態(tài)字段的url路徑改怎么批量改寫(xiě),
    用什么工具進(jìn)行項(xiàng)目打包,css打包后的相對(duì)路徑怎么轉(zhuǎn)換為絕對(duì)路徑,
    用什么工具進(jìn)行項(xiàng)目模塊依賴(lài)管理,怎么進(jìn)行cookie優(yōu)化等等,

你如何對(duì)網(wǎng)站的文件和資源進(jìn)行優(yōu)化顾孽?

  • 文件合并
  • 文件最小化/文件壓縮
  • 使用 CDN 托管
  • 緩存的使用(多個(gè)域名來(lái)提供緩存)
  • 其他

請(qǐng)說(shuō)出三種減少頁(yè)面加載時(shí)間的方法祝钢。

  1. 優(yōu)化圖片
  2. 圖像格式的選擇(GIF:提供的顏色較少,可用在一些對(duì)顏色要求不高的地方)
  3. 優(yōu)化CSS(壓縮合并css若厚,如margin-top,margin-left...)
  4. 網(wǎng)址后加斜杠(如www.campr.com/目錄太颤,會(huì)判斷這個(gè)“目錄是什么文件類(lèi)型,或者是目錄盹沈。)
  5. 標(biāo)明高度和寬度(如果瀏覽器沒(méi)有找到這兩個(gè)參數(shù),它需要一邊下載圖片一邊計(jì)算大小吃谣,如果圖片很多乞封,瀏覽器需要不斷地調(diào)整頁(yè)面。這不但影響速度岗憋,也影響瀏覽體驗(yàn)肃晚。
    當(dāng)瀏覽器知道了高度和寬度參數(shù)后,即使圖片暫時(shí)無(wú)法顯示仔戈,頁(yè)面上也會(huì)騰出圖片的空位关串,然后繼續(xù)加載后面的內(nèi)容。從而加載時(shí)間快了监徘,瀏覽體驗(yàn)也更好了晋修。)
  6. 減少http請(qǐng)求(合并文件,合并圖片)凰盔。

你都使用哪些工具來(lái)測(cè)試代碼的性能墓卦?

Profiler, JSPerf(http://jsperf.com/nexttick-vs-setzerotimeout-vs-settimeout), Dromaeo

什么是 FOUC(無(wú)樣式內(nèi)容閃爍)?你如何來(lái)避免 FOUC户敬?

FOUC - Flash Of Unstyled Content 文檔樣式閃爍

<style type="text/css" media="all">@import "../fouc.css";</style>

引用CSS文件的@import是造成這個(gè)問(wèn)題的罪魁禍?zhǔn)茁浼簟E會(huì)先加載整個(gè)HTML文檔的DOM,然后再去導(dǎo)入外部的CSS文件尿庐,因此忠怖,在頁(yè)面DOM加載完成到CSS導(dǎo)入完成中間會(huì)有一段時(shí)間頁(yè)面上的內(nèi)容是沒(méi)有樣式的,這段時(shí)間的長(zhǎng)短跟網(wǎng)速抄瑟,電腦速度都有關(guān)系凡泣。
解決方法簡(jiǎn)單的出奇,只要在<head>之間加入一個(gè)<link>或者<script>元素就可以了锐借。

算法

快速排序

數(shù)組去重

設(shè)計(jì)模式

觀察者模式,職責(zé)鏈模式,工廠模式

計(jì)算機(jī)基礎(chǔ)

線(xiàn)程與進(jìn)程的區(qū)別

  • 一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程.
  • 線(xiàn)程的劃分尺度小于進(jìn)程问麸,使得多線(xiàn)程程序的并發(fā)性高。
  • 另外钞翔,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元严卖,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率布轿。
  • 線(xiàn)程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的哮笆。每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口来颤、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能夠獨(dú)立執(zhí)行稠肘,必須依存在應(yīng)用程序中福铅,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。
  • 從邏輯角度來(lái)看项阴,多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中滑黔,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用环揽,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配略荡。

其他

XML和JSON的區(qū)別?

  1. 數(shù)據(jù)體積方面歉胶。
    JSON相對(duì)于XML來(lái)講汛兜,數(shù)據(jù)的體積小,傳遞的速度更快些通今。
  2. 數(shù)據(jù)交互方面粥谬。
    JSON與JavaScript的交互更加方便,更容易解析處理辫塌,更好的數(shù)據(jù)交互漏策。
  3. 數(shù)據(jù)描述方面。
    JSON對(duì)數(shù)據(jù)的描述性比XML較差璃氢。
  4. 傳輸速度方面哟玷。
    JSON的速度要遠(yuǎn)遠(yuǎn)快于XML。

常見(jiàn)兼容性問(wèn)題一也?

  • png24位的圖片在iE6瀏覽器上出現(xiàn)背景巢寡,解決方案是做成PNG8.也可以引用一段腳本處理.
  • 瀏覽器默認(rèn)的margin和padding不同。解決方案是加一個(gè)全局的*{margin:0;padding:0;}來(lái)統(tǒng)一椰苟。
  • IE6雙邊距bug:塊屬性標(biāo)簽float后抑月,又有橫行的margin情況下,在ie6顯示margin比設(shè)置的大舆蝴。
  • 浮動(dòng)ie產(chǎn)生的雙倍距離(IE6雙邊距問(wèn)題:在IE6下,如果對(duì)元素設(shè)置了浮動(dòng)洁仗,同時(shí)又設(shè)置了margin-left或margin-right层皱,margin值會(huì)加倍。)
    #box{ float:left; width:10px; margin:0 0 0 100px;}
    
    這種情況之下IE會(huì)產(chǎn)生20px的距離怎棱,解決方案是在float的標(biāo)簽樣式控制中加入 ——display:inline;將其轉(zhuǎn)化為行內(nèi)屬性。(這個(gè)符號(hào)只有ie6會(huì)識(shí)別)
  • Chrome 中文界面下默認(rèn)會(huì)將小于 12px 的文本強(qiáng)制按照 12px 顯示,可通過(guò)加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.

如何判斷當(dāng)前腳本運(yùn)行在瀏覽器還是node環(huán)境中砸捏?

判斷Global和window對(duì)象谬运,如果不為window垦藏,當(dāng)前腳本沒(méi)有運(yùn)行在瀏覽器中

什么叫優(yōu)雅降級(jí)和漸進(jìn)增強(qiáng)吩谦?

  • 漸進(jìn)增強(qiáng) progressive enhancement:針對(duì)低版本瀏覽器進(jìn)行構(gòu)建頁(yè)面,保證最基本的功能膝藕,然后再針對(duì)高級(jí)瀏覽器進(jìn)行效果、交互等改進(jìn)和追加功能達(dá)到更好的用戶(hù)體驗(yàn)咐扭。
  • 優(yōu)雅降級(jí) graceful degradation:一開(kāi)始就構(gòu)建完整的功能芭挽,然后再針對(duì)低版本瀏覽器進(jìn)行兼容。

正在學(xué)的新知識(shí)

webpack

react

node.js

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝗肪,一起剝皮案震驚了整個(gè)濱河市袜爪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薛闪,老刑警劉巖辛馆,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異豁延,居然都是意外死亡昙篙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)诱咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苔可,“玉大人,你說(shuō)我怎么就攤上這事袋狞》俑ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵苟鸯,是天一觀的道長(zhǎng)同蜻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)早处,這世上最難降的妖魔是什么湾蔓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮陕赃,結(jié)果婚禮上卵蛉,老公的妹妹穿的比我還像新娘颁股。我一直安慰自己,他們只是感情好傻丝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布甘有。 她就那樣靜靜地躺著,像睡著了一般葡缰。 火紅的嫁衣襯著肌膚如雪亏掀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天泛释,我揣著相機(jī)與錄音滤愕,去河邊找鬼。 笑死怜校,一個(gè)胖子當(dāng)著我的面吹牛间影,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茄茁,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼魂贬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了裙顽?” 一聲冷哼從身側(cè)響起付燥,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愈犹,沒(méi)想到半個(gè)月后键科,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漩怎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年勋颖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勋锤。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牙言,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怪得,到底是詐尸還是另有隱情咱枉,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布徒恋,位于F島的核電站蚕断,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏入挣。R本人自食惡果不足惜亿乳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葛假,春花似錦障陶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至带斑,卻和暖如春鼓寺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勋磕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工妈候, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挂滓。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓苦银,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赶站。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墓毒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容