一、HTML和CSS
1、你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什么?
IE: trident內核
Firefox:gecko內核
Safari:webkit內核
Opera:以前是presto內核,Opera現已改用Google Chrome的Blink內核
Chrome:Blink(基於webkit,Google與Opera Software共同開發)
2、每個HTML文件里開頭都有個很重要的東西,Doctype,知道這是干什么的嗎?
<!DOCTYPE> 聲明位於文檔中的最前面的位置,處於 <html> 標簽之前。此標簽可告知瀏覽器文檔使用哪種 HTML 或 XHTML 規范。(重點:告訴瀏覽器按照何種規范解析頁面)
3、Quirks模式是什么?它和Standards模式有什么區別
從IE6開始,引入了Standards模式,標准模式中,瀏覽器嘗試給符合標准的文檔在規范上的正確處理達到在指定瀏覽器中的程度。
在IE6之前CSS還不夠成熟,所以IE5等之前的瀏覽器對CSS的支持很差, IE6將對CSS提供更好的支持,然而這時的問題就來了,因為有很多頁面是基於舊的布局方式寫的,而如果IE6 支持CSS則將令這些頁面顯示不正常,如何在即保證不破壞現有頁面,又提供新的渲染機制呢?
在寫程序時我們也會經常遇到這樣的問題,如何保證原來的接口不變,又提供更強大的功能,尤其是新功能不兼容舊功能時。遇到這種問題時的一個常見做法是增加參數和分支,即當某個參數為真時,我們就使用新功能,而如果這個參數 不為真時,就使用舊功能,這樣就能不破壞原有的程序,又提供新功能。IE6也是類似這樣做的,它將DTD當成了這個“參數”,因為以前的頁面大家都不會去寫DTD,所以IE6就假定 如果寫了DTD,就意味着這個頁面將采用對CSS支持更好的布局,而如果沒有,則采用兼容之前的布局方式。這就是Quirks模式(怪癖模式,詭異模式,怪異模式)。
區別:
總體會有布局、樣式解析和腳本執行三個方面的區別。
盒模型:在W3C標准中,如果設置一個元素的寬度和高度,指的是元素內容的寬度和高度,而在Quirks 模式下,IE的寬度和高度還包含了padding和border。
設置行內元素的高寬:在Standards模式下,給<span>等行內元素設置wdith和height都不會生效,而在quirks模式下,則會生效。
設置百分比的高度:在standards模式下,一個元素的高度是由其包含的內容來決定的,如果父元素沒有設置百分比的高度,子元素設置一個百分比的高度是無效的用margin:0 auto設置水平居中:使用margin:0 auto在standards模式下可以使元素水平居中,但在quirks模式下卻會失效。
(還有很多,答出什么不重要,關鍵是看他答出的這些是不是自己經驗遇到的,還是說都是看文章看的,甚至完全不知道。)
4、div+css的布局較table布局有什么優點?
改版的時候更方便 只要改css文件。
頁面加載速度更快、結構化清晰、頁面顯示簡潔。
表現與結構相分離。
易於優化(seo)搜索引擎更友好,排名更容易靠前。
5、 img的alt與title有何異同? strong與em的異同?
a:alt(alt text):為不能顯示圖像、窗體或applets的用戶代理(UA),alt屬性用來指定替換文字。替換文字的語言由lang屬性指定。(在IE瀏覽器下會在沒有title時把alt當成 tool tip顯示)
title(tool tip):該屬性為設置該屬性的元素提供建議性的信息。
strong:粗體強調標簽,強調,表示內容的重要性
em:斜體強調標簽,更強烈強調,表示內容的強調點
6、你能描述一下漸進增強和優雅降級之間的不同嗎?
漸進增強 progressive enhancement:針對低版本瀏覽器進行構建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 graceful degradation:一開始就構建完整的功能,然后再針對低版本瀏覽器進行兼容。
區別:優雅降級是從復雜的現狀開始,並試圖減少用戶體驗的供給,而漸進增強則是從一個非常基礎的,能夠起作用的版本開始,並不斷擴充,以適應未來環境的需要。降級(功能衰減)意味着往回看;而漸進增強則意味着朝前看,同時保證其根基處於安全地帶。
“優雅降級”觀點
“優雅降級”觀點認為應該針對那些最高級、最完善的瀏覽器來設計網站。而將那些被認為“過時”或有功能缺失的瀏覽器下的測試工作安排在開發周期的最后階段,並把測試對象限定為主流瀏覽器(如 IE、Mozilla 等)的前一個版本。
在這種設計范例下,舊版的瀏覽器被認為僅能提供“簡陋卻無妨 (poor, but passable)” 的瀏覽體驗。你可以做一些小的調整來適應某個特定的瀏覽器。但由於它們並非我們所關注的焦點,因此除了修復較大的錯誤之外,其它的差異將被直接忽略。
“漸進增強”觀點
“漸進增強”觀點則認為應關注於內容本身。
內容是我們建立網站的誘因。有的網站展示它,有的則收集它,有的尋求,有的操作,還有的網站甚至會包含以上的種種,但相同點是它們全都涉及到內容。這使得“漸進增強”成為一種更為合理的設計范例。這也是它立即被 Yahoo! 所采納並用以構建其“分級式瀏覽器支持 (Graded Browser Support)”策略的原因所在。
那么問題來了。現在產品經理看到IE6,7,8網頁效果相對高版本現代瀏覽器少了很多圓角,陰影(CSS3),要求兼容(使用圖片背景,放棄CSS3),你會如何說服他?
7、為什么利用多個域名來存儲網站資源會更有效?
CDN緩存更方便
突破瀏覽器並發限制
節約cookie帶寬
節約主域名的連接數,優化頁面響應速度
防止不必要的安全問題
8、請談一下你對網頁標准和標准制定機構重要性的理解。
網頁標准和標准制定機構都是為了能讓web發展的更‘健康’,開發者遵循統一的標准,降低開發難度,開發成本,SEO也會更好做,也不會因為濫用代碼導致各種BUG、安全問題,最終提高網站易用性。
9、請描述一下cookies,sessionStorage和localStorage的區別?
sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束后數據也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的。
web storage和cookie的區別
Web Storage的概念和cookie相似,區別是它是為了更大容量存儲設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被發送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域調用。
除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是與服務器進行交互,作為HTTP規范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲”數據而生。
10、簡述一下src與href的區別。
src用於替換當前元素,href用於在當前文檔和引用資源之間確立聯系。
src是source的縮寫,指向外部資源的位置,指向的內容將會嵌入到文檔中當前標簽所在位置;在請求src資源時會將其指向的資源下載並應用到文檔內,例如js腳本,img圖片和frame等元素。
<script src =”js.js”></script>
當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,類似於將所指向資源嵌入當前標簽內。這也是為什么將js腳本放在底部而不是頭部。
href是Hypertext Reference的縮寫,指向網絡資源所在位置,建立和當前元素(錨點)或當前文檔(鏈接)之間的鏈接,如果我們在文檔中添加
<link href=”common.css” rel=”stylesheet”/>
那么瀏覽器會識別該文檔為css文件,就會並行下載資源並且不會停止對當前文檔的處理。這也是為什么建議使用link方式來加載css,而不是使用@import方式。
11、知道的網頁制作會用到的圖片格式有哪些?
png-8,png-24,jpeg,gif,svg。
但是上面的那些都不是面試官想要的最后答案。面試官希望聽到是Webp。(是否有關注新技術,新鮮事物)
科普一下Webp:WebP格式,谷歌(google)開發的一種旨在加快圖片加載速度的圖片格式。圖片壓縮體積大約只有JPEG的2/3,並能節省大量的服務器帶寬資源和數據空間。Facebook Ebay等知名網站已經開始測試並使用WebP格式。
在質量相同的情況下,WebP格式圖像的體積要比JPEG格式圖像小40%
12、知道什么是微格式嗎?談談理解。在前端構建中應該考慮微格式嗎?
微格式(Microformats)是一種讓機器可讀的語義化XHTML詞匯的集合,是結構化數據的開放標准。是為特殊應用而制定的特殊格式。
優點:將智能數據添加到網頁上,讓網站內容在搜索引擎結果界面可以顯示額外的提示。(應用范例:豆瓣,有興趣自行google)
13、在css/js代碼上線之后開發人員經常會優化性能,從用戶刷新網頁開始,一次js請求一般情況下有哪些地方會有緩存處理?
答案:dns緩存,cdn緩存,瀏覽器緩存,服務器緩存。
14、一個頁面上有大量的圖片(大型電商網站),加載很慢,你有哪些方法優化這些圖片的加載,給用戶更好的體驗。
圖片懶加載,在頁面上的未可視區域可以添加一個滾動條事件,判斷圖片位置與瀏覽器頂端的距離與頁面的距離,如果前者小於后者,優先加載。
如果為幻燈片、相冊等,可以使用圖片預加載技術,將當前展示圖片的前一張和后一張優先下載。
如果圖片為css圖片,可以使用CSSsprite,SVGsprite,Iconfont、Base64等技術。
如果圖片過大,可以使用特殊編碼的圖片,加載時會先加載一張壓縮的特別厲害的縮略圖,以提高用戶體驗。
如果圖片展示區域小於圖片的真實大小,則因在服務器端根據業務需要先行進行圖片壓縮,圖片壓縮后大小與展示一致。
15、你如何理解HTML結構的語義化?
去掉或樣式丟失的時候能讓頁面呈現清晰的結構:
html本身是沒有表現的,我們看到例如<h1>是粗體,字體大小2em,加粗;<strong>是加粗的,不要認為這是html的表現,這些其實html默認的css樣式在起作用,所以去掉或樣式丟失的時候能讓頁面呈現清晰的結構不是語義化的HTML結構的優點,但是瀏覽器都有有默認樣式,默認樣式的目的也是為了更好的表達html的語義,可以說瀏覽器的默認樣式和語義化的HTML結構是不可分割的。
屏幕閱讀器(如果訪客有視障)會完全根據你的標記來“讀”你的網頁.
例如,如果你使用的含語義的標記,屏幕閱讀器就會“逐個拼出”你的單詞,而不是試着去對它完整發音.
PDA、手機等設備可能無法像普通電腦的瀏覽器一樣來渲染網頁(通常是因為這些設備對CSS的支持較弱)
使用語義標記可以確保這些設備以一種有意義的方式來渲染網頁.理想情況下,觀看設備的任務是符合設備本身的條件來渲染網頁.
語義標記為設備提供了所需的相關信息,就省去了你自己去考慮所有可能的顯示情況(包括現有的或者將來新的設備).例如,一部手機可以選擇使一段標記了標題的文字以粗體顯示.而掌上電腦可能會以比較大的字體來顯示.無論哪種方式一旦你對文本標記為標題,您就可以確信讀取設備將根據其自身的條件來合適地顯示頁面.
搜索引擎的爬蟲也依賴於標記來確定上下文和各個關鍵字的權重
過去你可能還沒有考慮搜索引擎的爬蟲也是網站的“訪客”,但現在它們他們實際上是極其寶貴的用戶.沒有他們的話,搜索引擎將無法索引你的網站,然后一般用戶將很難過來訪問.
你的頁面是否對爬蟲容易理解非常重要,因為爬蟲很大程度上會忽略用於表現的標記,而只注重語義標記.
因此,如果頁面文件的標題被標記,而不是,那么這個頁面在搜索結果的位置可能會比較靠后.除了提升易用性外,語義標記有利於正確使用CSS和JavaScript,因為其本身提供了許多“鈎鈎”來應用頁面的樣式與行為.
SEO主要還是靠你網站的內容和外部鏈接的。
便於團隊開發和維護
W3C給我們定了一個很好的標准,在團隊中大家都遵循這個標准,可以減少很多差異化的東西,方便開發和維護,提高開發效率,甚至實現模塊化開發。
16、談談以前端角度出發做好SEO需要考慮什么?
了解搜索引擎如何抓取網頁和如何索引網頁
你需要知道一些搜索引擎的基本工作原理,各個搜索引擎之間的區別,搜索機器人(SE robot 或叫 web crawler)如何進行工作,搜索引擎如何對搜索結果進行排序等等。
Meta標簽優化
主要包括主題(Title),網站描述(Description),和關鍵詞(Keywords)。還有一些其它的隱藏文字比如Author(作者),Category(目錄),Language(編碼語種)等。
如何選取關鍵詞並在網頁中放置關鍵詞
搜索就得用關鍵詞。關鍵詞分析和選擇是SEO最重要的工作之一。首先要給網站確定主關鍵詞(一般在5個上下),然后針對這些關鍵詞進行優化,包括關鍵詞密度(Density),相關度(Relavancy),突出性(Prominency)等等。
了解主要的搜索引擎
雖然搜索引擎有很多,但是對網站流量起決定作用的就那么幾個。比如英文的主要有Google,Yahoo,Bing等;中文的有百度,搜狗,有道等。不同的搜索引擎對頁面的抓取和索引、排序的規則都不一樣。還要了解各搜索門戶和搜索引擎之間的關系,比如AOL網頁搜索用的是Google的搜索技術,MSN用的是Bing的技術。
主要的互聯網目錄
Open Directory自身不是搜索引擎,而是一個大型的網站目錄,他和搜索引擎的主要區別是網站內容的收集方式不同。目錄是人工編輯的,主要收錄網站主頁;搜索引擎是自動收集的,除了主頁外還抓取大量的內容頁面。
按點擊付費的搜索引擎
搜索引擎也需要生存,隨着互聯網商務的越來越成熟,收費的搜索引擎也開始大行其道。最典型的有Overture和百度,當然也包括Google的廣告項目Google Adwords。越來越多的人通過搜索引擎的點擊廣告來定位商業網站,這里面也大有優化和排名的學問,你得學會用最少的廣告投入獲得最多的點擊。
搜索引擎登錄
網站做完了以后,別躺在那里等着客人從天而降。要讓別人找到你,最簡單的辦法就是將網站提交(submit)到搜索引擎。如果你的是商業網站,主要的搜索引擎和目錄都會要求你付費來獲得收錄(比如Yahoo要299美元),但是好消息是(至少到目前為止)最大的搜索引擎Google目前還是免費,而且它主宰着60%以上的搜索市場。
鏈接交換和鏈接廣泛度(Link Popularity)
網頁內容都是以超文本(Hypertext)的方式來互相鏈接的,網站之間也是如此。除了搜索引擎以外,人們也每天通過不同網站之間的鏈接來Surfing(“沖浪”)。其它網站到你的網站的鏈接越多,你也就會獲得更多的訪問量。更重要的是,你的網站的外部鏈接數越多,會被搜索引擎認為它的重要性越大,從而給你更高的排名。
合理的標簽使用
17、有哪項方式可以對一個DOM設置它的CSS樣式?
外部樣式表,引入一個外部css文件
內部樣式表,將css代碼放在 <head> 標簽內部
內聯樣式,將css樣式直接定義在 HTML 元素內部
18、CSS都有哪些選擇器?
派生選擇器(用HTML標簽申明)
id選擇器(用DOM的ID申明)
類選擇器(用一個樣式類名申明)
屬性選擇器(用DOM的屬性申明,屬於CSS2,IE6不支持,不常用,不知道就算了)
除了前3種基本選擇器,還有一些擴展選擇器,包括
后代選擇器(利用空格間隔,比如div .a{ })
群組選擇器(利用逗號間隔,比如p,div,#a{ })
那么問題來了,CSS選擇器的優先級是怎么樣定義的?
基本原則:
一般而言,選擇器越特殊,它的優先級越高。也就是選擇器指向的越准確,它的優先級就越高。
復雜的計算方法:
用1表示派生選擇器的優先級
用10表示類選擇器的優先級
用100標示ID選擇器的優先級
div.test1 .span var 優先級 1+10 +10 +1
span#xxx .songs li 優先級1+100 + 10 + 1
#xxx li 優先級 100 +1
那么問題來了,看下列代碼,<p>標簽內的文字是什么顏色的?
<style>
.classA{ color:blue;}
.classB{ color:red;}
</style>
<body>
<p class='classB classA'> 123 </p>
</body>
答案:red。與樣式定義在文件中的先后順序有關,即是后面的覆蓋前面的,與在<p class=’classB classA’>中的先后關系無關。
19、CSS中可以通過哪些屬性定義,使得一個DOM元素不顯示在瀏覽器可視范圍內?
最基本的:
設置display屬性為none,或者設置visibility屬性為hidden
技巧性:
設置寬高為0,設置透明度為0,設置z-index位置在-1000
20、超鏈接訪問過后hover樣式就不出現的問題是什么?如何解決?
答案:被點擊訪問過的超鏈接樣式不在具有hover和active了,解決方法是改變CSS屬性的排列順序: L-V-H-A(link,visited,hover,active)
21、什么是Css Hack?ie6,7,8的hack分別是什么?
答案:針對不同的瀏覽器寫不同的CSS code的過程,就是CSS hack。
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
#test { width:300px; height:300px; background-color:blue; /*firefox*/ background-color:red\9; /*all ie*/ background-color:yellow; /*ie8*/ +background-color:pink; /*ie7*/ _background-color:orange; /*ie6*/ } :root #test { background-color:purple\9; } /*ie9*/ @media all and (min-width:0px){ #test {background-color:black;} } /*opera*/ @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} } /*chrome and safari*/ |
22、請用Css寫一個簡單的幻燈片效果頁面
答案:知道是要用css3。使用animation動畫實現一個簡單的幻燈片效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/**HTML**/ div.ani /**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow: hidden; box-shadow:0 0 5px rgba(0,0,0,1); background-size: cover; background-position: center; -webkit-animation-name: "loops"; -webkit-animation-duration: 20s; -webkit-animation-iteration-count: infinite; } @-webkit-keyframes "loops" { 0% { background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat; } 25% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat; } 50% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat; } 75% { background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat; } 100% { background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat; } } |
24、行內元素和塊級元素的具體區別是什么?行內元素的padding和margin可設置嗎?
塊級元素(block)特性:
總是獨占一行,表現為另起一行開始,而且其后的元素也必須另起一行顯示;
寬度(width)、高度(height)、內邊距(padding)和外邊距(margin)都可控制;
內聯元素(inline)特性:
和相鄰的內聯元素在同一行;
寬度(width)、高度(height)、內邊距的top/bottom(padding-top/padding-bottom)和外邊距的top/bottom(margin-top/margin-bottom)都不可改變(也就是padding和margin的left和right是可以設置的),就是里面文字或圖片的大小。
那么問題來了,瀏覽器還有默認的天生inline-block元素(擁有內在尺寸,可設置高寬,但不會自動換行),有哪些?
答案:<input> 、<img> 、<button> 、<texterea> 、<label>。
25、什么是外邊距重疊?重疊的結果是什么?
外邊距重疊就是margin-collapse。
在CSS當中,相鄰的兩個盒子(可能是兄弟關系也可能是祖先關系)的外邊距可以結合成一個單獨的外邊距。這種合並外邊距的方式被稱為折疊,並且因而所結合成的外邊距稱為折疊外邊距。
折疊結果遵循下列計算規則:
兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值。
兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值。
兩個外邊距一正一負時,折疊結果是兩者的相加的和。
26、rgba()和opacity的透明效果有什么不同?
rgba()和opacity都能實現透明效果,但最大的不同是opacity作用於元素,以及元素內的所有內容的透明度,
而rgba()只作用於元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)
27、css中可以讓文字在垂直和水平方向上重疊的兩個屬性是什么?
垂直方向:line-height
水平方向:letter-spacing
那么問題來了,關於letter-spacing的妙用知道有哪些么?
答案:可以用於消除inline-block元素間的換行符空格間隙問題。
28、如何垂直居中一個浮動元素?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 方法一:已知元素的高寬 #div1{ background-color:#6699FF; width:200px; height:200px; position: absolute; //父元素需要相對定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; }
//方法二:未知元素的高寬
#div1{ width: 200px; height: 200px; background-color: #6699FF;
margin:auto; position: absolute; //父元素需要相對定位 left: 0; top: 0; right: 0; bottom: 0; } |
那么問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
1 2 3 4 5 6 |
#container //<img>的容器設置如下 { display:table-cell; text-align:center; vertical-align:middle; } |
29、px和em的區別。
px和em都是長度單位,區別是,px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,並且em會繼承父級元素的字體大小。
瀏覽器的默認字體高都是16px。所以未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。
30、描述一個”reset”的CSS文件並如何使用它。知道normalize.css嗎?你了解他們的不同之處?
重置樣式非常多,凡是一個前端開發人員肯定有一個常用的重置CSS文件並知道如何使用它們。他們是盲目的在做還是知道為什么這么做呢?原因是不同的瀏覽器對一些元素有不同的默認樣式,如果你不處理,在不同的瀏覽器下會存在必要的風險,或者更有戲劇性的性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置所有的樣式風格,但僅提供了一套合理的默認樣式值。既能讓眾多瀏覽器達到一致和合理,但又不擾亂其他的東西(如粗體的標題)。
在這一方面,無法做每一個復位重置。它也確實有些超過一個重置,它處理了你永遠都不用考慮的怪癖,像HTML的audio元素不一致或line-height不一致。
31、Sass、LESS是什么?大家為什么要使用他們?
他們是CSS預處理器。他是CSS上的一種抽象層。他們是一種特殊的語法/語言編譯成CSS。
例如Less是一種動態樣式語言. 將CSS賦予了動態語言的特性,如變量,繼承,運算, 函數. LESS 既可以在客戶端上運行 (支持IE 6+, Webkit, Firefox),也可一在服務端運行 (借助 Node.js)。
為什么要使用它們?
結構清晰,便於擴展。
可以方便地屏蔽瀏覽器私有語法差異。這個不用多說,封裝對瀏覽器語法差異的重復處理,減少無意義的機械勞動。
可以輕松實現多重繼承。
完全兼容 CSS 代碼,可以方便地應用到老項目中。LESS 只是在 CSS 語法上做了擴展,所以老的 CSS 代碼也可以與 LESS 代碼一同編譯。
32、display:none與visibility:hidden的區別是什么?
display : 隱藏對應的元素但不擠占該元素原來的空間。
visibility: 隱藏對應的元素並且擠占該元素原來的空間。
即是,使用CSS display:none屬性后,HTML元素(對象)的寬度、高度等各種屬性值都將“丟失”;而使用visibility:hidden屬性后,HTML元素(對象)僅僅是在視覺上看不見(完全透明),而它所占據的空間位置仍然存在。
34、CSS中link和@import的區別是:
Link屬於html標簽,而@import是CSS中提供的
在頁面加載的時候,link會同時被加載,而@import引用的CSS會在頁面加載完成后才會加載引用的CSS
@import只有在ie5以上才可以被識別,而link是html標簽,不存在瀏覽器兼容性問題
Link引入樣式的權重大於@import的引用(@import是將引用的樣式導入到當前的頁面中)
35、簡介盒子模型:
CSS的盒子模型有兩種:IE盒子模型、標准的W3C盒子模型模型
盒模型:內容、內邊距、外邊距(一般不計入盒子實際寬度)、邊框
36、為什么要初始化樣式?
由於瀏覽器兼容的問題,不同的瀏覽器對標簽的默認樣式值不同,若不初始化會造成不同瀏覽器之間的顯示差異
但是初始化CSS會對搜索引擎優化造成小影響
37、BFC是什么?
BFC(塊級格式化上下文),一個創建了新的BFC的盒子是獨立布局的,盒子內元素的布局不會影響盒子外面的元素。在同一個BFC中的兩個相鄰的盒子在垂直方向發生margin重疊的問題
BFC是指瀏覽器中創建了一個獨立的渲染區域,該區域內所有元素的布局不會影響到區域外元素的布局,這個渲染區域只對塊級元素起作用
38、html語義化是什么?
當頁面樣式加載失敗的時候能夠讓頁面呈現出清晰的結構
有利於seo優化,利於被搜索引擎收錄(更便於搜索引擎的爬蟲程序來識別)
便於項目的開發及維護,使html代碼更具有可讀性,便於其他設備解析。
39、Doctype的作用?嚴格模式與混雜模式的區別?
<!DOCTYPE>用於告知瀏覽器該以何種模式來渲染文檔
嚴格模式下:頁面排版及JS解析是以該瀏覽器支持的最高標准來執行
混雜模式:不嚴格按照標准執行,主要用來兼容舊的瀏覽器,向后兼容
40、IE的雙邊距BUG:塊級元素float后設置橫向margin,ie6顯示的margin比設置的較大。解決:加入_display:inline
41、HTML與XHTML——二者有什么區別?
1. 所有的標記都必須要有一個相應的結束標記
2. 所有標簽的元素和屬性的名字都必須使用小寫
3. 所有的 XML 標記都必須合理嵌套
4. 所有的屬性必須用引號 "" 括起來
5. 把所有 < 和 & 特殊符號用編碼表示
6. 給所有屬性賦一個值
7. 不要在注釋內容中使用 "--"
8. 圖片必須有說明文字
42、html常見兼容性問題?
1.雙邊距BUG float引起的 使用display
2.3像素問題 使用float引起的 使用dislpay:inline -3px
3.超鏈接hover 點擊后失效 使用正確的書寫順序 link visited hover active
4.Ie z-index問題 給父級添加position:relative
5.Png 透明 使用js代碼 改
6.Min-height 最小高度 !Important 解決’
7.select 在ie6下遮蓋 使用iframe嵌套
8.為什么沒有辦法定義1px左右的寬度容器(IE6默認的行高造成的,使用over:hidden,zoom:0.08 line-height:1px)
9.IE5-8不支持opacity,解決辦法:
.opacity {
opacity: 0.4
filter: alpha(opacity=60); /* for IE5-7 */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; /* for IE 8*/
}
10. IE6不支持PNG透明背景,解決辦法: IE6下使用gif圖片
43、對WEB標准以及W3C的理解與認識
答:標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外 鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維 護、改版方便,不需要變動頁面內容、提供打印版本而不需要復制內容、提高網站易用性。
44、行內元素有哪些?塊級元素有哪些?CSS的盒模型?
答:塊級元素:div p h1 h2 h3 h4 form ul
行內元素: a b br i span input select
Css盒模型:內容,border ,margin,padding
45、前端頁面有哪三層構成,分別是什么?作用是什么?
答:結構層 Html 表示層 CSS 行為層 js。
46、Doctype作用? 嚴格模式與混雜模式-如何觸發這兩種模式,區分它們有何意義?
(1)、<!DOCTYPE> 聲明位於文檔中的最前面,處於 <html> 標簽之前。告知瀏覽器的解析器,用什么文檔類型 規范來解析這個文檔。
(2)、嚴格模式的排版和 JS 運作模式是 以該瀏覽器支持的最高標准運行。
(3)、在混雜模式中,頁面以寬松的向后兼容的方式顯示。模擬老式瀏覽器的行為以防止站點無法工作。
(4)、DOCTYPE不存在或格式不正確會導致文檔以混雜模式呈現。
47、行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?
(1)CSS規范規定,每個元素都有display屬性,確定該元素的類型,每個元素都有默認的display值,比如div默認display屬性值為“block”,成為“塊級”元素;span默認display屬性值為“inline”,是“行內”元素。
(2)行內元素有:a b span img input select strong(強調的語氣) 塊級元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
(3)知名的空元素:
<br><hr><img><input><link><meta>鮮為人知的是: <area><base><col><command>
<embed><keygen><param><source><track><wbr>
48、CSS的盒子模型?
(1)兩種, IE 盒子模型、標准 W3C 盒子模型;IE 的content部分包含了 border 和 pading;
(2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border).
49、CSS 選擇符有哪些?哪些屬性可以繼承?優先級算法如何計算? CSS3新增偽類有那些?
* 1.id選擇器( # myid)
2.類選擇器(.myclassname)
3.標簽選擇器(div, h1, p)
4.相鄰選擇器(h1 + p)
5.子選擇器(ul < li)
6.后代選擇器(li a)
7.通配符選擇器( * )
8.屬性選擇器(a[rel = "external"])
9.偽類選擇器(a: hover, li: nth - child)
* 可繼承: font-size font-family color, UL LI DL DD DT;
* 不可繼承 :border padding margin width height ;
* 優先級就近原則,樣式定義最近者為准;
* 載入樣式以最后載入的定位為准;
優先級為:
!important > id > class > tag
important 比 內聯優先級高
CSS3新增偽類舉例:
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最后 <p> 元素的每個 <p> 元素。
p:only-of-type 選擇屬於其父元素唯一的 <p> 元素的每個 <p> 元素。
p:only-child 選擇屬於其父元素的唯一子元素的每個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或復選框被選中。
50、如何居中div,如何居中一個浮動元素?
給div設置一個寬度,然后添加margin:0 auto屬性
div{
width:200px;
margin:0 auto;
}
居中一個浮動元素
確定容器的寬高 寬500 高 300 的層
設置層的外邊距
.div {
Width:500px ; height:300px;//高度可以不設
Margin: -150px 0 0 -250px;
position:relative;相對定位
background-color:pink;//方便看效果
left:50%;
top:50%;
}
51、瀏覽器的內核分別是什么?經常遇到的瀏覽器的兼容性有哪些?原因,解決方法是什么,常用hack的技巧 ?
* IE瀏覽器的內核Trident、 Mozilla的Gecko、google的WebKit、Opera內核Presto;
* png24為的圖片在iE6瀏覽器上出現背景,解決方案是做成PNG8.
* 瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。
* IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在ie6顯示margin比設置的大。
浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 100px;}
這種情況之下IE會產生20px的距離,解決方案是在float的標簽樣式控制中加入 ——_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
漸進識別的方式,從總體中逐漸排除局部。
首先,巧妙的使用“\9”這一標記,將IE游覽器從所有情況中分離出來。
接着,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
css
.bb{
background-color:#f1ee18;/*所有識別*/
.background-color:#00deff\9; /*IE6、7、8識別*/
+background-color:#a200ff;/*IE6、7識別*/
_background-color:#1e0bd1;/*IE6識別*/
}
* IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,
也可以使用getAttribute()獲取自定義屬性;
Firefox下,只能使用getAttribute()獲取自定義屬性.
解決方法:統一通過getAttribute()獲取自定義屬性.
* IE下,even對象有x,y屬性,但是沒有pageX,pageY屬性;
Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.
* (條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。
* Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示, 可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.
超鏈接訪問過后hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active了解決方法是改變CSS屬性的排列順序:
L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
52、列出display的值,說明他們的作用。position的值, relative和absolute定位原點是?
1. block 象塊類型元素一樣顯示。
none 缺省值。向行內元素類型一樣顯示。
inline-block 象行內元素一樣顯示,但其內容象塊類型元素一樣顯示。
list-item 象塊類型元素一樣顯示,並添加樣式列表標記。
2. position的值
*absolute
生成絕對定位的元素,相對於 static 定位以外的第一個父元素進行定位。
*fixed (老IE不支持)
生成絕對定位的元素,相對於瀏覽器窗口進行定位。
* relative
生成相對定位的元素,相對於其正常位置進行定位。
* static 默認值。沒有定位,元素出現在正常的流中
*(忽略 top, bottom, left, right z-index 聲明)。
* inherit 規定從父元素繼承 position 屬性的值。
53、absolute的containing block計算方式跟正常流有什么不同?
54、position跟display、margin collapse、overflow、float這些特性相互疊加后會怎么樣?
55、對WEB標准以及W3C的理解與認識
標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外 鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維 護、改版方便,不需要變動頁面內容、提供打印版本而不需要復制內容、提高網站易用性;
56、css的基本語句構成是?
選擇器{屬性1:值1;屬性2:值2;……}
57、瀏覽器標准模式和怪異模式之間的區別是什么?
盒子模型 渲染模式的不同
使用 window.top.document.compatMode 可顯示為什么模式
58、CSS中可以通過哪些屬性定義,使得一個DOM元素不顯示在瀏覽器可視范圍內?
最基本的:
設置display屬性為none,或者設置visibility屬性為hidden
技巧性:
設置寬高為0,設置透明度為0,設置z-index位置在-1000
59、超鏈接訪問過后hover樣式就不出現的問題是什么?如何解決?
答案:被點擊訪問過的超鏈接樣式不在具有hover和active了,解決方法是改變CSS屬性的排列順序: L-V-H-A(link,visited,hover,active)
60、什么是Css Hack?ie6,7,8的hack分別是什么?
答案:針對不同的瀏覽器寫不同的CSS code的過程,就是CSS hack。
示例如下:
#test {
width:300px;
height:300px;
background-color:blue; /*firefox*/
background-color:red\9; /*all ie*/
background-color:yellow\0; /*ie8*/
+background-color:pink; /*ie7*/
_background-color:orange; /*ie6*/ }
:root #test { background-color:purple\9; } /*ie9*/
@media all and (min-width:0px){ #test {background-color:black\0;} } /*opera*/
@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} } /*chrome and safari*/
62、請用Css寫一個簡單的幻燈片效果頁面
答案:知道是要用css3。使用animation動畫實現一個簡單的幻燈片效果。
/**HTML**/
div.ani
/**css**/
.ani{
width:480px;
height:320px;
margin:50px auto;
overflow: hidden;
box-shadow:0 0 5px rgba(0,0,0,1);
background-size: cover;
background-position: center;
-webkit-animation-name: "loops";
-webkit-animation-duration: 20s;
-webkit-animation-iteration-count: infinite;
}
@-webkit-keyframes "loops" {
0% { background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat;
}
25% {
background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat;
}
50% {
background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat;
}
75% {
background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat;
}
100% {
background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat;
}
}
63、行內元素和塊級元素的具體區別是什么?行內元素的padding和margin可設置嗎?
塊級元素(block)特性:
- 總是獨占一行,表現為另起一行開始,而且其后的元素也必須另起一行顯示;
- 寬度(width)、高度(height)、內邊距(padding)和外邊距(margin)都可控制;
內聯元素(inline)特性:
- 和相鄰的內聯元素在同一行;
- 寬度(width)、高度(height)、內邊距的top/bottom(padding-top/padding-bottom)和外邊距的top/bottom(margin-top/margin-bottom)都不可改變(也就是padding和margin的left和right是可以設置的),就是里面文字或圖片的大小。
那么問題來了,瀏覽器還有默認的天生inline-block元素(擁有內在尺寸,可設置高寬,但不會自動換行),有哪些?
答案:<input> 、<img> 、<button> 、<textarea> 、<label>
64、什么是外邊距重疊?重疊的結果是什么?
答案:
外邊距重疊就是margin-collapse。
在CSS當中,相鄰的兩個盒子(可能是兄弟關系也可能是祖先關系)的外邊距可以結合成一個單獨的外邊距。這種合並外邊距的方式被稱為折疊,並且因而所結合成的外邊距稱為折疊外邊距。
折疊結果遵循下列計算規則:
- 兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值。
- 兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值。
- 兩個外邊距一正一負時,折疊結果是兩者的相加的和。
65、rgba()和opacity的透明效果有什么不同?
rgba()和opacity都能實現透明效果,但最大的不同是opacity作用於元素,以及元素內的所有內容的透明度,
而rgba()只作用於元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)
66、css中可以讓文字在垂直和水平方向上重疊的兩個屬性是什么?
垂直方向:line-height
水平方向:letter-spacing
那么問題來了,關於letter-spacing的妙用知道有哪些么?
答案:可以用於消除inline-block元素間的換行符空格間隙問題。
67、如何垂直居中一個浮動元素?
// 方法一:已知元素的高寬
#div1{
background-color:#6699FF;
width:200px;
height:200px;
position: absolute; //父元素需要相對定位
top: 50%;
left: 50%;
margin-top:-100px ; //二分之一的height,width
margin-left: -100px;
}
//方法二:未知元素的高寬
#div1{
width: 200px;
height: 200px;
background-color: #6699FF;
margin:auto;
position: absolute; //父元素需要相對定位
left: 0;
top: 0;
right: 0;
bottom: 0;
}
那么問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
#container //<img>的容器設置如下
{
display:table-cell;
text-align:center;
vertical-align:middle;
}
68、描述一個"reset"的CSS文件並如何使用它。知道normalize.css
嗎?你了解他們的不同之處?
重置樣式非常多,凡是一個前端開發人員肯定有一個常用的重置CSS文件並知道如何使用它們。他們是盲目的在做還是知道為什么這么做呢?原因是不同的瀏覽器對一些元素有不同的默認樣式,如果你不處理,在不同的瀏覽器下會存在必要的風險,或者更有戲劇性的性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置所有的樣式風格,但僅提供了一套合理的默認樣式值。既能讓眾多瀏覽器達到一致和合理,但又不擾亂其他的東西(如粗體的標題)。
在這一方面,無法做每一個復位重置。它也確實有些超過一個重置,它處理了你永遠都不用考慮的怪癖,像HTML的audio
元素不一致或line-height
不一致。
69、說display屬性有哪些?可以做什么?
display:block行內元素轉換為塊級元素
display:inline塊級元素轉換為行內元素
display:inline-block轉為內聯元素
70、哪些css屬性可以繼承?
可繼承: font-size font-family color, ul li dl dd dt;
不可繼承 :border padding margin width height ;
71、css優先級算法如何計算?
!important > id > class > 標簽
!important 比 內聯優先級高
*優先級就近原則,樣式定義最近者為准;
*以最后載入的樣式為准;
72、b標簽和strong標簽,i標簽和em標簽的區別?
后者有語義,前者則無。
73、有那些行內元素、有哪些塊級元素、盒模型?
1.內聯元素(inline element)
a – 錨點
abbr – 縮寫
acronym – 首字
b – 粗體(不推薦)
big – 大字體
br – 換行
em – 強調
font – 字體設定(不推薦)
i – 斜體
img – 圖片
input – 輸入框
label – 表格標簽
s – 中划線(不推薦)
select – 項目選擇
small – 小字體文本
span – 常用內聯容器,定義文本內區塊
strike – 中划線
strong – 粗體強調
sub – 下標
sup – 上標
textarea – 多行文本輸入框
tt – 電傳文本
u – 下划線
var – 定義變量
2、塊級元素
address – 地址
blockquote – 塊引用
center – 舉中對齊塊
dir – 目錄列表
div – 常用塊級容易,也是css layout的主要標簽
dl – 定義列表
fieldset – form控制組
form – 交互表單
h1 – 大標題
h2 – 副標題
h3 – 3級標題
h4 – 4級標題
h5 – 5級標題
h6 – 6級標題
hr – 水平分隔線
isindex – input prompt
menu – 菜單列表
noframes – frames可選內容,(對於不支持frame的瀏覽器顯示此區塊內容)
noscript – )可選腳本內容(對於不支持script的瀏覽器顯示此內容)
ol – 排序表單
p – 段落
pre – 格式化文本
table – 表格
ul – 非排序列表
3.CSS盒子模型包含四個部分組成:
內容、填充(padding)、邊框(border)、外邊界(margin)。
74、有哪些選擇符,優先級的計算公式是什么?行內樣式和!important哪個優先級高?
#ID > .class > 標簽選擇符 !important優先級高
75.我想讓行內元素跟上面的元素距離10px,加margin-top和padding-top可以嗎?
margin-top,padding-top無效
76.CSS的盒模型由什么組成?
內容,border ,margin,padding
77、.說說display屬性有哪些?可以做什么?
display:block行內元素轉換為塊級元素
display:inline塊級元素轉換為行內元素
display:inline-block轉為內聯元素
78、哪些css屬性可以繼承?
可繼承: font-size font-family color, ul li dl dd dt;
不可繼承 :border padding margin width height ;
79、css優先級算法如何計算?
!important > id > class > 標簽
!important 比 內聯優先級高
* 優先級就近原則,樣式定義最近者為准;
* 以最后載入的樣式為准;
80、text-align:center和line-height有什么區別?
text-align是水平對齊,line-height是行間。
81、前端頁面由哪三層構成,分別是什么?作用是什么?
結構層 Html 表示層 CSS 行為層 js
82、寫一個表格以及對應的CSS,使表格奇數行為白色背景,偶數行為灰色,鼠標一上去為黃色背景。
二、JS基礎
1、javascript的typeof返回哪些數據類型
object number function boolean underfind string
typeof null;//object
typeof isNaN;//
typeof isNaN(123)
typeof [];//object
Array.isARRAY(); es5
toString.call([]);//”[object Array]”
var arr=[];
arr.constructor;//Array
2、例舉3種強制類型轉換和2種隱式類型轉換?
強制(parseInt,parseFloat,Number())
隱式(==)
1==”1”//true
null==undefined//true
3、split() join() 的區別
前者是切割成數組的形式,
后者是將數組轉換成字符串
4、數組方法pop() push() unshift() shift()
Push()尾部添加 pop()尾部刪除
Unshift()頭部添加 shift()頭部刪除
5、事件綁定和普通事件有什么區別
傳統事件綁定和符合W3C標准的事件綁定有什么區別?
div1.onclick=function(){};
<button onmouseover=””></button>
1、如果說給同一個元素綁定了兩次或者多次相同類型的事件,那么后面的綁定會覆蓋前面的綁定
2、不支持DOM事件流 事件捕獲階段è目標元素階段=>事件冒泡階段
addEventListener
1、 如果說給同一個元素綁定了兩次或者多次相同類型的事件,所以的綁定將會依次觸發
2、 支持DOM事件流的
3、 進行事件綁定傳參不需要on前端
addEventListener(“click”,function(){},true);//此時的事件就是在事件冒泡階段執行
ie9開始,ie11 edge:addEventListener
ie9以前:attachEvent/detachEvent
1、 進行事件類型傳參需要帶上on前綴
2、 這種方式只支持事件冒泡,不支持事件捕獲
事件綁定是指把事件注冊到具體的元素之上,普通事件指的是可以用來注冊的事件
6、IE和DOM事件流的區別
1.執行順序不一樣、
2.參數不一樣
3.事件加不加on
4.this指向問題
IE9以前:attachEvent(“onclick”)、detachEvent(“onclick”)
IE9開始跟DOM事件流是一樣的,都是addEventListener
7、IE和標准下有哪些兼容性的寫法
var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
var target = ev.srcElement||ev.target
8、call和apply的區別
call和apply相同點:
都是為了用一個本不屬於一個對象的方法,讓這個對象去執行
toString.call([],1,2,3)
toString.apply([],[1,2,3])
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
9、b繼承a的方法
考點:繼承的多種方式
function b(){}
b.protoototype=new a;
10、JavaScript this指針、閉包、作用域
this:指向調用上下文
閉包:內層作用域可以訪問外層作用域的變量
作用域:定義一個函數就開辟了一個局部作用域,整個js執行環境有一個全局作用域
11、事件委托是什么
符合W3C標准的事件綁定addEventLisntener /attachEvent
讓利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
12、閉包是什么,有什么特性,對頁面有什么影響
閉包就是能夠讀取其他函數內部變量的函數。
閉包的缺點:濫用閉包函數會造成內存泄露,因為閉包中引用到的包裹函數中定義的變量都永遠不會被釋放,所以我們應該在必要的時候,及時釋放這個閉包函數
13、如何阻止事件冒泡和默認事件
e. stopPropagation();//標准瀏覽器
event.canceBubble=true;//ie9之前
阻止默認事件:
為了不讓a點擊之后跳轉,我們就要給他的點擊事件進行阻止
return false
e.preventDefault();
14、添加 刪除 替換 插入到某個接點的方法
obj.appendChild()
obj.insertBefore() //原生的js中不提供insertAfter();
obj.replaceChild()//替換
obj.removeChild()//刪除
15、javascript的本地對象,內置對象和宿主對象
本地對象為array obj regexp等可以new實例化
內置對象為gload Math 等不可以實例化的
宿主為瀏覽器自帶的document,window 等
16、document load 和document ready的區別
Document.onload 是在結構和樣式加載完才執行js
window.onload:不僅僅要在結構和樣式加載完,還要執行完所有的樣式、圖片這些資源文件,全部加載完才會觸發window.onload事件
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
17、”==”和“===”的不同
前者會自動轉換類型
后者不會
1==”1”
null==undefined
===先判斷左右兩邊的數據類型,如果數據類型不一致,直接返回false
之后才會進行兩邊值的判斷
18、javascript的同源策略
一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這里的同一來源指的是主機名、協議和端口號的組合
http,ftp:協議
主機名;localhost
端口名:80:http協議的默認端口
https:默認端口是8083
同源策略帶來的麻煩:ajax在不同域名下的請求無法實現,
如果說想要請求其他來源的js文件,或者json數據,那么可以通過jsonp來解決
19、編寫一個數組去重的方法
var arr=[1,1,3,4,2,4,7];
=>[1,3,4,2,7]
一個比較簡單的實現就是:
1、 先創建一個空數組,用來保存最終的結果
2、 循環原數組中的每個元素
3、 再對每個元素進行二次循環,判斷是否有與之相同的元素,如果沒有,將把這個元素放到新數組中
4、 返回這個新數組
function oSort(arr) {
var result ={};
var newArr=[];
for(var i=0;i<arr.length;i++){
if(!result[arr]) {
newArr.push(arr)
result[arr]=1
}
}
return newArr
}</arr.length;i++)
20、JavaScript是一門什么樣的語言,它有哪些特點?
沒有標准答案。
運行環境:瀏覽器中的JS引擎(v8.。。)
語言特性:面向對象,動態語言:
//動態語言的特性
var num=10;//num是一個數字類型
num="jim";//此時num又變成一個字符串類型
//我們把一個變量用來保存不同數據類型的語言稱之為一個動態語言
//靜態語言:c# java c c++
//靜態語言在聲明一個變量就已經確定了這個變量的數據類型,
// 而且在任何時候都不可以改變他的數據類型
21、JavaScript的數據類型都有什么?
基本數據類型:String,Boolean,number,undefined,object,Null
引用數據類型:Object(Array,Date,RegExp,Function)
那么問題來了,如何判斷某變量是否為數組數據類型?
方法一.判斷其是否具有“數組性質”,如slice()方法。可自己給該變量定義slice方法,故有時會失效
方法二.obj instanceof Array 在某些IE版本中不正確
方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法如下:
toString.call(18);//”[object Number]”
toString.call(“”);//”[object String]”
解析這種簡單的數據類型直接通過typeof就可以直接判斷
toString.call常用於判斷數組、正則這些復雜類型
toString.call(/[0-9]{10}/)//”[object RegExp]”
|
if(typeof Array.isArray==="undefined"){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg)==="[object Array]" }; } |
22、已知ID的Input輸入框,希望獲取這個輸入框的輸入值,怎么做?(不使用第三方框架)
|
document.getElementById(“ID”).value |
23、希望獲取到頁面中所有的checkbox怎么做?(不使用第三方框架)
|
var domList = document.getElementsByTagName(‘input’) var checkBoxList = [];//返回的所有的checkbox var len = domList.length; //緩存到局部變量 while (len--) { //使用while的效率會比for循環更高 if (domList[len].type == ‘checkbox’) { checkBoxList.push(domList[len]); } } |
24、設置一個已知ID的DIV的html內容為xxxx,字體顏色設置為黑色(不使用第三方框架)
|
var dom = document.getElementById(“ID”); dom.innerHTML = “xxxx” dom.style.color = “#000” |
25、當一個DOM節點被點擊時候,我們希望能夠執行一個函數,應該怎么做?
直接在DOM里綁定事件:<div onclick=”test()”></div>
在JS里通過onclick綁定:xxx.onclick = test
通過事件添加進行綁定:addEventListener(xxx, ‘click’, test)
那么問題來了,Javascript的事件流模型都有什么?
“事件冒泡”:事件開始由最具體的元素接受,然后逐級向上傳播
“事件捕捉”:事件由最不具體的節點先接收,然后逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉,目標階段,事件冒泡
26、看下列代碼輸出為何?解釋原因。
|
var a; alert(typeof a); // “undefined” //alert(b); // 報錯 b=10; alert(typeof b);//”number”
|
解釋:Undefined是一個只有一個值的數據類型,這個值就是“undefined”,在使用var聲明變量但並未對其賦值進行初始化時,這個變量的值就是undefined。而b由於未聲明將報錯。注意未申明的變量和聲明了未賦值的是不一樣的。
undefined會在以下三種情況下產生:
1、 一個變量定義了卻沒有被賦值
2、 想要獲取一個對象上不存在的屬性或者方法:
3、 一個數組中沒有被賦值的元素
注意區分undefined跟not defnied(語法錯誤)是不一樣的
27、看下列代碼,輸出什么?解釋原因。
|
var a = null; alert(typeof a); //object |
解釋:null是一個只有一個值的數據類型,這個值就是null。表示一個空指針對象,所以用typeof檢測會返回”object”。
28、看下列代碼,輸出什么?解釋原因。
|
var undefined;//此時undefined這個變量的值是undefined undefined == null; // true 1 == true; // true 此時會把布爾類型的值轉換為數字類型 true=1 false=0 2 == true; // false 0 == false; // true 0 == ''; // true NaN == NaN; // false [] == false; // true [] == ![]; // true |
- undefined與null相等,但不恆等(===)
一個是number一個是string時,會嘗試將string轉換為number
嘗試將boolean轉換為number,0或1
嘗試將Object轉換成number或string,取決於另外一個對比量的類型
所以,對於0、空字符串的判斷,建議使用 “===” 。“===”會先判斷兩邊的值類型,類型不匹配時為false。
那么問題來了,看下面的代碼,輸出什么,foo的值為什么?
|
var foo = "11"+2-"1"; console.log(foo);//111 console.log(typeof foo); |
執行完后foo的值為111,foo的類型為number。
29、看代碼給答案。
|
var a = new Object(); a.value = 1; b = a; {value:1} b.value = 2; alert(a.value);//2 |
答案:2(考察引用數據類型細節)
30、已知數組var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。
答案:alert(stringArray.join(“ ”))
已知有字符串foo=”get-element-by-id”,寫一個function將其轉化成駝峰表示法”getElementById”。
//
|
function combo(msg){ var arr=msg.split("-");//[get,element,by,id] for(var i=1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);//Element } msg=arr.join("");//msg=” getElementById” return msg; } |
(考察基礎API)
31、var numberArray = [3,6,2,4,1,5]; (考察基礎API)
1) 實現對該數組的倒排,輸出[5,1,4,2,6,3]
2) 實現對該數組的降序排列,輸出[6,5,4,3,2,1]
|
function combo(msg){ var arr=msg.split("-"); for(var i=1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1); } msg=arr.join(""); return msg; } |
32、輸出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,則輸出2014-09-26
|
var d = new Date(); // 獲取年,getFullYear()返回4位的數字 var year = d.getFullYear(); // 獲取月,月份比較特殊,0是1月,11是12月 var month = d.getMonth() + 1; // 變成兩位 month = month < 10 ? '0' + month : month; // 獲取日 var day = d.getDate(); day = day < 10 ? '0' + day : day; alert(year + '-' + month + '-' + day); |
33、將字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替換成10,{$name}替換成Tony (使用正則表達式)
答案:”<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>”.replace(/{\$id}/g, ’10′).replace(/{\$name}/g, ‘Tony’);
34、為了保證頁面輸出安全,我們經常需要對一些特殊的字符進行轉義,請寫一個函數escapeHtml,將<, >, &, “進行轉義
|
function escapeHtml(str) { //[<>”&]:中括號中字符只要其中的一個出現就代表滿足條件 //給replace第二個參數傳遞一個回調函數,回調函數中參數就是匹配結果,如果匹配不到就是null return str.replace(/[<>”&]/g, function(match) { switch (match) { case “<”: return “<”; case “>”: return “>”; case “&”: return “&”; case “\””: return “"”; } }); } |
35、foo = foo||bar ,這行代碼是什么意思?為什么要這樣寫?
這種寫法稱之為短路表達式
答案:if(!foo) foo = bar; //如果foo存在,值不變,否則把bar的值賦給foo。
短路表達式:作為”&&”和”||”操作符的操作數表達式,這些表達式在進行求值時,只要最終的結果已經可以確定是真或假,求值過程便告終止,這稱之為短路求值。
注意if條件的真假判定,記住以下是false的情況:
空字符串、false、undefined、null、0
36、看下列代碼,將會輸出什么?(變量聲明提升)
|
var foo = 1; function(){ console.log(foo); var foo = 2; console.log(foo); } |
答案:輸出undefined 和 2。上面代碼相當於:
|
var foo = 1; function(){ var foo; console.log(foo); //undefined foo = 2; console.log(foo); // 2; } |
函數聲明與變量聲明會被JavaScript引擎隱式地提升到當前作用域的頂部,但是只提升名稱不會提升賦值部分。
37、用js實現隨機選取10–100之間的10個數字,存入一個數組,並排序。
|
var iArray = []; funtion getRandom(istart, iend){ var iChoice = istart - iend +1; return Math.floor(Math.random() * iChoice + istart; } Math.random()就是獲取0-1之間的隨機數(永遠獲取不到1) for(var i=0; i<10; i++){ var result= getRandom(10,100); iArray.push(result); } iArray.sort(); |
|
|
38、把兩個數組合並,並刪除第二個元素。
|
var array1 = ['a','b','c']; var bArray = ['d','e','f']; var cArray = array1.concat(bArray); cArray.splice(1,1); |
39、怎樣添加、移除、移動、復制、創建和查找節點(原生JS,實在基礎,沒細寫每一步)
1)創建新節點
createDocumentFragment() //創建一個DOM片段
createElement() //創建一個具體的元素
createTextNode() //創建一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
40、有這樣一個URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,請寫一段JS程序提取URL中的各個GET參數(參數名和參數個數不確定),將其按key-value形式返回到一個json結構中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
答案:
|
function serilizeUrl(url) { var result = {}; url = url.split("?")[1]; var map = url.split("&"); for(var i = 0, len = map.length; i < len; i++) { result<script>jQuery(function($) {$("#google-maps-1").gMap({controls: false,scrollwheel: false,markers: [{address: "",icon: {image: "http://blog.jobbole.com/wp-content/themes/jobboleblogv3/_assets/img/_colors/red/pin.png",iconsize: [32, 32],iconanchor: [16,27],infowindowanchor: [16, 27]}}],address: "",zoom: 15,icon: {image: "http://blog.jobbole.com/wp-content/themes/jobboleblogv3/_assets/img/_colors/red/pin.png",iconsize: [32, 32],iconanchor: [16,27],infowindowanchor: [16, 27]}});});</script><div id="google-maps-1" class="google-maps" style="width: 100%; height: 200px;"></div>.split("=")[0]] = map[i].split("=")[1]; } return result; } |
41、正則表達式構造函數var reg=new RegExp(“xxx”)與正則表達字面量var reg=//有什么不同?匹配郵箱的正則表達式?
答案:當使用RegExp()構造函數的時候,不僅需要轉義引號(即\”表示”),並且還需要雙反斜杠(即\\表示一個\)。使用正則表達字面量的效率更高。
郵箱的正則匹配:
|
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/; |
24.看下面代碼,給出輸出結果。
|
for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); }; |
答案:4 4 4。
原因:Javascript事件處理器在線程空閑之前不會運行。追問,如何讓上述代碼輸出1 2 3?
|
for(var i=1;i<=3;i++){ setTimeout((function(a){ //改成立即執行函數 console.log(a); })(i),0); }; 1 //輸出 2 3 |
42、寫一個function,清除字符串前后的空格。(兼容所有瀏覽器)
使用自帶接口trim(),考慮兼容性:
|
if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/,""); //\s匹配空白字符:回車、換行、制表符tab 空格 } } // test the function var str = " \t\n test string ".trim(); alert(str == "test string"); // alerts "true" |
43、Javascript中callee和caller的作用?
arguments.callee:獲得當前函數的引用
caller是返回一個對函數的引用,該函數調用了當前函數;
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
那么問題來了?如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
|
var result=[]; function fn(n){ //典型的斐波那契數列 if(n==1){ return 1; }else if(n==2){ return 1; }else{ if(result[n]){ return result[n]; }else{ //argument.callee()表示fn() result[n]=arguments.callee(n-1)+arguments.callee(n-2); return result[n]; } } } |
44、Javascript中, 以下哪條語句一定會產生運行錯誤? 答案( BC )
A、 var _變量=NaN;B、var 0bj = [];C、var obj = //; D、var obj = {};
//正確答案:BC
45、以下兩個變量a和b,a+b的哪個結果是NaN? 答案( C )
A、var a=undefind; b=NaN //拼寫
B、var a=‘123’; b=NaN//字符串
C、var a =undefined , b =NaN
D、var a=NaN , b='undefined'//”Nan”
//var a=10; b=20; c=4; ++b+c+a++
//21+4+10=35;
46、var a=10; b=20; c=4; ++b+c+a++ 以下哪個結果是正確的?答案( B )
A、 34 B、35 C、36 D、37
47、下面的JavaScript語句中,( D )實現檢索當前頁面中的表單元素中的所有文本框,並將它們全部清空
A. for(vari=0;i< form1.elements.length;i++) {
if(form1.elements.type==”text”)
form1.elements.value=”";}
B. for(vari=0;i<document.forms.length;i++) {
if(forms[0].elements.type==”text”)
forms[0].elements.value=”";
}
C. if(document.form.elements.type==”text”)
form.elements.value=”";
D. for(vari=0;i<document.forms.length; i++){
for(var j=0;j<document.forms.elements.length; j++){
if(document.forms.elements[j].type==”text”)
document.forms.elements[j].value=”";
}
}
48、要將頁面的狀態欄中顯示“已經選中該文本框”,下列JavaScript語句正確的是( A )
A. window.status=”已經選中該文本框”
B. document.status=”已經選中該文本框”
C. window.screen=”已經選中該文本框”
D. document.screen=”已經選中該文本框”
49、以下哪條語句會產生運行錯誤:(A)正確答案:A、D
A.var obj = ();
B.var obj = [];
C.var obj = {};
D.var obj = //;
50、以下哪個單詞不屬於javascript保留字:(B)
A.with
B.parent
C.class
D.void
51、請選擇結果為真的表達式:(C)
A.null instanceof Object
B.null === undefined
C.null == undefined
D.NaN == NaN
52、Javascript中, 如果已知HTML頁面中的某標簽對象的id=”username”,用____document.getElementById(‘username’)___ _方法獲得該標簽對象。
53、typeof運算符返回值中有一個跟javascript數據類型不一致,它是________”function”_________。
typeof Number
typeof Object
54、定義了一個變量,但沒有為該變量賦值,如果alert該變量,javascript彈出的對話框中顯示___undefined______ 。
55、分析代碼,得出正確的結果。
var a=10, b=20 , c=30;
++a;
a++;
e=++a+(++b)+(c++)+a++;
alert(e);
彈出提示對話框:77
var a=10, b=20 , c=30;
++a;//a=11
a++;//a=11
e=++a+(++b)+(c++)+a++;
//a=12 13+21+30+13=77
alert(e);
56、寫出函數DateDemo的返回結果,系統時間假定為今天
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() + "/";
s += d.getDate() + "/";
s += d.getFullYear();
return s;}
結果:今天日期是:7/17/2010
57、寫出程序運行的結果?
for(i=0, j=0; i<10, j<6; i++, j++){
k = i + j;}
結果:10
for(i=0, j=0; i<10, j<6; i++, j++){
//j=5 i=5
k = i + j;//k=10
}
//結果:10
58、閱讀以下代碼,請分析出結果:
var arr = new Array(1 ,3 ,5);
arr[4]='z';//[1,3,5,undefined,’z’]
arr2 = arr.reverse();//arr2=[’z’,undefined,5,3,1];
//arr=[’z’,undefined,5,3,1]
arr3 = arr.concat(arr2);
alert(arr3);
彈出提示對話框:z,,5,3,1,z,,5,3,1
reverse 方法顛倒數組中元素的位置,並返回該數組的引用。
59、補充按鈕事件的函數,確認用戶是否退出當前頁面,確認之后關閉窗口; <html>
<head>
<script type=”text/javascript” >
function closeWin(){
//在此處添加代碼
if(confirm(“確定要退出嗎?”)){
window.close();
}
}
</script>
</head>
<body>
<input type=”button”value=”關閉窗口”onclick=”closeWin()”/>
</body>
</html>
60、寫出簡單描述html標簽(不帶屬性的開始標簽和結束標簽)的正則表達式,並將以下字符串中的html標簽去除掉
var str = “<div>這里是div<p>里面的段落</p></div>”;
//
<scripttype=”text/javascript”>
var reg = /<\/?\w+\/?>/gi;//
x? |
匹配問號前面的內容出現0 或 1 次。 |
var str = “<div>這里是div<p>里面的段落</p></div>”;
alert(str.replace(reg,”"));
</script>
61、完成foo()函數的內容,要求能夠彈出對話框提示當前選中的是第幾個單選框。
<html>
<head>
<metahttp-equiv=”Content-Type” content=”text/html;charset=utf-8″ />
</head>
<body>
<script type=”text/javascript” >
function foo() {
//在此處添加代碼
var rdo =document.form1.radioGroup;
for(var i =0 ;i<rdo.length;i++){
if(rdo.checked){
alert(“您選擇的是第”+(i+1)+”個單選框”);
}
}
}
</script>
<body>
<form name=”form1″ >
<input type=”radio” name=”radioGroup” />
<input type=”radio” name=”radioGroup”/>
<input type=”radio” name=”radioGroup”/>
<input type=”radio” name=”radioGroup”/>
<input type=”submit”/>
</form>
</body>
</html>
62、完成函數showImg(),要求能夠動態根據下拉列表的選項變化,更新圖片的顯示
<body>
<script type=”text/javascript” >
function showImg (oSel) {
//在此處添加代碼
var str = oSel.value;
document.getElementById(“pic”).src= str+”.jpg”;
}
</script>
<img id=”pic”src=”img1.jpg”width=”200″ height=”200″ />
<br />
<select id=”sel”>
<option value=”img1“>城市生活</option>
<option value=”img2“>都市早報</option>
<option value=”img3“>青山綠水</option>
</select></body>
63、截取字符串abcdefg的efg
alert('abcdefg'.substring(4));
64、列舉瀏覽器對象模型BOM里常用的至少4個對象,並列舉window對象的常用方法至少5個
對象:Window document location screen history navigator
方法:Alert() confirm() prompt() open() close()
65、簡述列舉文檔對象模型DOM里document的常用的查找訪問節點的方法並做簡單說明
Document.getElementById 根據元素id查找元素
Document.getElementByName 根據元素name查找元素
Document.getElementTagName 根據指定的元素名查找元素
66、希望獲取到頁面中所有的checkbox怎么做?(不使用第三方框架)
var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length; //緩存到局部變量
while (len--) { //使用while的效率會比for循環更高
if (domList[len].type == ‘checkbox’) {
checkBoxList.push(domList[len]);
}
}
67、JavaScript的數據類型都有什么?
基本數據類型:String,Boolean,Number,Undefined,Null
引用數據類型:Object(Array,Date,RegExp,Function)
68、javascript中有哪幾種數據類型,分別寫出中文和英文。
string boolean number null undefined object
字符串 布爾 數值 空值 未定義 對象
69、javascript中==和===的區別是什么?舉例說明。
===會自動進行類型轉換,==不會
70、簡述創建函數的幾種方式
第一種(函數聲明):
function sum1(num1,num2){
return num1+num2;
}
第二種(函數表達式):
var sum2 = function(num1,num2){
return num1+num2;
}
匿名函數:
function(){}:只能自己執行自己
第三種(函數對象方式):
var sum3 = new Function("num1","num2","return num1+num2");
71、Javascript如何實現繼承?
原型鏈繼承,借用構造函數繼承,組合繼承,寄生式繼承,寄生組合繼承
72、Javascript創建對象的幾種方式?
工廠方式,構造函數方式,原型模式,混合構造函數原型模式,動態原型方式
73、把 Script 標簽 放在頁面的最底部的body封閉之前 和封閉之后有什么區別?瀏覽器會如何解析它們?
如果說放在body的封閉之前,將會阻塞其他資源的加載
如果放在body封閉之后,不會影響body內元素的加載
74、iframe的優缺點?
優點:
1. 解決加載緩慢的第三方內容如圖標和廣告等的加載問題
2. Security sandbox
3. 並行加載腳本
缺點:
1. iframe會阻塞主頁面的Onload事件
2. 即時內容為空,加載也需要時間
3. 沒有語意
75、請你談談Cookie的弊端?
缺點:
1.`Cookie`數量和長度的限制。每個domain最多只能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉。
2.安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。
3.有些狀態不可能保存在客戶端。例如,為了防止重復提交表單,我們需要在服務器端保存一個計數器。如果我們把這個計數器保存在客戶端,那么它起不到任何作用。
76、DOM操作——怎樣添加、移除、移動、復制、創建和查找節點。
1. 創建新節點
createDocumentFragment() // 創建一個DOM片段
createElement() // 創建一個具體的元素
createTextNode() // 創建一個文本節點
2. 添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() // 在已有的子節點前插入一個新的子節點
3. 查找
getElementsByTagName() // 通過標簽名稱
getElementsByName() // 通過元素的Name屬性的值(IE容錯能力較強,會得到一個數組,其中包括id等於name值的)
getElementById() // 通過元素Id,唯一性
77、js延遲加載的方式有哪些?
1. defer和async
2. 動態創建DOM方式(創建script,插入到DOM中,加載完畢后callBack)
3. 按需異步載入js
78、documen.write和 innerHTML 的區別?
document.write 只能重繪整個頁面
innerHTML 可以重繪頁面的一部分
79、哪些操作會造成內存泄漏?
內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。如果一個對象的引用數量為 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那么該對象的內存即可回收。
1. setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。
2. 閉包
3. 控制台日志
4. 循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
80、javascript的typeof返回哪些數據類型?
答:object、 number、 function 、boolean、 underfind
81、split() join() 的區別
答:前者是切割成數組的形式,后者是將數組轉換成字符串
82、數組方法pop() push() unshift() shift()各表示什么意思?
答:Push()尾部添加、pop()尾部刪除、Unshift()頭部添加、shift()頭部刪除
83、判斷一個字符串中出現次數最多的字符,統計這個次數
答:var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
alert('出現次數最多的是:'+iIndex+'出現'+iMax+'次');
84、javascript的typeof返回哪些數據類型
Object number function boolean underfind
85、例舉3種強制類型轉換和2種隱式類型轉換?
強制(parseInt,parseFloat,number)
隱式(== – ===)
86、split() join() 的區別
前者是切割成數組的形式,后者是將數組轉換成字符串
87、數組方法pop() push() unshift() shift()
Push()尾部添加 shift() 尾部刪除
Unshift() 頭部添加 shift() 頭部刪除
89、IE和DOM事件流的區別
1.執行順序不一樣、
2.參數不一樣
3.事件加不加on
4.this指向問題
90、IE和標准下有哪些兼容性的寫法
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
91、call和apply的區別
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
93、寫一個獲取非行間樣式的函數
function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)//ie
{
return obj.currentStyle(attr);
}
else{//標准瀏覽器
obj.getComputedStyle(attr,false);
}
}
else
{
obj.style[attr] = value;
}
}
95、閉包是什么,有什么特性,對頁面有什么影響
閉包就是能夠讀取其他函數內部變量的函數。
http://blog.csdn.net/gaoshanwudi/article/details/7355794 此鏈接可查看(問這個問題的不是一個公司)
96、解釋jsonp的原理,以及為什么不是真正的ajax
動態創建script標簽,回調函數
Ajax是頁面無刷新請求數據操作
97、javascript的本地對象,內置對象和宿主對象
本地對象為array obj regexp等可以new實例化
內置對象為gload Math 等不可以實例化的
宿主為瀏覽器自帶的document,window 等
98、document load 和document ready的區別
Document.onload 是在結構和樣式加載完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
99、字符串反轉,如將 '12345678' 變成 '87654321'
|
//大牛做法; //思路:先將字符串轉換為數組 split(),利用數組的反序函數 reverse()顛倒數組,再利用 jion() 轉換為字符串 var str = '12345678'; str = str.split('').reverse().join(''); |
100、將數字 12345678 轉化成 RMB形式 如: 12,345,678
|
//個人方法; //思路:先將數字轉為字符, str= str + '' ; //利用反轉函數,每三位字符加一個 ','最后一位不加; re()是自定義的反轉函數,最后再反轉回去! for(var i = 1; i <= re(str).length; i++){ tmp += re(str)[i - 1]; if(i % 3 == 0 && i != re(str).length){ tmp += ','; } } |
101、生成5個不同的隨機數;
|
//思路:5個不同的數,每生成一次就和前面的所有數字相比較,如果有相同的,則放棄當前生成的數字! var num1 = []; for(var i = 0; i < 5; i++){ num1[i] = Math.floor(Math.random()*10) + 1; //范圍是 [1, 10] for(var j = 0; j < i; j++){ if(num1[i] == num1[j]){ i--; } } } |
102、去掉數組中重復的數字 方法一;
|
//思路:每遍歷一次就和之前的所有做比較,不相等則放入新的數組中! //這里用的原型 個人做法; Array.prototype.unique = function(){ var len = this.length, newArr = [], flag = 1; for(var i = 0; i < len; i++, flag = 1){ for(var j = 0; j < i; j++){ if(this[i] == this[j]){ flag = 0; //找到相同的數字后,不執行添加數據 } } flag ? newArr.push(this[i]) : ''; } return newArr; } |
方法二:
|
(function(arr){ var len = arr.length, newArr = [], flag; for(var i = 0; i < len; i+=1, flag = 1){ for(var j = 0; j < i; j++){ if(arr[i] == arr[j]){ flag = 0; } } flag?newArr.push(arr[i]):''; } alert(newArr); })([1, 1, 22, 3, 4, 55, 66]); |
103、階乘函數;9*8*7*6*5…*1
|
//原型方法 Number.prototype.N = function(){ var re = 1; for(var i = 1; i <= this; i++){ re *= i; } return re; } var num = 5; alert(num.N()); |
104、window.location.search返回的是什么?
答:查詢(參數)部分。除了給動態語言賦值以外,我們同樣可以給靜態頁面,並使用javascript來獲得相信應的參數值
返回值:?ver=1.0&id=timlq 也就是問號后面的!
//url:http://www.sina.com/getage?number=1&year=2016
105、window.location.hash 返回的是什么?
答:錨點 , 返回值:#love ;
//url:http://www.sina.com/getage?#age
這時就返回”#age”
106、window.location.reload() 作用?
答:刷新當前頁面。
107、阻止冒泡函數
|
function stopPropagation(e) { e = e || window.event; if(e.stopPropagation) { //W3C阻止冒泡方法 e.stopPropagation(); } else { e.cancelBubble = true; //IE阻止冒泡方法 } } document.getElementById('need_hide').onclick = function(e) { stopPropagation(e); } |
108、什么是閉包? 寫一個簡單的閉包?;
答:我的理解是,閉包就是能夠讀取其他函數內部變量的函數。在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
|
function outer(){ var num = 1; function inner(){ var n = 2; alert(n + num); } return inner; } outer()(); |
109、javascript 中的垃圾回收機制?
答:在Javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。如果兩個對象互相引用,而不再 被第3者所引用,那么這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什么 函數a執行后不會被回收的原因。
110、看題做答:
|
function f1(){ var tmp = 1; this.x = 3; console.log(tmp); //A console.log(this.x); //B } var obj = new f1(); //1 console.log(obj.x) //2 console.log(f1()); //3 |
分析:
這道題讓我重新認識了對象和函數,首先看代碼(1),這里實例話化了 f1這個類。相當於執行了 f1函數。所以這個時候 A 會輸出 1, 而 B 這個時候的 this 代表的是 實例化的當前對象 obj B 輸出 3.。 代碼(2)毋庸置疑會輸出 3, 重點 代碼(3)首先這里將不再是一個類,它只是一個函數。那么 A輸出 1, B呢?這里的this 代表的其實就是window對象,那么this.x 就是一個全局變量 相當於在外部 的一個全局變量。所以 B 輸出 3。最后代碼由於f沒有返回值那么一個函數如果沒返回值的話,將會返回 underfined ,所以答案就是 : 1, 3, 3, 1, 3, underfined 。
111、下面輸出多少?
|
var o1 = new Object(); var o2 = o1; o2.name = "CSSer"; console.log(o1.name); |
如果不看答案,你回答真確了的話,那么說明你對javascript的數據類型了解的還是比較清楚了。js中有兩種數據類型,分別是:基本數據類型和引用數據類型(object Array)。對於保存基本類型值的變量,變量是按值訪問的,因為我們操作的是變量實際保存的值。對於保存引用類型值的變量,變量是按引用訪問的,我們操作的是變量值所引用(指向)的對象。答案就清楚了: //CSSer;
112、再來一個
|
function changeObjectProperty (o) { o.siteUrl = "http://www.csser.com/"; o = new Object(); o.siteUrl = "http://www.popcg.com/"; } var CSSer = new Object(); changeObjectProperty(CSSer); console.log(CSSer.siteUrl); // |
如果CSSer參數是按引用傳遞的,那么結果應該是"http://www.popcg.com/",但實際結果卻仍是"http://www.csser.com/"。事實是這樣的:在函數內部修改了引用類型值的參數,該參數值的原始引用保持不變。我們可以把參數想象成局部變量,當參數被重寫時,這個變量引用的就是一個局部變量,局部變量的生存期僅限於函數執行的過程中,函數執行完畢,局部變量即被銷毀以釋放內存。
(補充:內部環境可以通過作用域鏈訪問所有的外部環境中的變量對象,但外部環境無法訪問內部環境。每個環境都可以向上搜索作用域鏈,以查詢變量和函數名,反之向下則不能。)
113、輸出多少?
|
var a = 6; setTimeout(function () { var a = 666;//由於變量a是一個局部變量 alert(a); // 輸出666, }, 1000); a = 66; |
因為var a = 666;定義了局部變量a,並且賦值為666,根據變量作用域鏈,
全局變量處在作用域末端,優先訪問了局部變量,從而覆蓋了全局變量 。
|
var a = 6; setTimeout(function () { //變量聲明提前 alert(a); // 輸出undefined var a = 666; }, 1000); a = 66; |
|
|
因為var a = 666;定義了局部變量a,同樣覆蓋了全局變量,但是在alert(a);之前
a並未賦值,所以輸出undefined。
|
var a = 6; |
記住: 異步處理,一切OK 聲明提前
114、輸出多少?
|
function setN(obj){ obj.name='屌絲'; obj = new Object(); obj.name = '腐女'; }; var per = new Object(); setN(per); alert(per.name); //屌絲 內部 |
115、JS的繼承性
|
window.color = 'red'; var o = {color: 'blue'}; function sayColor(){ alert(this.color); } 考點:1、this的指向 2、call的用法 sayColor(); //red sayColor.call(this); //red this指向的是window對象 sayColor.call(window); //red sayColor.call(o); //blue |
|
|
116、精度問題: JS 精度不能精確到 0.1 所以 。。。。同時存在於值和差值中
|
var n = 0.3,m = 0.2, i = 0.2, j = 0.1; alert((n - m) == (i - j)); //false alert((n-m) == 0.1); //false alert((i-j)==0.1); //true |
117、加減運算
|
alert('5'+3); //53 string alert('5'+'3'); //53 string alert('5'-3); //2 number alert('5'-'3'); //2 number |
118、什么是同源策略?
指: 同協議、端口、域名的安全策略,由網景(Netscape)公司提出來的安全協議!
119、call和apply的區別是什么?
參數形式不同,call(obj, pra, pra)后面是單個參數。apply(obj, [args])后面是數組。
120、為什么不能定義1px左右的div容器?
IE6下這個問題是因為默認的行高造成的,解決的方法也有很多,例如:
overflow:hidden | zoom:0.08 | line-height:1px
121、結果是什么?
|
function foo(){ foo.a = function(){alert(1)}; this.a = function(){alert(2)}; a = function(){alert(3)}; var a = function(){alert(4)}; }; foo.prototype.a = function(){alert(5)}; foo.a = function(){alert(6)}; foo.a(); //6 var obj = new foo(); obj.a(); //2 foo.a(); //1 |
122、輸出結果
|
var a = 5; function test(){ a = 0; alert(a); alert(this.a); //沒有定義 a這個屬性 var a; alert(a) } test(); // 0, 5, 0 new test(); // 0, undefined, 0 //由於類它自身沒有屬性a, 所以是undefined |
123、計算字符串字節數:
|
new function(s){ if(!arguments.length||!s) return null; if(""==s) return 0; //無效代碼,因為上一句!s已經判斷過 var l=0; for(var i=0;i<s.length;i++){ if(s.charCodeAt(i)>255) l+=2; else l+=1; //charCodeAt()得到的是unCode碼 } //漢字的unCode碼大於 255bit 就是兩個字節 alert(l); }("hello world!"); |
124、結果是:
|
var bool = !!2; alert(bool);//true; |
技巧:雙向非操作可以把字符串和數字轉換為布爾值。
125、聲明對象,添加屬性,輸出屬性
|
var obj = { name: 'leipeng', showName: function(){ alert(this.name); } } obj.showName(); |
126、匹配輸入的字符:第一個必須是字母或下划線開頭,后面就是字母和數字或者下划線構成,長度5-20
|
var reg = /^[a-zA-Z_][a-zA-Z0-9_]{4,19}/, name1 = 'leipeng', name2 = '0leipeng', name3 = '你好leipeng', name4 = 'hi';
alert(reg.test(name1)); alert(reg.test(name2)); alert(reg.test(name3)); alert(reg.test(name4)); |
127、檢測變量類型
|
function checkStr(str){ typeof str == 'string'? alert('true'):alert('false'); } checkStr('leipeng'); |
128、如何在HTML中添加事件,幾種方法?
1、標簽之中直接添加 onclick="fun()";
2、JS添加 Eobj.onclick = method;
3、現代事件 IE9以前: obj.attachEvent('onclick', method);
標准瀏覽器: obj.addEventListener('click', method, false);
129、BOM對象有哪些,列舉window對象?
1、window對象 ,是JS的最頂層對象,其他的BOM對象都是window對象的屬性;
2、document對象,文檔對象;
3、location對象,瀏覽器當前URL信息;
4、navigator對象,瀏覽器本身信息;
5、screen對象,客戶端屏幕信息;
6、history對象,瀏覽器訪問歷史信息;
130、請問代碼實現 outerHTML
//說明:outerHTML其實就是innerHTML再加上本身;
|
Object.prototype.outerHTML = function(){ var innerCon = this.innerHTML, //獲得里面的內容 outerCon = this.appendChild(innerCon); //添加到里面 alert(outerCon); } |
演示代碼:
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="outer"> hello </div> <script> Object.prototype.outerHTML = function(){ var innerCon = this.innerHTML, //獲得里面的內容 outerCon = this.appendChild(innerCon); //添加到里面 alert(outerCon); } function $(id){ return document.getElementById(id); } alert($('outer').innerHTML); alert($('outer').outerHTML); </script> </body> </html> |
131、JS中的簡單繼承 call方法!
|
//頂一個父母類,注意:類名都是首字母大寫的哦! function Parent(name, money){ this.name = name; this.money = money; this.info = function(){ alert('姓名: '+this.name+' 錢: '+ this.money); } } //定義孩子類 function Children(name){ Parent.call(this, name); //繼承 姓名屬性,不要錢。 this.info = function(){ alert('姓名: '+this.name); } } //實例化類 var per = new Parent('parent', 800000000000); var chi = new Children('child'); per.info(); chi.info(); |
132、bind(), live(), delegate()的區別
bind: 綁定事件,對新添加的事件不起作用,方法用於將一個處理程序附加到每個匹配元素的事件上並返回jQuery對象。
live: 方法將一個事件處理程序附加到與當前選擇器匹配的所有元素(包含現有的或將來添加的)的指定事件上並返回jQuery對象。
delegate: 方法基於一組特定的根元素將處理程序附加到匹配選擇器的所有元素(現有的或將來的)的一個或多個事件上。
最佳實現:on() off()
133、typeof 的返回類型有哪些?
|
alert(typeof [1, 2]); //object alert(typeof 'leipeng'); //string var i = true; alert(typeof i); //boolean alert(typeof 1); //number var a; alert(typeof a); //undefined function a(){;}; alert(typeof a) //function |
134、簡述link和import的區別?
區別1:link是XHTML標簽,除了加載CSS外,還可以定義RSS等其他事務;@import屬於CSS范疇,只能加載CSS。
區別2:link引用CSS時,在頁面載入時同時加載;@import需要頁面網頁完全載入以后加載。
區別3:link是XHTML標簽,無兼容問題;@import是在CSS2.1提出的,低版本的瀏覽器不支持。
區別4:link支持使用Javascript控制DOM去改變樣式;而@import不支持。
135、window.onload 和 document.ready的區別?
load要等到圖片和包含的文件都加在進來之后執行;
ready是不包含圖片和非文字文件的文檔結構准備好就執行;
136、 解析URL成一個對象?
String.prototype.urlQueryString = function(){ var url = this.split('?')[1].split('&'), len = url.length;
this.url = {}; for(var i = 0; i < len; i += 1){ var cell = url[i].split('='), key = cell[0], val = cell[1]; this.url[''+key+''] = val; } return this.url; } var url = '?name=12&age=23'; console.log(url.urlQueryString().age); |
137、看下列代碼輸出什么?
var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);
執行完后foo的值為111,foo的類型為Number。
138、看下列代碼,輸出什么?
var a = new Object();
a.value = 1;
b = a;
b.value = 2;
alert(a.value);
執行完后輸出結果為2
139、已知數組var stringArray = ["This”, "is”, "Baidu”, "Campus”],Alert出”This is Baidu Campus”。
答案:alert(stringArray.join(" "))
140、已知有字符串foo="get-element-by-id",寫一個function將其轉化成駝峰表示法"getElementById"。
答案:function combo(msg){
var arr = msg.split("-");
var len = arr.length; //將arr.length存儲在一個局部變量可以提高for循環效率
for(var i=1;i<len;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
141、怎樣添加、移除、移動、復制、創建和查找節點
1)創建新節點
createDocumentFragment() //創建一個DOM片段
createElement() //創建一個具體的元素
createTextNode() //創建一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
142、原生JS的window.onload與Jquery的$(document).ready(function(){})有什么不同?
window.onload()方法是必須等到頁面內包括圖片的所有元素加載完畢后才能執行。
$(document).ready()是DOM結構繪制完畢后就執行,不必等到加載完畢。
143、你如何優化自己的代碼?
代碼重用
避免全局變量(命名空間,封閉空間,模塊化mvc..)
拆分函數避免函數過於臃腫:單一職責原則
適當的注釋,尤其是一些復雜的業務邏輯或者是計算邏輯,都應該寫出這個業務邏輯的具體過程
內存管理,尤其是閉包中的變量釋放
144、請描述出下列代碼運行的結果
function d(){
console.log(this);
}
d();//window
145、需要將變量e的值修改為“a+b+c+d”,請寫出對應的代碼
var e=”abcd”;
設計一段代碼能夠遍歷下列整個DOM節點
<div>
<p>
<span><a/></span>
<span><a/></span>
</p>
<ul>
<li></li>
<li></li>
</ul>
</div>
146、怎樣實現兩欄等高?
147、使用js實現這樣的效果:在文本域里輸入文字時,當按下enter鍵時不換行,而是替換成“{{enter}}”,(只需要考慮在行尾按下enter鍵的情況).
textarea.onkeydown=function(e){
e.preventDefault();//為了阻止enter鍵的默認換行效果
if(e.keycode==”enter鍵碼”){
testarea.value+=”{{enter}}”;
}
}
148、以下代碼中end字符串什么時候輸出
var t=true;
setTimeout(function(){
console.log(123);
t=false;
},1000);
while(t){}// 此時是一個死循環,永遠不可能執行setTimeout中的回調函數
console.log(‘end’);
149、specify(‘hello,world’)//=>’h,e,l,l,o,w,o,r,l,d’實現specify函數
150、請將一個URL的search部分參數與值轉換成一個json對象
//search部分的參數格式:a=1&b=2&c=3
function getJsonFromUrlSearch(search){
var item;
var result={};
if(search.indexOf('&')<0){
item=search.split('=');
result[item[0]]=item[1];
return result;
}
var splitArray=search.split('&');
for (var i = 0; i < splitArray.length; i++) {
var obj = splitArray[i];
item=obj.split('=');
result[item[0]]=item[1];
}
return result;
}
var c=getJsonFromUrlSearch("a=1&b=2&c=3");
151、請用原生js實現jquery的get\post功能,以及跨域情況下
152、請簡要描述web前端性能需要考慮哪方面,你的優化思路是什么?
//參見雅虎14web優化規則
//減少http請求:
//1、小圖弄成大圖,2、合理的設置緩存
//3、資源合並、壓縮
//將外部的js文件置底
153、簡述readyonly與disabled的區別
readonly只針對input(text / password)和textarea有效,
而disabled對於所有的表單元素都有效,當表單元素在使用了disabled后,當我們將表單以POST或GET的方式提交的話,這個元素的值不會被傳遞出去,而readonly會將該值傳遞出去
154、判斷一個字符串出現次數最多的字符,統計這個次數並輸出
155、編寫一個方法,去掉一個數組的復重元素
156、寫出3個使用this的典型應用
構造函數中使用this,原型中使用this,對象字面量使用this
157、請盡可能詳盡的解釋ajax的工作原理
思路:先解釋異步,再解釋ajax如何使用
Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然后用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
158、為什么擴展javascript內置對象不是好的做法?
因為擴展內置對象會影響整個程序中所使用到的該內置對象的原型屬性
159、請解釋一下javascript的同源策略
域名、協議、端口相同
160、什么是三元表達式?“三元”表示什么意思?
? :
因為運算符會涉及3個表達式
161、瀏覽器標准模式和怪異模式之間的區別是什么?
標准模式是指,瀏覽器按W3C標准解析執行代碼;
怪異模式則是使用瀏覽器自己的方式解析執行代碼,因為不同瀏覽器解析執行的方式不一樣,所以我們稱之為怪異模式。
瀏覽器解析時到底使用標准模式還是怪異模式,與你網頁中的DTD聲明直接相關,DTD聲明定義了標准文檔的類型(標准模式解析)文檔類型,會使瀏覽器使用相應的方式加載網頁並顯示,忽略DTD聲明,將使網頁進入怪異模式
162、如果設計中使用了非標准的字體,你該如何去實現?
先通過font-face定義字體,再引用
@font-face
{
font-family: myFirstFont;
src: url('Sansation_Light.ttf'),
url('Sansation_Light.eot'); /* IE9+ */
}
163、用css分別實現某個div元素上下居中和左右居中
margin:0 auto;
164、module(12,5)//2 實現滿足這個結果的modulo函數
function modulo(a,b){
return a%b;//return a/b;
}
165、HTTP協議中,GET和POST有什么區別?分別適用什么場景 ?
get傳送的數據長度有限制,post沒有
get通過url傳遞,在瀏覽器地址欄可見,post是在報文中傳遞
適用場景:
post一般用於表單提交
get一般用於簡單的數據查詢,嚴格要求不是那么高的場景
166、HTTP狀態消息200 302 304 403 404 500分別表示什么
200:請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
302:請求的資源臨時從不同的 URI響應請求。由於這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以后的請求。只有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的
304:如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)並沒有改變,則服務器應當返回這個狀態碼。304響應禁止包含消息體,因此始終以消息頭后的第一個空行結尾。
403:服務器已經理解請求,但是拒絕執行它。
404:請求失敗,請求所希望得到的資源未被在服務器上發現。
500:服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器端的源代碼出現錯誤時出現。
167、HTTP協議中,header信息里面,怎么控制頁面失效時間(last-modified,cache-control,Expires分別代表什么)
Last-Modified |
文 檔的最后改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲於指定時間的文檔 才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。 |
Expires |
應該在什么時候認為文檔已經過期,從而不再緩存它? |
168、HTTP協議目前常用的有哪幾個?KEEPALIVE從哪個版本開始出現的?
http1.0
http1.1 keeplive
169、業界常用的優化WEB頁面加載速度的方法(可以分別從頁面元素展現,請求連接,css,js,服務器等方面介紹)
170、列舉常用的web頁面開發,調試以及優化工具
sublime vscode webstorm hbuilder dw
httpwatch=>ie
ff:firebug
chrome:
171、解釋什么是sql注入,xss漏洞
172、如何判斷一個js變量是數組類型
ES5:Array.isArray()
[] instanceof Array
Object.prototype.toString.call([]);//"[object Array]"
173、請列舉js數組類型中的常用方法
方法 |
描述 |
連接兩個或更多的數組,並返回結果。 |
|
把數組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。 |
|
刪除並返回數組的最后一個元素 |
|
向數組的末尾添加一個或更多元素,並返回新的長度。 |
|
顛倒數組中元素的順序。 |
|
刪除並返回數組的第一個元素 |
|
從某個已有的數組返回選定的元素 |
|
對數組的元素進行排序 |
|
刪除元素,並向數組添加新元素。 |
|
返回該對象的源代碼。 |
|
把數組轉換為字符串,並返回結果。 |
|
把數組轉換為本地數組,並返回結果。 |
|
向數組的開頭添加一個或更多元素,並返回新的長度。 |
|
返回數組對象的原始值 |
174、FF與IE中如何阻止事件冒泡,如何獲取事件對象,以及如何獲取觸發事件的元素
175、列舉常用的js框架以及分別適用的領域
jquery:簡化了js的一些操作,並且提供了一些非常好用的API
jquery ui、jquery-easyui:在jqeury的基礎上提供了一些常用的組件 日期,下拉框,表格這些組件
require.js、sea.js(阿里的玉帛)+》模塊化開發使用的
zepto:精簡版的jquery,常用於手機web前端開發 提供了一些手機頁面實用功能,touch
ext.js:跟jquery差不多,但是不開源,也沒有jquery輕量
angular、knockoutjs、avalon(去哪兒前端總監):MV*框架,適合用於單頁應用開發(SPA)
176、js中如何實現一個map
數組的map方法:
概述
map() 方法返回一個由原數組中的每個元素調用一個指定方法后的返回值組成的新數組。
語法
array.map(
callback[,
thisArg])
參數
callback
原數組中的元素經過該方法后返回一個新的元素。
currentValue
callback
的第一個參數,數組中當前被傳遞的元素。
index
callback
的第二個參數,數組中當前被傳遞的元素的索引。
array
callback
的第三個參數,調用 map
方法的數組。
thisArg
執行 callback
函數時 this
指向的對象。
實現:
Array.prototype.map2=function(callback){
for (var i = 0; i < this.length; i++) {
this[i]=callback(this[i]);
}
};
177、js可否實現面向對象編程,如果可以如何實現js對象的繼承
創建對象的幾種方式
實現繼承的幾種方式
原型鏈
178、約瑟夫環—已知n個人(以編號1,2,3…分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。
179、有1到10w這個10w個數,去除2個並打亂次序,如何找出那兩個數?
180、如何獲取對象a擁有的所有屬性(可枚舉的、不可枚舉的,不包括繼承來的屬性)
Object.keys——IE9+
或者使用for…in並過濾出繼承的屬性
for(o in obj){
if(obj.hasOwnproperty(o)){
//把o這個屬性放入到一個數組中
}
}
181、有下面這樣一段HTML結構,使用css實現這樣的效果:
左邊容器無論寬度如何變動,右邊容器都能自適應填滿父容器剩余的寬度。
<div class=”warp”>
<div class=”left”></div>
<div class=”right”></div>
</div>
182、下面這段代碼想要循環昝輸出結果01234,請問輸出結果是否正確,如果不正確,請說明為什么,並修改循環內的代碼使其輸出正確結果
for(var i=0;i<5;++i){
setTimeout(function(){
console.log(i+’’);
},100*i);
}
183、解釋下這個css選擇器什么發生什么?
[role=nav]>ul a:not([href^-mailto]){}
184、JavaScript以下哪條語句會產生運行錯誤
A. var obj = (); B. var obj = []; C. var obj = {}; D. var obj = //;
答案:AD
185、以下哪些是javascript的全局函數:(ABCDE)
A. escape 函數可對字符串進行編碼,這樣就可以在所有的計算機上讀取該字符串。ECMAScript v3 反對使用該方法,應用使用 decodeURI() 和 decodeURIComponent() 替代它。
B. parseFloat parseFloat() 函數可解析一個字符串,並返回一個浮點數。
該函數指定字符串中的首個字符是否是數字。如果是,則對字符串進行解析,直到到達數字的末端為止,然后以數字返回該數字,而不是作為字符串。
C. eval 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。
D. setTimeout
E. alert
186、關於IE的window對象表述正確的有:(CD)
A. window.opener屬性本身就是指向window對象
window.opener返回打開當前窗口的那個窗口的引用.
如果當前窗口是由另一個窗口打開的, window.opener保留了那個窗口的引用. 如果當前窗口不是由其他窗口打開的, 則該屬性返回 null.
B. window.reload()方法可以用來刷新當前頁面 //正確答案:應該是location.reload或者window.location.reload
C. window.location=”a.html”和window.location.href=”a.html”的作用都是把當前頁面替換成a.html頁面
D. 定義了全局變量g;可以用window.g的方式來存取該變量
187、描述錯誤的是 D
A:Http狀態碼302表示暫時性轉移 對
B:domContentLoaded事件早於onload事件 //正確
當 onload 事件觸發時,頁面上所有的DOM,樣式表,腳本,圖片,flash都已經加載完成了。
當 DOMContentLoaded 事件觸發時,僅當DOM加載完成,不包括樣式表,圖片,flash。
C: IE678不支持事件捕獲
D:localStorage 存儲的數據在電腦重啟后丟失 //錯誤,因為沒有時間限制
try...catch 語句。(在 IE5+、Mozilla 1.0、和 Netscape 6 中可用)
188、關於link和@import的區別正確的是 A
A: link屬於XHTML標簽,而@import是CSS提供的;
B:頁面被加載時,link會同時被加載,而后者引用的CSS會等到頁面被加載完再加載
C:import只在IE5以上才能識別 而link是XHTML標簽,無兼容問題
D: link方式的樣式的權重高於@import的權重
189、下面正確的是 A
A: 跨域問題能通過JsonP方案解決
B:不同子域名間僅能通過修改window.name解決跨域 //還可以通過script標簽src jsonp
C:只有在IE中可通過iframe嵌套跨域 //任何瀏覽器都可以使用iframe
D:MediaQuery屬性是進行視頻格式檢測的屬性是做響應式的
188、錯誤的是:AC
A: Ajax本質是XMLHttpRequest //異步請求json和xml數據
B: 塊元素實際占用的寬度與它的width、border、padding屬性有關,與background無關
C: position屬性absolute、fixed、---relative---會使文檔脫標
D: float屬性left也會使div脫標
189、不用任何插件,如何實現一個tab欄切換?
通過改變不同層的css設置層的顯示和隱藏
190、基本數據類型的專業術語以及單詞拼寫
191、變量的命名規范以及命名推薦
192、三種彈窗的單詞以及三種彈窗的功能
alert
confirm
prompt
193、console.log( 8 | 1 ); 輸出值是多少?
答案:9
194、只允許使用 + - * / 和 Math.* ,求一個函數 y = f(x, a, b);當x > 100 時返回 a 的值,否則返回 b 的值,不能使用 if else 等條件語句,也不能使用|,?:,數組。
答案:
function f(x, a, b) {
var temp = Math.ceil(Math.min(Math.max(x - 100, 0), 1));
return a * temp + b * (1 - temp);
}
console.log(f(-10, 1, 2));
195、JavaScript alert(0.4*0.2);結果是多少?和你預期的一樣嗎?如果不一樣該如何處理?
有誤差,應該比准確結果偏大。 一般我會將小數變為整數來處理。當前之前遇到這個問題時也上網查詢發現有人用try catch return寫了一個函數,
當然原理也是一致先轉為整數再計算。看起來挺麻煩的,我沒用過。
196、一個div,有幾種方式得到這個div的jQuery對象?<div class='aabbcc' id='nodesView'></div>想直接獲取這個div的dom對象,如何獲取?dom對象如何轉化為jQuery對象?
var domView=document.getElementById(“nodesView”)
document.getElementsByClassName(“aabbcc”);
document.querySelector(“.aabbcc#nodesView”);
轉換為jquery對象:$( domView)
197、主流瀏覽器內核
IE trident 火狐gecko 谷歌蘋果webkit
Opera:Presto
198、如何顯示/隱藏一個dom元素?請用原生的JavaScript方法實現
dom.style.display=”none”;
dom.style.display=””;
199、JavaScript有哪幾種數據類型
Number String Boolean Null Undefined Object
200、jQuery框架中$.ajax()的常用參數有哪些?
type
類型:String
默認值: "GET")。請求方式 ("POST" 或 "GET"), 默認為 "GET"。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支持。
url
類型:String
默認值: 當前頁地址。發送請求的地址。
success
類型:Function
請求成功后的回調函數。
參數:由服務器返回,並根據 dataType 參數進行處理后的數據;描述狀態的字符串。
這是一個 Ajax 事件。
options
類型:Object
可選。AJAX 請求設置。所有選項都是可選的。
async
類型:Boolean
默認值: true。默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。
注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行。
beforeSend(XHR)
類型:Function
發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP 頭。
XMLHttpRequest 對象是唯一的參數。
這是一個 Ajax 事件。如果返回 false 可以取消本次 ajax 請求。
cache
類型:Boolean
默認值: true,dataType 為 script 和 jsonp 時默認為 false。設置為 false 將不緩存此頁面。
jQuery 1.2 新功能。
contentType
類型:String
默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。
默認值適合大多數情況。如果你明確地傳遞了一個 content-type 給 $.ajax() 那么它必定會發送給服務器(即使沒有數據要發送)。
data
類型:String
發送到服務器的數據。將自動轉換為請求字符串格式。GET 請求中將附加在 URL 后。查看 processData 選項說明以禁止此自動轉換。必須為 Key/Value 格式。如果為數組,jQuery 將自動為不同值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換為 '&foo=bar1&foo=bar2'。
dataFilter
類型:Function
給 Ajax 返回的原始數據的進行預處理的函數。提供 data 和 type 兩個參數:data 是 Ajax 返回的原始數據,type 是調用 jQuery.ajax 時提供的 dataType 參數。函數返回的值將由 jQuery 進一步處理。
dataType
類型:String
預期服務器返回的數據類型。如果不指定,jQuery 將自動根據 HTTP 包 MIME 信息來智能判斷,比如 XML MIME 類型就被識別為 XML。在 1.4 中,JSON 就會生成一個 JavaScript 對象,而 script 則會執行這個腳本。隨后服務器端返回的數據會根據這個值解析后,傳遞給回調函數。可用值:
- "xml": 返回 XML 文檔,可用 jQuery 處理。
- "html": 返回純文本 HTML 信息;包含的 script 標簽會在插入 dom 時執行。
- "script": 返回純文本 JavaScript 代碼。不會自動緩存結果。除非設置了 "cache" 參數。注意:在遠程請求時(不在同一個域下),所有 POST 請求都將轉為 GET 請求。(因為將使用 DOM 的 script標簽來加載)
- "json": 返回 JSON 數據 。
- "jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函數名,以執行回調函數。
- "text": 返回純文本字符串
error
類型:Function
默認值: 自動判斷 (xml 或 html)。請求失敗時調用此函數。
有以下三個參數:XMLHttpRequest 對象、錯誤信息、(可選)捕獲的異常對象。
如果發生了錯誤,錯誤信息(第二個參數)除了得到 null 之外,還可能是 "timeout", "error", "notmodified" 和 "parsererror"。
這是一個 Ajax 事件。
寫一個post請求並帶有發送數據和返回數據的樣例
$.ajax({
url:"1.html",
data:{name:"張三",age:18},//post數據
dataType:"json",
type:"POST",
success:function(data){
//data:返回的數據
},
error:function(){
//異常處理
}
});
201、JavaScript數組元素添加、刪除、排序等方法有哪些?
Array.concat( ) 連接數組
Array.join( ) 將數組元素連接起來以構建一個字符串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最后一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字符串
Array.toString( ) 將數組轉換成一個字符串
Array.unshift( ) 在數組頭部插入一個元素
202、如何添加html元素的事件,有幾種方法?請列舉
a、直接在標簽里添加:<div onclick=”alert(你好)”>這是一個層</div>
b、在元素上通過js添加:
c、使用事件注冊函數添加
203、JavaScript的循環語句有哪些?
while for do while for…in
204、作用域-編譯期執行期以及全局局部作用域問題
理解js執行主要的兩個階段:預解析和執行期
205、閉包:下面這個ul,如何點擊每一列的時候alert其index?
<ul id="test">
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>
//非閉包實現
var lis=document.querySelectorAll('li');
document.querySelector('#test').onclick=function(e){
for (var i = 0; i < lis.length; i++) {
var li = lis[i];
if(li==e.target){
alert(i);
}
}
};
//閉包實現
var lis=document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
var li = lis[i];
li.onclick=(function(index){
return function(e){
alert(index);
};
})(i);
}
206、列出3條以上ff和IE的腳本兼容問題
1、在IE下可通過document.frames["id"];得到該IFRAME對象,
而在火狐下則是通過document.getElementById("content_panel_if").contentWindow;
2、IE的寫法: _tbody=_table.childNodes[0]
在FF中,firefox會在子節點中包含空白則第一個子節點為空白"", 而ie不會返回空白
可以通過if("" != node.nodeName)過濾掉空白子對象
3、模擬點擊事件
if(document.all){ //ie下
document.getElementById("a3").click();
}
else{ //非IE
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
document.getElementById("a3").dispatchEvent(evt);
}
4、事件注冊
if (isIE){window.attachEvent("onload", init);}else{window.addEventListener("load", init, false);}
207、列舉可以哪些方面對前端開發進行優化
代碼壓縮、合並減少http請求,圖片制作精靈圖、代碼優化
208、至少列出一種JavaScript繼承的實現方式
209、如現在有一個效果,有顯示用戶頭像、用戶昵稱、用戶其他信息;當用戶鼠標移到頭像上時,會彈出用戶的所有信息;如果是你,你會如何實現這個功能,請用代碼實現?
//答案見:J:\代碼,PPT,筆記,電子書\面試題\面試題02.html
210、call與apply有什么作用?又有什么什么區別?用callee屬性實現函數遞歸?
apply的參數是數組,call的參數是單個的值,除此之外,兩者沒有差別,重點理解this的改變,callee已經不推薦使用
211、用正則表達式,寫出由字母開頭,其余由數字、字母、下划線組成的6~30的字符串?
var reg=/^[a-ZA-Z][\da-zA-Z_]{5,29}/;
212、列舉瀏覽器對象模型BOM里常用的至少4個對象,並列舉window對象的常用方法至少5個 (10分)
對象:window document location screen history navigator
方法:alert() confirm() prompt() open() close() setInterval() setTimeout() clearInterval() clearTimeout()
(詳細參見:J:\代碼,PPT,筆記,電子書\面試題\window對象方法.png)
213、Javascript中callee和caller的作用?
caller是返回一個對函數的引用,該函數調用了當前函數;
用法:fn.caller
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
用法:arguments.callee
214、對於apply和call兩者在作用上是相同的,即是調用一個對象的一個方法,以另一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
但兩者在參數上有區別的。對於第一個參數意義都一樣,但對第二個參數:?apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。?如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3]) 。
215、在Javascript中什么是偽數組?如何將偽數組轉化為標准數組?
偽數組(類數組):無法直接調用數組方法或期望length屬性有什么特殊的行為,但仍可以對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組。
可以使用Array.prototype.slice.call(fakeArray)將數組轉化為真正的Array對象。
216、寫一個函數可以計算 sum(5,0,-5);輸出0; sum(1,2,3,4);輸出10;
function calc(){
var result=0;
for (var i = 0; i < arguments.length; i++) {
var obj = arguments[i];
result+=obj;
}
return result;
}
alert(calc(1,2,3,4));
Js基本功
217、事件代理怎么實現?
在元素的父節點注冊事件,通過事件冒泡,在父節點捕獲事件
218、《正則》寫出正確的正則表達式匹配固話號,區號3-4位,第一位為0,中橫線,7-8位數字,中橫線,3-4位分機號格式的固話號
常用正則表達式語法要熟悉
/0[0-9]{2,3}-\d{7,8}/
219、《算法》 一下A,B可任選一題作答,兩題全答加分
A:農場買了一只羊,第一年是小羊,第二年底生一只,第三年不生,第四年底再生一只,第五年死掉。
B:寫出代碼對下列數組去重並從大到小排列{5,2,3,6,8,6,5,4,7,1,9}
先去重再排序
去重方法參考:J:\代碼,PPT,筆記,電子書\面試題
220、請寫出一張圖片的HTML代碼,已知道圖片地址為“images/abc.jpg”,寬100px,高50px
221、請寫一個正則表達式:要求最短6位數,最長20位,阿拉伯數和英文字母(不區分大小寫)組成
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$
222、統計1到400億之間的自然數中含有多少個1?比如1-21中,有1、10、11、12、13、14、15、16、17、18、19、20、21這么多自然數有13個1
答案參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_222.html
223、刪除與某個字符相鄰且相同的字符,比如fdaffdaaklfjklja字符串處理之后成為“fdafdaklfjklja”
答案參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_223.html
224、請寫出三種以上的Firefox有但InternetExplorer沒有的屬性和函數
1、在IE下可通過document.frames["id"];得到該IFRAME對象,
而在火狐下則是通過document.getElementById("content_panel_if").contentWindow;
2、IE的寫法: _tbody=_table.childNodes[0]
在FF中,firefox會在子節點中包含空白則第一個子節點為空白"", 而ie不會返回空白
可以通過if("" != node.nodeName)過濾掉空白子對象
3、模擬點擊事件
if(document.all){ //ie下
document.getElementById("a3").click();
}
else{ //非IE
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
document.getElementById("a3").dispatchEvent(evt);
}
4、事件注冊
if (isIE){window.attachEvent("onload", init);}else{window.addEventListener("load", init, false);}
225、請寫出一個程序,在頁面加載完成后動態創建一個form表單,並在里面添加一個input對象並給它任意賦值后義post方式提交到:http://127.0.0.1/save.php
答案參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_225.html
226、用JavaScript實現冒泡排序。數據為23、45、18、37、92、13、24
面試經常遇到的排序,查找算法要熟悉
227、解釋一下什么叫閉包,並實現一段閉包代碼
簡單理解就是函數的嵌套形成閉包,閉包包括函數本身及其外部作用域
228、簡述一下什么叫事件委托以及其原理
在元素的父節點注冊事件,通過事件冒泡,在父節點捕獲事件
229、前端代碼優化的方法
var User = { 對象
count = 1,屬性
getCount:function(){ 方法
return this.count;
}
}
console.log(User.getCount());
var func = User.getCount;
console.log(func());
1 undefined(window);
230、下列JavaScript代碼執行后,依次alert的結果是
(function test(){
var a=b=5;
alert(typeof a);
alert(typeof b);
})();
alert(typeof a);
alert(typeof b);
//number number undefined number
231、下列JavaScript代碼執行后,iNum的值是
var iNum = 0;
for(var i = 1; i< 10; i++){
if(i % 5 == 0){
continue;
}
iNum++;
}
分析:
i=1 1
i=2 2
i=3 3
i=4 4
i=5
i=6 6
i=7 7
i=8 8
i=9 9
232、輸出結果是多少?
1) var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
答案:26
擴展:關於乘法操作符:J:\代碼,PPT,筆記,電子書\面試題\乘性操作符.png
2) <script>
var a = 1;
</script>
<script>
var a;
var b = a * 0;
if (b == b) { //b=0
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
</script>
答案:6
3) var t = 10;
function test(t){
var t = t++;//此時的t是一個局部變量,全局變量沒有任何變化
console.log(t);//此時的結果又是多少?
}test(t);
console.log(t);
答案:10
4) var t = 10;
function test(test){
var t = test++;
}test(t);
console.log(t);
答案:10
6) var t = 10;
function test(test){
t = test++;
}test(t);
console.log(t);
答案:10
7) var t = 10;
function test(test){
t = t + test;//undefined+10=NaN
console.log(t);
var t = 3;
}test(t);
console.log(t);
答案:NaN 10
8)var a;
var b = a / 0;
if (b == b) {//b=NaN
console.log(!b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
答案:26
9)<script>
var a = 1;
</script>
<script>
var a;
var b = a / 0;
if (b == b) { //b=Infinity
console.log(b * 2 + "2" + 4);
} else {
console.log(!b * 2 + "2" + 4);
}
</script>
答案:Infinity24
233、用程序實現找到html中id名相同的元素?
<body>
<form id='form1'>
<div id='div1'></div>
<div id='div2'></div>
<div id='div3'></div>
<div id='div4'></div>
<div id='div5'></div>
<div id='div3'>id名重復的元素</div>
</form>
</body>
234、下列JavaScript代碼執行后,運行的結果是
<button id='btn'>點擊我</button>
var btn = document.getElementById('btn');
var handler = {
id: '_eventHandler',
exec: function(){
alert(this.id);
}
}
btn.addEventListener('click', handler.exec);
答案:btn,因為handler.exec是由btn這個按鈕執行的
235、☆☆☆下列JavaScript代碼執行后,依次alert的結果是
var obj = {proto: {a:1,b:2}};
function F(){};
F.prototype = obj.proto;
var f = new F();
obj.proto.c = 3;
obj.proto = {a:-1, b:-2};
alert(f.a);//1
alert(f.c);//3
delete F.prototype['a'];
alert(f.a);//undefined
alert(obj.proto.a);//-1
236、下列JavaScript代碼執行后的效果是
<ul id='list'>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
var items = document.querySelectorAll('#list>li');
for(var i = 0;i < items.length; i++){
setTimeout(function(){
items[i].style.backgroundColor = '#fee';
}, 5);
}
答案:異常
237、下列JavaScript代碼執行后的li元素的數量是
<ul>
<li>Item</li>
<li></li>
<li></li>
<li>Item</li>
<li>Item</li>
</ul>
var items = document.getElementsByTagName('li');
for(var i = 0; i< items.length; i++){
if(items[i].innerHTML == ''){
items[i].parentNode.removeChild(items[i]);
}
}
答案:4個
238、程序中捕獲異常的方法?
window.error
try{}catch(){}finally{}
239、將字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替換成10,{$name}替換成Tony (使用正則表達式)
答案:”<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>”.replace(/{\$id}/g,’10′).replace(/{\$name}/g,‘Tony’);
240、給String對象添加一個方法,傳入一個string類型的參數,然后將string的每個字符間價格空格返回,例如:
addSpace(“hello world”) // -> ‘h e l l o ?w o r l d’
String.prototype.spacify = function(){
return this.split('').join(' ');
};
241、寫出函數DateDemo的返回結果,系統時間假定為今天
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() + "/";
s += d.getDate() + "/";
s += d.getFullYear();
return s;
}
結果:今天日期是:7/17/2010
242、輸出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,則輸出2014-09-26
var d = new Date();
// 獲取年,getFullYear()返回4位的數字
var year = d.getFullYear();
// 獲取月,月份比較特殊,0是1月,11是12月
var month = d.getMonth() + 1;
// 變成兩位
month = month < 10 ? '0' + month : month;
// 獲取日
var day = d.getDate();
day = day < 10 ? '0' + day : day;
alert(year + '-' + month + '-' + day);
243、已知數組var?stringArray?=?[“This”,?“is”,?“Baidu”,?“Campus”],Alert出”This?is?Baidu?Campus”。
答案:alert(stringArray.join(“”))
244、已知有字符串foo=”get-element-by-id”,寫一個function將其轉化成駝峰表示法”getElementById”。
function combo(msg){
var arr=msg.split("-");
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
245、.var numberArray=[3,6,2,4,1,5]; (考察基礎API)
1)實現對該數組的倒排,輸出[5,1,4,2,6,3]
2)實現對該數組的降序排列,輸出[6,5,4,3,2,1]
function combo(msg){
var arr=msg.split("-");
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
246、把兩個數組合並,並刪除第二個元素。
var array1 = ['a','b','c'];
var bArray = ['d','e','f'];
var cArray = array1
答案:
array1=array1.concat(bArray)
array1.splice(1,1)
247、如何消除一個數組里面重復的元素?
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
function deRepeat(){
var newArr=[];
var obj={};
var index=0;
var l=arr.length;
for(var i=0;i<l;i++){
if(obj[arr[i]]==undefined)
{
obj[arr[i]]=1;
newArr[index++]=arr[i];
}
else if(obj[arr[i]]==1)
}
return newArr;
}
var newArr2=deRepeat(arr);
alert(newArr2); //輸出1,2,3,4,5,6,9,25
248、用js實現隨機選取10–100之間的10個數字,存入一個數組,並排序。
var iArray = [];
funtion getRandom(istart, iend){
var iChoice = istart - iend +1;
return Math.floor(Math.random() * iChoice + istart;
}
for(var i=0; i<10; i++){
iArray.push(getRandom(10,100));
}
iArray.sort();
249、正則表達式構造函數var reg=new RegExp(“xxx”)與正則表達字面量var reg=//有什么不同?匹配郵箱的正則表達式?
答案:當使用RegExp()構造函數的時候,不僅需要轉義引號(即\”表示”),並且還需要雙反斜杠(即\\表示一個\)。使用正則表達字面量的效率更高。?
250、1 var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
正則表達式對象3 – 清除空格
寫一個function,清除字符串前后的空格。(兼容所有瀏覽器)
使用自帶接口trim(),考慮兼容性:
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/,"");
} }
// test the function
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"
251、數組和字符串
<script lang="JavaScript" type="text/javascript">
function outPut(s) {
document.writeln(s);
}
var a = "lashou";
var b = a;
outPut(b);
a = "拉手";
outPut(a);
outPut(b);
var a_array = [1, 2, 3];
var b_array = a_array;
outPut(b_array);
a_array[3] = 4;
outPut(a_array);
outPut(b_array);
</script>
輸出結果:
答案:lashou 拉手 lashou 1,2,3 1,2,3,4 1,2,3,4
252、下列控制台都輸出什么
第1題:
function setName(){
name="張三";
}
setName();
console.log(name);
答案:"張三"
253、第2題:
//考點:1、變量聲明提升 2、變量搜索機制
var a=1;
function test(){
console.log(a);
var a=1;
}
test();
答案:undefined
254、第3題:
var b=2;
function test2(){
window.b=3;
console.log(b);
}
test2();
答案:3
255、第4題:
c=5;//聲明一個全局變量c
function test3(){
window.c=3;
console.log(c); //答案:undefined,原因:由於此時的c是一個局部變量c,並且沒有被賦值
var c;
console.log(window.c);//答案:3,原因:這里的c就是一個全局變量c
}
test3();
256、第5題:
var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr[10] = 'c';
alert(arr.length); //答案:11
console.log(arr[5]); //答案:undefined
257、第6題:
var a=1;
console.log(a++); //答案:1
console.log(++a); //答案:3
258、第7題:
console.log(null==undefined); //答案:true
console.log("1"==1); //答案:true,因為會將數字1先轉換為字符串1
console.log("1"===1); //答案:false,因為數據類型不一致
259、第8題:
typeof 1; "number"
typeof "hello"; "string"
typeof /[0-9]/; "object"
typeof {}; "object"
typeof null; "object"
typeof undefined; "undefined"
typeof [1,2,3]; "object"
typeof function(){}; //"function"
260、第9題:
parseInt(3.14); //3
parseFloat("3asdf"); //3
parseInt("1.23abc456");
parseInt(true);//"true" NaN
261、第10題:
//考點:函數聲明提前
function bar() {
return foo;
foo = 10;
function foo() {}
//var foo = 11;
}
alert(typeof bar());//"function"
262、第11題:考點:函數聲明提前
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);//答案:1
263、第12題:
console.log(a);//是一個函數
var a = 3;
function a(){}
console.log(a);////3
264、第13題:
//考點:對arguments的操作
function foo(a) {
arguments[0] = 2;
alert(a);//答案:2,因為:a、arguments是對實參的訪問,b、通過arguments[i]可以修改指定實參的值
}
foo(1);
265、第14題:
function foo(a) {
alert(arguments.length);//答案:3,因為arguments是對實參的訪問
}
foo(1, 2, 3);
266、第15題
bar();//報錯
var foo = function bar(name) {
console.log("hello"+name);
console.log(bar);
};
//alert(typeof bar);
foo("world");//"hello"
console.log(bar);//undefined
console.log(foo.toString());
bar();//報錯
267、第16題
function test(){
console.log("test函數");
}
setTimeout(function(){
console.log("定時器回調函數");
}, 0)
test();
function foo(){
var name="hello";
}
三、Jquery
1、jQuery 的 slideUp動畫 ,如果目標元素是被外部事件驅動, 當鼠標快速地連續觸發外部元素事件, 動畫會滯后的反復執行,該如何處理呢?
先stop(true,true)后slideUp()
示例代碼參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_jquery_slideup.html
關於stop()參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_jquery.png
四、HTML5 CSS3
1、CSS3有哪些新特性?
1. CSS3實現圓角(border-radius),陰影(box-shadow),
2. 對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform)
3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋轉,縮放,定位,傾斜
4. 增加了更多的CSS選擇器 多背景 rgba
5. 在CSS3中唯一引入的偽元素是 ::selection.
6. 媒體查詢,多欄布局
7. border-image
2、html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
新特性:
1. 拖拽釋放(Drag and drop) API
2. 語義化更好的內容標簽(header,nav,footer,aside,article,section)
3. 音頻、視頻API(audio,video)
4. 畫布(Canvas) API
5. 地理(Geolocation) API
6. 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;
7. sessionStorage 的數據在瀏覽器關閉后自動刪除
8. 表單控件,calendar、date、time、email、url、search
9. 新的技術webworker, websocket, Geolocation
移除的元素:
1. 純表現的元素:basefont,big,center,font, s,strike,tt,u;
2. 對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標簽:
1. IE8/IE7/IE6支持通過 document.createElement 方法產生的標簽,可以利用這一特性讓這些瀏覽器支持 HTML5 新標簽,瀏覽器支持新標簽后,還需要添加標簽默認的樣式(當然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架):
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何區分:
DOCTYPE聲明新增的結構元素、功能元素
3、本地存儲(Local Storage )和cookies(儲存在用戶本地終端上的數據)之間的區別是什么?
Cookies:服務器和客戶端都可以訪問;大小只有4KB左右;有有效期,過期后將會刪除;
本地存儲:只有本地瀏覽器端可訪問數據,服務器不能訪問本地存儲直到故意通過POST或者GET的通道發送到服務器;每個域5MB;沒有過期數據,它將保留知道用戶從瀏覽器清除或者使用Javascript代碼移除
4、如何實現瀏覽器內多個標簽頁之間的通信?
調用 localstorge、cookies 等本地存儲方式
5、你如何對網站的文件和資源進行優化?
文件合並
文件最小化/文件壓縮
使用CDN托管
緩存的使用
6、什么是響應式設計?
它是關於網頁制作的過程中讓不同的設備有不同的尺寸和不同的功能。響應式設計是讓所有的人能在這些設備上讓網站運行正常
7、新的 HTML5 文檔類型和字符集是?
答:HTML5文檔類型:<!doctype html>
HTML5使用的編碼<meta charset=”UTF-8”>
8、HTML5 Canvas 元素有什么用?
答:Canvas 元素用於在網頁上繪制圖形,該元素標簽強大之處在於可以直接在 HTML 上進行圖形操作。
9、HTML5 存儲類型有什么區別?
答:Media API、Text Track API、Application Cache API、User Interaction、Data Transfer API、Command API、Constraint Validation API、History API
10、用H5+CSS3解決下導航欄最后一項掉下來的問題
11、CSS3新增偽類有那些?
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最后 <p> 元素的每個 <p> 元素。
p:only-of-type 選擇屬於其父元素唯一的 <p> 元素的每個 <p> 元素。
p:only-child 選擇屬於其父元素的唯一子元素的每個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或復選框被選中。
12、請用CSS實現:一個矩形內容,有投影,有圓角,hover狀態慢慢變透明。
css屬性的熟練程度和實踐經驗
13、描述下CSS3里實現元素動畫的方法
動畫相關屬性的熟悉程度
14、html5\CSS3有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
HTML5 現在已經不是 SGML 的子集,主要是關於圖像,位置,存儲,地理定位等功能的增加。
* 繪畫 canvas 元素
用於媒介回放的 video 和 audio 元素
本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;
sessionStorage 的數據在瀏覽器關閉后自動刪除
語意化更好的內容元素,比如 article、footer、header、nav、section
表單控件,calendar、date、time、email、url、search
CSS3實現圓角,陰影,對文字加特效,增加了更多的CSS選擇器 多背景 rgba
新的技術webworker, websockt, Geolocation
移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
* 是IE8/IE7/IE6支持通過document.createElement方法產生的標簽,
可以利用這一特性讓這些瀏覽器支持HTML5新標簽,
瀏覽器支持新標簽后,還需要添加標簽默認的樣式:
* 當然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
15、你怎么來實現頁面設計圖,你認為前端應該如何高質量完成工作? 一個滿屏 品 字布局 如何設計?
* 首先划分成頭部、body、腳部;。。。。。
* 實現效果圖是最基本的工作,精確到2px;
與設計師,產品經理的溝通和項目的參與
做好的頁面結構,頁面重構和用戶體驗
處理hack,兼容、寫出優美的代碼格式
針對服務器的優化、擁抱 HTML5。
16、你能描述一下漸進增強和優雅降級之間的不同嗎?
漸進增強 progressive enhancement:針對低版本瀏覽器進行構建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 graceful degradation:一開始就構建完整的功能,然后再針對低版本瀏覽器進行兼容。
區別:優雅降級是從復雜的現狀開始,並試圖減少用戶體驗的供給,而漸進增強則是從一個非常基礎的,能夠起作用的版本開始,並不斷擴充,以適應未來環境的需要。降級(功能衰減)意味着往回看;而漸進增強則意味着朝前看,同時保證其根基處於安全地帶。
“優雅降級”觀點
“優雅降級”觀點認為應該針對那些最高級、最完善的瀏覽器來設計網站。而將那些被認為“過時”或有功能缺失的瀏覽器下的測試工作安排在開發周期的最后階段,並把測試對象限定為主流瀏覽器(如 IE、Mozilla 等)的前一個版本。
在這種設計范例下,舊版的瀏覽器被認為僅能提供“簡陋卻無妨 (poor, but passable)” 的瀏覽體驗。你可以做一些小的調整來適應某個特定的瀏覽器。但由於它們並非我們所關注的焦點,因此除了修復較大的錯誤之外,其它的差異將被直接忽略。
“漸進增強”觀點
“漸進增強”觀點則認為應關注於內容本身。
內容是我們建立網站的誘因。有的網站展示它,有的則收集它,有的尋求,有的操作,還有的網站甚至會包含以上的種種,但相同點是它們全都涉及到內容。這使得“漸進增強”成為一種更為合理的設計范例。這也是它立即被 Yahoo! 所采納並用以構建其“分級式瀏覽器支持 (Graded Browser Support)”策略的原因所在。
那么問題了。現在產品經理看到IE6,7,8網頁效果相對高版本現代瀏覽器少了很多圓角,陰影(CSS3),要求兼容(使用圖片背景,放棄CSS3),你會如何說服他?
17、為什么利用多個域名來存儲網站資源會更有效?
CDN緩存更方便
突破瀏覽器並發限制
節約cookie帶寬
節約主域名的連接數,優化頁面響應速度
防止不必要的安全問題
18、請談一下你對網頁標准和標准制定機構重要性的理解。
(無標准答案)網頁標准和標准制定機構都是為了能讓web發展的更‘健康’,開發者遵循統一的標准,降低開發難度,開發成本,SEO也會更好做,也不會因為濫用代碼導致各種BUG、安全問題,最終提高網站易用性。
19、請描述一下cookies,sessionStorage和localStorage的區別?
sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束后數據也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的。
web storage和cookie的區別
Web Storage的概念和cookie相似,區別是它是為了更大容量存儲設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被發送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域調用。
除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是與服務器進行交互,作為HTTP規范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲”數據而生。
20、知道css有個content屬性嗎?有什么作用?有什么應用?
知道。css的content屬性專門應用在 before/after 偽元素上,用來插入生成內容。最常見的應用是利用偽類清除浮動。
//一種常見利用偽類清除浮動的代碼
.clearfix:after {
content:"."; //這里利用到了content屬性
display:block;
height:0;
visibility:hidden;
clear:both; }
.clearfix {
*zoom:1;
}
after偽元素通過 content 在元素的后面生成了內容為一個點的塊級素,再利用clear:both清除浮動。
那么問題繼續還有,知道css計數器(序列數字字符自動遞增)嗎?如何通過css content屬性實現css計數器?
答案:css計數器是通過設置counter-reset 、counter-increment 兩個屬性 、及 counter()/counters()一個方法配合after / before 偽類實現。
21、如何在 HTML5 頁面中嵌入音頻?
HTML 5 包含嵌入音頻文件的標准方式,支持的格式包括 MP3、Wav 和 Ogg:
<audio controls>
<source src="jamshed.mp3" type="audio/mpeg">
Your browser does'nt support audio embedding feature.
</audio>
22、如何在 HTML5 頁面中嵌入視頻?
和音頻一樣,HTML5 定義了嵌入視頻的標准方法,支持的格式包括:MP4、WebM 和 Ogg:
<video width="450" height="340" controls>
<source src="jamshed.mp4" type="video/mp4">
Your browser does'nt support video embedding feature.
</video>
23、HTML5 引入什么新的表單屬性?
Datalist datetime output keygen date month week time number range emailurl
24、CSS3新增偽類有那些?
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最后 <p> 元素的每個 <p> 元素。
p:only-of-type 選擇屬於其父元素唯一的 <p> 元素的每個 <p> 元素。
p:only-child 選擇屬於其父元素的唯一子元素的每個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或復選框被選中。
25、(寫)描述一段語義的html代碼吧。
(HTML5中新增加的很多標簽(如:<article>、<nav>、<header>和<footer>等)
就是基於語義化設計原則)
< div id="header">
< h1>標題< /h1>
< h2>專注Web前端技術< /h2>
< /div>
語義 HTML 具有以下特性:
文字包裹在元素中,用以反映內容。例如:
段落包含在 <p> 元素中。
順序表包含在<ol>元素中。
從其他來源引用的大型文字塊包含在<blockquote>元素中。
HTML 元素不能用作語義用途以外的其他目的。例如:
<h1>包含標題,但並非用於放大文本。
<blockquote>包含大段引述,但並非用於文本縮進。
空白段落元素 ( <p></p> ) 並非用於跳行。
文本並不直接包含任何樣式信息。例如:
不使用 <font> 或 <center> 等格式標記。
類或 ID 中不引用顏色或位置。
26.cookie在瀏覽器和服務器間來回傳遞。 sessionStorage和localStorage區別
sessionStorage和localStorage的存儲空間更大;
sessionStorage和localStorage有更多豐富易用的接口;
sessionStorage和localStorage各自獨立的存儲空間;
27、html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
* HTML5 現在已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增加。
* 繪畫 canvas
用於媒介回放的 video 和 audio 元素
本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;
sessionStorage 的數據在瀏覽器關閉后自動刪除
語意化更好的內容元素,比如 article、footer、header、nav、section
表單控件,calendar、date、time、email、url、search
新的技術webworker, websockt, Geolocation
* 移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標簽:
* IE8/IE7/IE6支持通過document.createElement方法產生的標簽,
可以利用這一特性讓這些瀏覽器支持HTML5新標簽,
瀏覽器支持新標簽后,還需要添加標簽默認的樣式:
* 當然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
28、如何區分: DOCTYPE聲明\新增的結構元素\功能元素
29、語義化的理解?
用正確的標簽做正確的事情!
html語義化就是讓頁面的內容結構化,便於對瀏覽器、搜索引擎解析;
在沒有樣式CCS情況下也以一種文檔格式顯示,並且是容易閱讀的。
搜索引擎的爬蟲依賴於標記來確定上下文和各個關鍵字的權重,利於 SEO。
使閱讀源代碼的人對網站更容易將網站分塊,便於閱讀維護理解。
30、HTML5的離線儲存?
localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;
sessionStorage 數據在瀏覽器關閉后自動刪除。
31、寫出HTML5的文檔聲明方式
|
<DOCYPE html> |
32、HTML5和CSS3的新標簽
|
HTML5: nav, footer, header, section, hgroup, video, time, canvas, audio... CSS3: RGBA, opacity, text-shadow, box-shadow, border-radius, border-image, border-color, transform...; |
33、自己對標簽語義化的理解
在我看來,語義化就是比如說一個段落, 那么我們就應該用 <p>標簽來修飾,標題就應該用 <h?>標簽等。符合文檔語義的標簽。
五、移動web開發
1、移動端常用類庫及優缺點
知識面寬度,多多益善
2、Zepto庫和JQ區別
Zepto相對jQuery更加輕量,主要用在移動端,jQuery也有對應的jQuerymobile移動端框架d
六、Ajax
1、Ajax 是什么? 如何創建一個Ajax?
Ajax並不算是一種新的技術,全稱是asynchronous javascript and xml,可以說是已有技術的組合,主要用來實現客戶端與服務器端的異步通信效果,實現頁面的局部刷新,早期的瀏覽器並不能原生支持ajax,可以使用隱藏幀(iframe)方式變相實現異步效果,后來的瀏覽器提供了對ajax的原生支持
使用ajax原生方式發送請求主要通過XMLHttpRequest(標准瀏覽器)、ActiveXObject(IE瀏覽器)對象實現異步通信效果
基本步驟:
var xhr =null;//創建對象
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(“方式”,”地址”,”標志位”);//初始化請求
xhr.setRequestHeader(“”,””);//設置http頭信息
xhr.onreadystatechange =function(){}//指定回調函數
xhr.send();//發送請求
js框架(jQuery/EXTJS等)提供的ajax API對原生的ajax進行了封裝,熟悉了基礎理論,再學習別的框架就會得心應手,好多都是換湯不換葯的內容
2、同步和異步的區別?
同步:阻塞的
-張三叫李四去吃飯,李四一直忙得不停,張三一直等着,直到李四忙完兩個人一塊去吃飯
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器一直等着(頁面白屏),直到服務器返回數據,瀏覽器才能顯示頁面
異步:非阻塞的
-張三叫李四去吃飯,李四在忙,張三說了一聲然后自己就去吃飯了,李四忙完后自己去吃
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器可以自如的干原來的事情(顯示頁面),服務器返回數據的時候通知瀏覽器一聲,瀏覽器把返回的數據再渲染到頁面,局部更新
3、如何解決跨域問題?
理解跨域的概念:協議、域名、端口都相同才同域,否則都是跨域
出於安全考慮,服務器不允許ajax跨域獲取數據,但是可以跨域獲取文件內容,所以基於這一點,可以動態創建script標簽,使用標簽的src屬性訪問js文件的形式獲取js腳本,並且這個js腳本中的內容是函數調用,該函數調用的參數是服務器返回的數據,為了獲取這里的參數數據,需要事先在頁面中定義回調函數,在回調函數中處理服務器返回的數據,這就是解決跨域問題的主流解決方案
4、頁面編碼和被請求的資源編碼如果不一致如何處理?
對於ajax請求傳遞的參數,如果是get請求方式,參數如果傳遞中文,在有些瀏覽器會亂碼,不同的瀏覽器對參數編碼的處理方式不同,所以對於get請求的參數需要使用 encodeURIComponent函數對參數進行編碼處理,后台開發語言都有相應的解碼api。對於post請求不需要進行編碼
5、簡述ajax 的過程。
1. 創建XMLHttpRequest對象,也就是創建一個異步調用對象
2. 創建一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
3. 設置響應HTTP請求狀態變化的函數
4. 發送HTTP請求
5. 獲取異步調用返回的數據
6. 使用JavaScript和DOM實現局部刷新
6、闡述一下異步加載。
1. 異步加載的方案: 動態插入 script 標簽
2. 通過 ajax 去獲取 js 代碼,然后通過 eval 執行
3. script 標簽上添加 defer 或者 async 屬性
4. 創建並插入 iframe,讓它異步執行 js
7、請解釋一下 JavaScript 的同源策略。
同源策略是客戶端腳本(尤其是Javascript)的重要的安全度量標准。它最早出自Netscape Navigator2.0,其目的是防止某個文檔或腳本從多個不同源裝載。所謂同源指的是:協議,域名,端口相同,同源策略是一種安全協議,指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
8、GET和POST的區別,何時使用POST?
GET:一般用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,一般在2000個字符,有的瀏覽器是8000個字符
POST:一般用於修改服務器上的資源,對所發送的信息沒有限制
在以下情況中,請使用 POST 請求:
1. 無法使用緩存文件(更新服務器上的文件或數據庫)
2. 向服務器發送大量數據(POST 沒有數據量限制)
3. 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
9、ajax 是什么?ajax 的交互模型?同步和異步的區別?如何解決跨域問題?
1. 通過異步模式,提升了用戶體驗
2. 優化了瀏覽器和服務器之間的傳輸,減少不必要的數據往返,減少了帶寬占用
3. Ajax在客戶端運行,承擔了一部分本來由服務器承擔的工作,減少了大用戶量下的服務器負載。
10、 Ajax的最大的特點是什么。
Ajax可以實現異步通信效果,實現頁面局部刷新,帶來更好的用戶體驗;按需獲取數據,節約帶寬資源;
11、ajax的缺點
1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務器交互的細節。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制。
12、ajax請求的時候get 和post方式的區別
get一般用來進行查詢操作,url地址有長度限制,請求的參數都暴露在url地址當中,如果傳遞中文參數,需要自己進行編碼操作,安全性較低。
post請求方式主要用來提交數據,沒有數據長度的限制,提交的數據內容存在於http請求體中,數據不會暴漏在url地址中。
13、解釋jsonp的原理,以及為什么不是真正的ajax
Jsonp並不是一種數據格式,而json是一種數據格式,jsonp是用來解決跨域獲取數據的一種解決方案,具體是通過動態創建script標簽,然后通過標簽的src屬性獲取js文件中的js腳本,該腳本的內容是一個函數調用,參數就是服務器返回的數據,為了處理這些返回的數據,需要事先在頁面定義好回調函數,本質上使用的並不是ajax技術
14、什么是Ajax和JSON,它們的優缺點。
Ajax是全稱是asynchronous JavaScript andXML,即異步JavaScript和xml,用於在Web頁面中實現異步數據交互,實現頁面局部刷新。
優點:可以使得頁面不重載全部內容的情況下加載局部內容,降低數據傳輸量,避免用戶不斷刷新或者跳轉頁面,提高用戶體驗
缺點:對搜索引擎不友好;要實現ajax下的前后退功能成本較大;可能造成請求數的增加跨域問題限制;
JSON是一種輕量級的數據交換格式,ECMA的一個子集
優點:輕量級、易於人的閱讀和編寫,便於機器(JavaScript)解析,支持復合數據類型(數組、對象、字符串、數字)
15、http常見的狀態碼有那些?分別代表是什么意思?
200 - 請求成功
301 - 資源(網頁等)被永久轉移到其它URL
404 - 請求的資源(網頁等)不存在
500 - 內部服務器錯誤
16、一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什么?
分為4個步驟:
1. 當發送一個 URL 請求時,不管這個 URL 是 Web 頁面的 URL 還是 Web 頁面上每個資源的 URL,瀏覽器都會開啟一個線程來處理這個請求,同時在遠程 DNS 服務器上啟動一個 DNS 查詢。這能使瀏覽器獲得請求對應的 IP 地址。
2. 瀏覽器與遠程 Web 服務器通過 TCP 三次握手協商來建立一個 TCP/IP 連接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端嘗試建立起通信,而后服務器應答並接受客戶端的請求,最后由客戶端發出該請求已經被接受的報文。
3. 一旦 TCP/IP 連接建立,瀏覽器會通過該連接向遠程服務器發送 HTTP 的 GET 請求。遠程服務器找到資源並使用 HTTP 響應返回該資源,值為 200 的 HTTP 響應狀態表示一個正確的響應。
4. 此時,Web 服務器提供資源服務,客戶端開始下載資源。
17、ajax請求的時候get 和post方式的區別
get一般用來進行查詢操作,url地址有長度限制,請求的參數都暴露在url地址當中,如果傳遞中文參數,需要自己進行編碼操作,安全性較低。
post請求方式主要用來提交數據,沒有數據長度的限制,提交的數據內容存在於http請求體中,數據不會暴漏在url地址中。
18、ajax請求時,如何解釋json數據
使用eval() 或者JSON.parse() 鑒於安全性考慮,推薦使用JSON.parse()更靠譜,對數據的安全性更好。
19、.javascript的本地對象,內置對象和宿主對象
本地對象為獨立於宿主環境的ECMAScript提供的對象,包括Array Object RegExp等可以new實例化的對象
內置對象為Gload,Math 等不可以實例化的(他們也是本地對象,內置對象是本地對象的一個子集)
宿主對象為所有的非本地對象,所有的BOM和DOM對象都是宿主對象,如瀏覽器自帶的document,window 等對象
20、為什么利用多個域名來存儲網站資源會更有效?
確保用戶在不同地區能用最快的速度打開網站,其中某個域名崩潰用戶也能通過其他郁悶訪問網站,並且不同的資源放到不同的服務器上有利於減輕單台服務器的壓力。
21、請說出三種減低頁面加載時間的方法
1、壓縮css、js文件
2、合並js、css文件,減少http請求
3、外部js、css文件放在最底下
4、減少dom操作,盡可能用變量替代不必要的dom操作
22、HTTP狀態碼都有那些。
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
七、JS高級
1、JQuery一個對象可以同時綁定多個事件,這是如何實現的?
jQuery可以給一個對象同時綁定多個事件,低層實現方式是使用addEventListner或attachEvent兼容不同的瀏覽器實現事件的綁定,這樣可以給同一個對象注冊多個事件。
2、知道什么是webkit么? 知道怎么用瀏覽器的各種工具來調試和debug代碼么?
Webkit是瀏覽器引擎,包括html渲染和js解析功能,手機瀏覽器的主流內核,與之相對應的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也稱MSHTML,IE 使用)。
對於瀏覽器的調試工具要熟練使用,主要是頁面結構分析,后台請求信息查看,js調試工具使用,熟練使用這些工具可以快速提高解決問題的效率
3、如何測試前端代碼? 知道BDD, TDD, Unit Test么? 知道怎么測試你的前端工程么(mocha, sinon, jasmin, qUnit..)?
了解BDD行為驅動開發與TDD測試驅動開發已經單元測試相關概念,
4、前端templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?
Web 模板引擎是為了使用戶界面與業務數據(內容)分離而產生的,
Mustache 是一個 logic-less (輕邏輯)模板解析引擎,它的優勢在於可以應用在 Javascript、PHP、Python、Perl 等多種編程語言中。
Underscore封裝了常用的JavaScript對象操作方法,用於提高開發效率。
Handlebars 是 JavaScript 一個語義模板庫,通過對view和data的分離來快速構建Web模板。
5、簡述一下 Handlebars 的基本用法?
沒有用過的話說出它是干什么的即可
參考:J:\代碼,PPT,筆記,電子書\面試題\handlebarDemo
6、簡述一下 Handlerbars 的對模板的基本處理流程, 如何編譯的?如何緩存的?
學習技術不僅要會用,還有熟悉它的實現機制,這樣在開發中遇到問題時才能更好的解決
7、用js實現千位分隔符?
原生js的熟練度,實踐經驗,實現思路
8、檢測瀏覽器版本版本有哪些方式?
IE與標准瀏覽器判斷,IE不同版本的判斷,userAgent var ie = /*@cc_on !@*/false;
9、我們給一個dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡,你來說下會執行幾次事件,然后會先執行冒泡還是捕獲
對兩種事件模型的理解
10、實現一個函數clone,可以對JavaScript中的5種主要的數據類型(包括Number、String、Object、Array、Boolean)進行值復制
- 考察點1:對於基本數據類型和引用數據類型在內存中存放的是值還是指針這一區別是否清楚
- 考察點2:是否知道如何判斷一個變量是什么類型的
- 考察點3:遞歸算法的設計
|
// 方法一: Object.prototype.clone = function(){ var o = this.constructor === Array ? [] : {}; for(var e in this){ o[e] = typeof this[e] === "object" ? this[e].clone() : this[e]; } return o; } //方法二: /** * 克隆一個對象 * @param Obj * @returns */ function clone(Obj) { var buf; if (Obj instanceof Array) { buf = [];//創建一個空的數組 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; }else if (Obj instanceof Object){ buf = {};//創建一個空對象 for (var k in Obj) { //為這個對象添加新的屬性 buf[k] = clone(Obj[k]); } return buf; }else{ //普通變量直接賦值 return Obj; } } |
11、如何消除一個數組里面重復的元素?
|
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4]; function deRepeat(){ var newArr=[]; var obj={}; var index=0; var l=arr.length; for(var i=0;i<l;i++){ if(obj[arr[i]]==undefined) { obj[arr[i]]=1; newArr[index++]=arr[i]; } else if(obj[arr[i]]==1) continue; } return newArr; } var newArr2=deRepeat(arr); alert(newArr2); //輸出1,2,3,4,5,6,9,25 |
12、小賢是一條可愛的小狗(Dog),它的叫聲很好聽(wow),每次看到主人的時候就會乖乖叫一聲(yelp)。從這段描述可以得到以下對象:
|
function Dog() { this.wow = function() { alert(’Wow’); } this.yelp = function() { this.wow(); } } |
小芒和小賢一樣,原來也是一條可愛的小狗,可是突然有一天瘋了(MadDog),一看到人就會每隔半秒叫一聲(wow)地不停叫喚(yelp)。請根據描述,按示例的形式用代碼來實。(繼承,原型,setInterval)
|
function MadDog() { this.yelp = function() { var self = this; setInterval(function() { self.wow(); }, 500); } } MadDog.prototype = new Dog(); //for test var dog = new Dog(); dog.yelp(); var madDog = new MadDog(); madDog.yelp(); |
13、下面這個ul,如何點擊每一列的時候alert其index?(閉包)
|
<ul id=”test”> <li>這是第一條</li> <li>這是第二條</li> <li>這是第三條</li> </ul> |
|
// 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=function(){ alert(this.index); }; } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++){ lis[i].index=i; lis[i].onclick=(function(a){ return function() { alert(a); } })(i); } |
14、編寫一個JavaScript函數,輸入指定類型的選擇器(僅需支持id,class,tagName三種簡單CSS選擇器,無需兼容組合選擇器)可以返回匹配的DOM節點,需考慮瀏覽器兼容性和性能。
/*** @param selector {String} 傳入的CSS選擇器。* @return {Array}*/
|
var query = function(selector) { var reg = /^(#)?(\.)?(\w+)$/img; var regResult = reg.exec(selector); var result = []; //如果是id選擇器 if(regResult[1]) { if(regResult[3]) { if(typeof document.querySelector === "function") { result.push(document.querySelector(regResult[3])); }else { result.push(document.getElementById(regResult[3])); } } } //如果是class選擇器 else if(regResult[2]) { if(regResult[3]) { if(typeof document.getElementsByClassName === 'function') { var doms = document.getElementsByClassName(regResult[3]); if(doms) { result = converToArray(doms); } } //如果不支持getElementsByClassName函數 else { var allDoms = document.getElementsByTagName("*") ; for(var i = 0, len = allDoms.length; i < len; i++) { if(allDoms[i].className.search(new RegExp(regResult[2])) > -1) { result.push(allDoms[i]); } } } } } //如果是標簽選擇器 else if(regResult[3]) { var doms = document.getElementsByTagName(regResult[3].toLowerCase()); if(doms) { result = converToArray(doms); } } return result; } function converToArray(nodes){ var array = null; try{ array = Array.prototype.slice.call(nodes,0);//針對非IE瀏覽器 }catch(ex){ array = new Array(); for( var i = 0 ,len = nodes.length; i < len ; i++ ) { array.push(nodes[i]) } } return array; } |
15、請評價以下代碼並給出改進意見。
|
if(window.addEventListener){ var addListener = function(el,type,listener,useCapture){ el.addEventListener(type,listener,useCapture); }; } else if(document.all){ addListener = function(el,type,listener){ el.attachEvent("on"+type,function(){ listener.apply(el); }); } } |
- 不應該在if和else語句中聲明addListener函數,應該先聲明;
- 不需要使用window.addEventListener或document.all來進行檢測瀏覽器,應該使用能力檢測;
- 由於attachEvent在IE中有this指向問題,所以調用它時需要處理一下
改進如下:
function addEvent(elem, type, handler){ if(elem.addEventListener){ elem.addEventListener(type, handler, false); }else if(elem.attachEvent){ elem['temp' + type + handler] = handler; elem[type + handler] = function(){ elem['temp' + type + handler].apply(elem); }; elem.attachEvent('on' + type, elem[type + handler]); }else{ elem['on' + type] = handler; } } |
16、給String對象添加一個方法,傳入一個string類型的參數,然后將string的每個字符間價格空格返回,例如:
addSpace(“hello world”) // -> ‘h e l l o w o r l d’
|
String.prototype.spacify = function(){ return this.split('').join(' '); }; |
接着上述問題答案提問,1)直接在對象的原型上添加方法是否安全?尤其是在Object對象上。(這個我沒能答出?希望知道的說一下。) 2)函數聲明與函數表達式的區別?
答案:在js中,解析器在向執行環境中加載數據時,對函數聲明和函數表達式並非是一視同仁的,解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問),至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解析執行。
17、定義一個log方法,讓它可以代理console.log的方法。
可行的方法一:
function log(msg) { console.log(msg); } log("hello world!") // hello world! |
如果要傳入多個參數呢?顯然上面的方法不能滿足要求,所以更好的方法是:
function log(){ console.log.apply(console, arguments); }; |
到此,追問apply和call方法的異同。
對於apply和call兩者在作用上是相同的,即是調用一個對象的一個方法,以另一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
但兩者在參數上有區別的。對於第一個參數意義都一樣,但對第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。 如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3]) 。
18、在Javascript中什么是偽數組?如何將偽數組轉化為標准數組?
偽數組(類數組):無法直接調用數組方法或期望length屬性有什么特殊的行為,但仍可以對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組。可以使用Array.prototype.slice.call(fakeArray)將數組轉化為真正的Array對象。
假設接第八題題干,我們要給每個log方法添加一個”(app)”前綴,比如’hello world!’ ->’(app)hello world!’。方法如下:
function log(){ var args = Array.prototype.slice.call(arguments); //為了使用unshift數組方法,將argument轉化為真正的數組 args.unshift('(app)'); console.log.apply(console, args); }; |
19、對作用域上下文和this的理解,看下列代碼:
var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); // what? var func = User.getCount; console.log(func()); // what? |
問兩處console輸出什么?為什么?
答案是1和undefined。
func是在winodw的上下文中被執行的,所以會訪問不到count屬性。
繼續追問,那么如何確保Uesr總是能訪問到func的上下文,即正確返回1。正確的方法是使用Function.prototype.bind。兼容各個瀏覽器完整代碼如下:
Function.prototype.bind = Function.prototype.bind || function(context){ var self = this; return function(){ return self.apply(context, arguments); }; } var func = User.getCount.bind(User); console.log(func()); |
20、原生JS的window.onload與Jquery的$(document).ready(function(){})有什么不同?如何用原生JS實現Jq的ready方法?
window.onload()方法是必須等到頁面內包括圖片的所有元素加載完畢后才能執行。
$(document).ready()是DOM結構繪制完畢后就執行,不必等到加載完畢。
/* * 傳遞函數給whenReady() * 當文檔解析完畢且為操作准備就緒時,函數作為document的方法調用 */ var whenReady = (function() { //這個函數返回whenReady()函數 var funcs = []; //當獲得事件時,要運行的函數 var ready = false; //當觸發事件處理程序時,切換為true //當文檔就緒時,調用事件處理程序 function handler(e) { if(ready) return; //確保事件處理程序只完整運行一次 //如果發生onreadystatechange事件,但其狀態不是complete的話,那么文檔尚未准備好 if(e.type === 'onreadystatechange' && document.readyState !== 'complete') { return; } //運行所有注冊函數 //注意每次都要計算funcs.length //以防這些函數的調用可能會導致注冊更多的函數 for(var i=0; i<funcs.length; i++) { funcs[i].call(document); } //事件處理函數完整執行,切換ready狀態, 並移除所有函數 ready = true; funcs = null; } //為接收到的任何事件注冊處理程序 if(document.addEventListener) { document.addEventListener('DOMContentLoaded', handler, false); document.addEventListener('readystatechange', handler, false); //IE9+ window.addEventListener('load', handler, false); }else if(document.attachEvent) { document.attachEvent('onreadystatechange', handler); window.attachEvent('onload', handler); } //返回whenReady()函數 return function whenReady(fn) { if(ready) { fn.call(document); } else { funcs.push(fn); } } })(); |
如果上述代碼十分難懂,下面這個簡化版:
function ready(fn){ if(document.addEventListener) {//標准瀏覽器 document.addEventListener('DOMContentLoaded', function() { //注銷事件, 避免反復觸發 document.removeEventListener('DOMContentLoaded',arguments.callee, false); fn();//執行函數 }, false); }else if(document.attachEvent) {//IE document.attachEvent('onreadystatechange', function() { if(document.readyState == 'complete') { document.detachEvent('onreadystatechange', arguments.callee); fn();//函數執行 } }); } }; |
21、(設計題)想實現一個對頁面某個節點的拖曳?如何做?(使用原生JS)
回答出概念即可,下面是幾個要點
1. 給需要拖拽的節點綁定mousedown, mousemove, mouseup事件
2. mousedown事件觸發后,開始拖拽
3. mousemove時,需要通過event.clientX和clientY獲取拖拽位置,並實時更新位置
4. mouseup時,拖拽結束
5. 需要注意瀏覽器邊界的情況
22、請實現如下功能
function setcookie(name,value,days){ //給cookie增加一個時間變量 var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); //設置過期時間為days天 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); } function getCookie(name){ var result = ""; var myCookie = ""+document.cookie+";"; var searchName = "+name+"="; var startOfCookie = myCookie.indexOf(searchName); var endOfCookie; if(satrtOfCookie != -1){ startOfcookie += searchName.length; endOfCookie = myCookie.indexOf(";",startOfCookie); result = (myCookie.substring(startOfCookie,endOfCookie)); } return result; } (function(){ var oTips = document.getElementById('tips');//假設tips的id為tips var page = { check: function(){//檢查tips的cookie是否存在並且允許顯示 var tips = getCookie('tips'); if(!tips || tips == 'show') return true;//tips的cookie不存在 if(tips == "never_show_again") return false; }, hideTip: function(bNever){ if(bNever) setcookie('tips', 'never_show_again', 365); oTips.style.display = "none";//隱藏 }, showTip: function(){ oTips.style.display = "inline";//顯示,假設tips為行級元素 }, init: function(){ var _this = this; if(this.check()){ _this.showTip(); setcookie('tips', 'show', 1); } oTips.onclick = function(){ _this.hideTip(true); }; } }; page.init(); })(); |
23、說出以下函數的作用是?空白區域應該填寫什么?
//define (function(window){ function fn(str){ this.str=str; }
fn.prototype.format = function(){ var arg = ______; return this.str.replace(_____,function(a,b){ return arg[b]||""; }); } window.fn = fn; })(window);
//use (function(){ var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>'); console.log(t.format('http://www.alibaba.com','Alibaba','Welcome')); })(); |
答案:訪函數的作用是使用format函數將函數的參數替換掉{0}這樣的內容,返回一個格式化后的結果:
第一個空是:arguments
第二個空是:/\{(\d+)\}/ig
24、 Javascript作用域鏈?
理解變量和函數的訪問范圍和生命周期,全局作用域與局部作用域的區別,JavaScript中沒有塊作用域,函數的嵌套形成不同層次的作用域,嵌套的層次形成鏈式形式,通過作用域鏈查找屬性的規則需要深入理解。
25、 談談this對象的理解。
理解不同形式的函數調用方式下的this指向,理解事件函數、定時函數中的this指向,函數的調用形式決定了this的指向。
26、 eval是做什么的?
它的功能是把對應的字符串解析成JS代碼並運行;應該避免使用eval,不安全,非常耗性能(2個步驟,一次解析成js語句,一次執行)
27、 關於事件,IE與火狐的事件機制有什么區別? 如何阻止冒泡?
[1].在IE中,事件對象是作為一個全局變量來保存和維護的.所有的瀏覽器事件,不管是用戶觸發的,還是其他事件,都會更新window.event對象.所以在代碼中,只要調用window.event就可以獲取事件對象, 再event.srcElement就可以取得觸發事件的元素進行進一步處理.
[2].在FireFox中,事件對象卻不是全局對象,一般情況下,是現場發生,現場使用,FireFox把事件對象自動傳給事件處理程序.
關於事件的兼容性處理要熟練掌握,事件對象具體哪些屬性存在兼容性問題,IE與標准事件模型事件冒泡與事件捕獲的支持要理解
28、 什么是閉包(closure),為什么要用它?
簡單的理解是函數的嵌套形成閉包,閉包包括函數本身已經它的外部作用域
使用閉包可以形成獨立的空間,延長變量的生命周期,報存中間狀態值
29、javascript 代碼中的"use strict";是什么意思 ? 使用它區別是什么?
意思是使用嚴格模式,使用嚴格模式,一些不規范的語法將不再支持
嚴格模式
鏈接:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
全局變量顯式聲明
靜態綁定
禁止使用with語句
eval中定義的變量都是局部變量
禁止this關鍵字指向全局對象
禁止在函數內部遍歷調用棧
嚴格模式下無法刪除變量。只有configurable設置為true的對象屬性,才能被刪除
正常模式下,對一個對象的只讀屬性進行賦值,不會報錯,只會默默地失敗。嚴格模式下,將報錯。
嚴格模式下,對一個使用getter方法讀取的屬性進行賦值,會報錯。
嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。
嚴格模式下,刪除一個不可刪除的屬性,會報錯。
正常模式下,如果對象有多個重名屬性,最后賦值的那個屬性會覆蓋前面的值。嚴格模式下,這屬於語法錯誤。
正常模式下,如果函數有多個重名的參數,可以用arguments[i]讀取。嚴格模式下,這屬於語法錯誤。
正常模式下,整數的第一位如果是0,表示這是八進制數,比如0100等於十進制的64。嚴格模式禁止這種表示法,整數第一位為0,將報錯。
不允許對arguments賦值
arguments不再追蹤參數的變化
禁止使用arguments.callee
嚴格模式只允許在全局作用域或函數作用域的頂層聲明函數。也就是說,不允許在非函數的代碼塊內聲明函數
嚴格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
30、如何判斷一個對象是否屬於某個類(嚴格來說在ES6之前,js沒有類的概念)?
instanceof constructor
31、new操作符具體干了什么呢?
1、創建一個空對象,並且 this 變量引用該對象,同時還繼承了該函數的原型。
2、屬性和方法被加入到 this 引用的對象中。
3、新創建的對象由 this 所引用,並且最后隱式的返回 this 。
32、用原生JavaScript的實現過什么功能嗎?
主要考察原生js的實踐經驗
33、Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?
HasOwnProperty
34、對JSON的了解?
輕量級數據交互格式,可以形成復雜的嵌套格式,解析非常方便
35、js延遲加載的方式有哪些?
方案一:<script>標簽的async="async"屬性(詳細參見:script標簽的async屬性)
方案二:<script>標簽的defer="defer"屬性
方案三:動態創建<script>標簽
方案四:AJAX eval(使用AJAX得到腳本內容,然后通過eval_r(xmlhttp.responseText)來運行腳本)
方案五:iframe方式
36、模塊化開發怎么做?
理解模塊化開發模式:瀏覽器端requirejs,seajs;服務器端nodejs;ES6模塊化;fis、webpack等前端整體模塊化解決方案;grunt、gulp等前端工作流的使用
37、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規范區別?
理解這兩種規范的差異,主要通過requirejs與seajs的對比,理解模塊的定義與引用方式
的差異以及這兩種規范的設計原則
參考鏈接1:https://www.zhihu.com/question/20351507/answer/14859415
參考鏈接2:https://github.com/seajs/seajs/issues/277
1、對於依賴的模塊,AMD 是提前執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。CMD 推崇 as lazy as possible.
2、CMD 推崇依賴就近,AMD 推崇依賴前置。
3. AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啟動。CMD 里,每個 API 都簡單純粹。
38、requireJS的核心原理是什么?(如何動態加載的?如何避免多次加載的?如何 緩存的?)
核心是js的加載模塊,通過正則匹配模塊以及模塊的依賴關系,保證文件加載的先后順序,根據文件的路徑對加載過的文件做了緩存
39、讓你自己設計實現一個requireJS,你會怎么做?
核心是實現js的加載模塊,維護js的依賴關系,控制好文件加載的先后順序
40、談一談你對ECMAScript6的了解?
ES6新的語法糖,類,模塊化等新特性
關於ES6參考鏈接:http://es6.ruanyifeng.com/
- ECMAScript 6簡介
- let和const命令
- 變量的解構賦值
- 字符串的擴展
- 正則的擴展
- 數值的擴展
- 數組的擴展
- 函數的擴展
- 對象的擴展
- Symbol
- Proxy和Reflect
- 二進制數組
- Set和Map數據結構
- Iterator和for...of循環
- Generator函數
- Promise對象
- 異步操作和Async函數
- Class
- Decorator
- Module
41、ECMAScript6 怎么寫class么,為什么會出現class這種東西?
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '('+this.x+', '+this.y+')';
}
}
42、異步加載的方式有哪些?
方案一:<script>標簽的async="async"屬性(詳細參見:script標簽的async屬性)
方案二:<script>標簽的defer="defer"屬性
方案三:動態創建<script>標簽
方案四:AJAX eval(使用AJAX得到腳本內容,然后通過eval_r(xmlhttp.responseText)來運行腳本)
方案五:iframe方式
43、documen.write和 innerHTML的區別?
document.write是重寫整個document, 寫入內容是字符串的html
innerHTML是HTMLElement的屬性,是一個元素的內部html內容
44、DOM操作——怎樣添加、移除、移動、復制、創建和查找節點?
(1)創建新節點
createDocumentFragment() //創建一個DOM片段
createElement_x() //創建一個具體的元素
createTextNode() //創建一個文本節點
(2)添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore()
(3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
45、call() 和 apply() 的含義和區別?
apply的參數是數組形式,call的參數是單個的值,除此之外在使用上沒有差別,重點理解這兩個函數調用的this改變
46、數組和對象有哪些原生方法,列舉一下?
Array.concat( ) 連接數組
Array.join( ) 將數組元素連接起來以構建一個字符串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最后一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字符串
Array.toString( ) 將數組轉換成一個字符串
Array.unshift( ) 在數組頭部插入一個元素
Object對象的常用方法
Object.hasOwnProperty( ) 檢查屬性是否被繼承
Object.isPrototypeOf( ) 一個對象是否是另一個對象的原型
Object.propertyIsEnumerable( ) 是否可以通過for/in循環看到屬性
Object.toLocaleString( ) 返回對象的本地字符串表示
Object.toString( ) 定義一個對象的字符串表示
Object.valueOf( ) 指定對象的原始值
47、JS 怎么實現一個類。怎么實例化這個類
嚴格來講js中並沒有類的概念,不過js中的函數可以作為構造函數來使用,通過new來實例化,其實函數本身也是一個對象。
48、JavaScript中的作用域與變量聲明提升?
理解JavaScript的預解析機制,js的運行主要分兩個階段:js的預解析和運行,預解析階段所有的變量聲明和函數定義都會提前,但是變量的賦值不會提前
49、如何編寫高性能的Javascript?
使用 DocumentFragment 優化多次 append
通過模板元素 clone ,替代 createElement
使用一次 innerHTML 賦值代替構建 dom 元素
使用 firstChild 和 nextSibling 代替 childNodes 遍歷 dom 元素
使用 Array 做為 StringBuffer ,代替字符串拼接的操作
將循環控制量保存到局部變量
順序無關的遍歷時,用 while 替代 for
將條件分支,按可能性順序從高到低排列
在同一條件子的多( >2 )條件分支時,使用 switch 優於 if
使用三目運算符替代條件分支
需要不斷執行的時候,優先考慮使用 setInterval
50、那些操作會造成內存泄漏?
閉包,死循環
51、javascript對象的幾種創建方式?
1. 工廠模式
2. 構造函數模式
3. 原型模式
4. 混合構造函數和原型模式
5. 動態原型模式
6. 寄生構造函數模式
7. 穩妥構造函數模式
52、javascript繼承的 6 種方法?
1. 原型鏈繼承
2. 借用構造函數繼承
3. 組合繼承(原型+借用構造)
4. 原型式繼承
5. 寄生式繼承
6. 寄生組合式繼承
53、eval是做什么的?
1. 它的功能是把對應的字符串解析成JS代碼並運行
2. 應該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執行)
54、JavaScript 原型,原型鏈 ? 有什么特點?
1. 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有自己的原型,如果一個原型對象的原型不為 null 的話,我們就稱之為原型鏈
2. 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈
55、事件、IE與火狐的事件機制有什么區別? 如何阻止冒泡?
1. 我們在網頁中的某個操作(有的操作對應多個事件)。例如:當我們點擊一個按鈕就會產生一個事件。是可以被 JavaScript 偵測到的行為
2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件
3. ev.stopPropagation();
注意舊ie的方法:ev.cancelBubble = true;
56、簡述一下Sass、Less,且說明區別?
他們是動態的樣式語言,是CSS預處理器,CSS上的一種抽象層。他們是一種特殊的語法/語言而編譯成CSS。
變量符不一樣,less是@,而Sass是$;
Sass支持條件語句,可以使用if{}else{},for{}循環等等。而Less不支持;
Sass是基於Ruby的,是在服務端處理的,而Less是需要引入less.js來處理Less代碼輸出Css到瀏覽器
57、關於javascript中apply()和call()方法的區別?
相同點:兩個方法產生的作用是完全一樣的
不同點:方法傳遞的參數不同
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
apply()接收兩個參數,一個是函數運行的作用域(this),另一個是參數數組。
call()方法第一個參數與apply()方法相同,但傳遞給函數的參數必須列舉出來。
58、簡述一下JS中的閉包?
閉包用的多的兩個作用:讀取函數內部的變量值;讓這些變量值始終保存着(在內存中)。
同時需要注意的是:閉包慎用,不濫用,不亂用,由於函數內部的變量都被保存在內存中,會導致內存消耗大。
59、說說你對this的理解?
在JavaScript中,this通常指向的是我們正在執行的函數本身,或者是,指向該函數所屬的對象。
全局的this → 指向的是Window
函數中的this → 指向的是函數所在的對象 錯誤答案
對象中的this → 指向其本身
事件中this → 指向事件對象
60、分別闡述split(),slice(),splice(),join()?
join()用於把數組中的所有元素拼接起來放入一個字符串。所帶的參數為分割字符串的分隔符,默認是以逗號分開。歸屬於Array
split()即把字符串分離開,以數組方式存儲。歸屬於Stringstring
slice() 方法可從已有的數組中返回選定的元素。該方法並不會修改數組,而是返回一個子數組。如果想刪除數組中的一段元素,應該使用方法 Array.splice()
splice() 方法向/從數組中添加/刪除項目,然后返回被刪除的項目。返回的是含有被刪除的元素的數組。
61、事件委托是什么?
讓利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
62、如何阻止事件冒泡和默認事件?
阻止瀏覽器的默認行為
window.event?window.event.returnValue=false:e.preventDefault();
停止事件冒泡
window.event?window.event.cancelBubble=true:e.stopPropagation();
原生JavaScript中,return false;只阻止默認行為,不阻止冒泡,jQuery中的return false;既阻止默認行為,又阻止冒泡
63、添加 刪除 替換 插入到某個接點的方法?
obj.appendChidl()
obj.removeChild()
obj.replaceChild()
obj.innersetBefore()
64、你用過require.js嗎?它有什么特性?
(1)實現js文件的異步加載,避免網頁失去響應;
(2)管理模塊之間的依賴性,便於代碼的編寫和維護。
65、談一下JS中的遞歸函數,並且用遞歸簡單實現階乘?
遞歸即是程序在執行過程中不斷調用自身的編程技巧,當然也必須要有一個明確的結束條件,不然就會陷入死循環。
66、請用正則表達式寫一個簡單的郵箱驗證。
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
67、簡述一下你對web性能優化的方案?
1、盡量減少 HTTP 請求
2、使用瀏覽器緩存
3、使用壓縮組件
4、圖片、JS的預載入
5、將腳本放在底部
6、將樣式文件放在頁面頂部
7、使用外部的JS和CSS
8、精簡代碼
68、在JS中有哪些會被隱式轉換為false
Undefined、null、布爾值false、NaN、零、空字符串
69、定時器setInterval有一個有名函數fn1,setInterval(fn1,500)與setInterval(fn1(),500)有什么區別?
第一個是重復執行每500毫秒執行一次,后面一個只執行一次。
70、外部JS文件出現中文字符,會出現什么問題,怎么解決?
會出現亂碼,加charset=”GB2312”;
另一種解決方式:網頁文件和外部JS文件都是UTF8編碼
71、談談瀏覽器的內核,並且說一下什么是內核?
Trident (['traɪd(ə)nt])--IE,Gecko (['gekəʊ])--Firefox, Presto (['prestəʊ])--opera,webkit—谷歌和Safari
瀏覽器內核又可以分成兩部分:渲染引擎和 JS 引擎。它負責取得網頁的內容(HTML、XML、圖像等等)、整理訊息(例如加入 CSS 等),以及計算網頁的顯示方式,然后會輸出至顯示器或打印機。JS 引擎則是解析 Javascript 語言,執行 javascript 語言來實現網頁的動態效果。
72、JavaScript原型,原型鏈 ? 有什么特點?
* 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有自己的原型,如果一個原型對象的原型不為null的話,我們就稱之為原型鏈。
* 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈。
* JavaScript的數據對象有那些屬性值?
writable:這個屬性的值是否可以改。
configurable:這個屬性的配置是否可以刪除,修改。
enumerable:這個屬性是否能在for…in循環中遍歷出來或在Object.keys中列舉出來。
value:屬性值。
* 當我們需要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 如果沒有的話,就會查找他的Prototype對象是否有這個屬性。
function clone(proto) {
function Dummy() { }
Dummy.prototype = proto;
Dummy.prototype.constructor = Dummy;
return new Dummy(); //等價於Object.create(Person);
}
function object(old) {
function F() {};
F.prototype = old;
return new F();
}
var newObj = object(oldObject);
73、寫一個通用的事件偵聽器函數
`// event(事件)工具集,來源:https://github.com/markyun
markyun.Event = {
// 頁面加載完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 視能力分別使用dom0||dom2||IE方式 來綁定事件
// 參數: 操作的元素,事件名稱 ,事件處理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件類型、需要執行的函數、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEnentListener) {
element.removeEnentListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡,因為IE不支持事件捕獲)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默認行為
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 獲取事件目標
getTarget : function(event) {
return event.target || event.srcElement;
},
// 獲取event對象的引用,取到事件的所有信息,確保隨時能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
74、事件、IE與火狐的事件機制有什么區別? 如何阻止冒泡?
1. 我們在網頁中的某個操作(有的操作對應多個事件)。例如:當我們點擊一個按鈕就會產生一個事件。是可以被 JavaScript 偵測到的行為。
2. 事件處理機制:IE是事件冒泡、火狐是 事件捕獲;
3. ev.stopPropagation();
75、什么是閉包(closure),為什么要用?
執行say667()后,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在.使得Javascript的垃圾回收機制GC不會收回say667()所占用的資源,因為say667()的內部函數的執行需要依賴say667()中的變量。這是對閉包作用的非常直白的描述.
function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()//執行結果應該彈出的667
76、如何判斷一個對象是否屬於某個類?
使用instanceof (待完善)
if(a instanceof Person){
alert('yes');
}
77、new操作符具體干了什么呢?
1、創建一個空對象,並且 this 變量引用該對象,同時還繼承了該函數的原型。
2、屬性和方法被加入到 this 引用的對象中。
3、新創建的對象由 this 所引用,並且最后隱式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
78、JSON 的了解
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 占用帶寬小
{'age':'12', 'name':'back'}
79、js延遲加載的方式有哪些
defer和async、動態創建DOM方式(用得最多)、按需異步載入js
80、模塊化怎么做?
立即執行函數,不暴露私有成員
1、 使用字面量實現命名空間(YUI):
Itcast.common.dom={};
Itcast.common.css={};
Itcast.common.event={};
2、使用閉包
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
81、異步加載的方式
(1) defer,只支持IE
(2) async:
(3) 創建script,插入到DOM中,加載完畢后callBack
documen.write和 innerHTML的區別
document.write只能重繪整個頁面
innerHTML可以重繪頁面的一部分
82、告訴我答案是多少?
(function(x){
delete x;
alert(x);
})(1+5);
函數參數無法delete刪除,delete只能刪除通過for in訪問的屬性。
當然,刪除失敗也不會報錯,所以代碼運行會彈出“1”。
83、JS中的call()和apply()方法的區別?
例子中用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果為:alert(4);
注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);
84、Jquery與jQuery UI 有啥區別?
*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
*jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
提供了一些常用的界面元素,諸如對話框、拖動行為、改變大小行為等等
85、jquery 中如何將數組轉化為json字符串,然后再轉化回來?
jQuery中沒有提供這個功能,所以你需要先編寫兩個jQuery的擴展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
然后調用:
$("").stringifyArray(array)
86、JavaScript中的作用域與變量聲明提升?
其他部分
(HTTP、正則、優化、重構、響應式、移動端、團隊協作、SEO、UED、職業生涯)
*基於Class的選擇性的性能相對於Id選擇器開銷很大,因為需遍歷所有DOM元素。
*頻繁操作的DOM,先緩存起來再操作。用Jquery的鏈式調用更好。
比如:var str=$("a").attr("href");
*for (var i = size; i < arr.length; i++) {}
for 循環每一次循環都查找了數組 (arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可以讓循環跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
87、前端開發的優化問題(看雅虎14條性能優化原則)。
參考資料:J:\代碼,PPT,筆記,電子書\面試題\雅虎14條優化規則.docx
(1) 減少http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN托管,data緩存 ,圖片服務器。
(2) 前端模板 JS+數據,減少由於HTML標簽導致的帶寬浪費,前端用變量保存AJAX請求結果,每次操作本地變量,不用請求,減少請求次數
(3) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能。
(4) 當需要設置的樣式很多時設置className而不是直接操作style。
(5) 少用全局變量、緩存DOM節點查找的結果。減少IO讀取操作。
(6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。
(7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
(8) 避免在頁面的主體布局中使用table,table要等其中的內容完全下載之后才會顯示出來,顯示比div+css布局慢。
88、http狀態碼有那些?分別代表是什么意思?
100-199 用於指定客戶端應相應的某些動作。
200-299 用於表示請求成功。
300-399 用於已經移動的文件並且常被包含在定位頭信息中指定新的地址信息。
400-499 用於指出客戶端的錯誤。
400 語義有誤,當前請求無法被服務器理解。
401 當前請求需要用戶驗證
403 服務器已經理解請求,但是拒絕執行它。
500-599 用於支持服務器錯誤。
503 – 服務不可用
89、一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什么?(流程說的越詳細越好)
要熟悉前后端的通信流程,最好把動態網站的背后細節也介紹一遍
八、流行框架
1、JQuery的源碼看過嗎?能不能簡單概況一下它的實現原理?
考察學習知識的態度,是否僅僅是停留在使用層面,要知其然知其所以然
2、jQuery.fn的init方法返回的this指的是什么對象?為什么要返回this?
this執行init構造函數自身,其實就是jQuery實例對象,返回this是為了實現jQuery的鏈式操作
3、jquery中如何將數組轉化為json字符串,然后再轉化回來?
$.parseJSON('{"name":"John"}');
JSON.stringify
4、jQuery 的屬性拷貝(extend)的實現原理是什么,如何實現深拷貝?
遞歸賦值
5、jquery.extend 與 jquery.fn.extend的區別?
Jquery.extend用來擴展jQuery對象本身;jquery.fn.extend用來擴展jQuery實例
6、談一下Jquery中的bind(),live(),delegate(),on()的區別?
jquery1.7以后就推薦使用on的方式來進行事件綁定了
7、JQuery一個對象可以同時綁定多個事件,這是如何實現的?
可以同時綁定多個事件,低層實現原理是使用addEventListner與attachEvent兼容處理做事件注冊
4、Jquery與jQuery UI有啥區別?
jQuery是操作dom的框架,jQueryUI是基於jQuery做的一個UI組件庫
5、jQuery和Zepto的區別?各自的使用場景?
jQuery主要用於pc端,當然有對應的jQuerymobile用於移動端,zepto比jQuery更加小巧,主要用於移動端
jquer mobile相對於zepto功能強大,但是體積也很龐大,zepto非常的輕量
6、針對 jQuery 的優化方法?
a、優先使用ID選擇器
b、jquery獲取到的DOM元素如果需要多次使用,建議使用一個變量將其保存起來,因為操作DOM的過程是非常耗費性能的
c、在class前使用tag(標簽名)
d、給選擇器一個上下文
e、慎用 .live()方法(應該說盡量不要使用)
f、使用data()方法存儲臨時變量
7、Zepto的點透問題如何解決?
點透主要是由於兩個div重合,例如:一個div調用show(),一個div調用hide();這個時候當點擊上面的div的時候就會影響到下面的那個div;
解決辦法主要有2種:
1.github上有一個叫做fastclick的庫,它也能規避移動設備上click事件的延遲響應,https://github.com/ftlabs/fastclick
將它用script標簽引入頁面(該庫支持AMD,於是你也可以按照AMD規范,用諸如require.js的模塊加載器引入),並且在dom ready時初始化在body上,
2.根據分析,如果不引入其它類庫,也不想自己按照上述fastclcik的思路再開發一套東西,需要1.一個優先於下面的“divClickUnder”捕獲的事件;2.並且通過這個事件阻止掉默認行為(下面的“divClickUnder”對click事件的捕獲,在ios的safari,click的捕獲被認為和滾屏、點擊輸入框彈起鍵盤等一樣,是一種瀏覽器默認行為,即可以被event.preventDefault()阻止的行為)。
12、知道各種JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能講出他們各自的優點和缺點么?
知識面的寬度,流行框架要多多熟悉
angular、backbone、knockout都是完整的MV*框架
angular是雙向數據綁定的,backbone、knockout是單向數據綁定的
React只是單純地View層
13、Underscore 對哪些 JS 原生對象進行了擴展以及提供了哪些好用的函數方法?
Underscore的熟悉程度
14、使用過angular嗎?angular中的過濾器是干什么用的
在表達式中轉換數據<p>姓名為 {{ lastName | uppercase }}</p>
currency,是什么過濾器——格式化數字為貨幣格式,單位是$符。
九、移動APP開發
1、移動端最小觸控區域是多大?
移動端的點擊事件的有延遲,時間是多久,為什么會有? 怎么解決這個延時?(click 有 300ms 延遲,為了實現safari的雙擊事件的設計,瀏覽器要知道你是不是要雙擊操作。)
十、NodeJs
1、對Node的優點和缺點提出了自己的看法:
*(優點)因為Node是基於事件驅動和無阻塞的,所以非常適合處理並發請求,
因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。
此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,
因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。
*(缺點)Node是一個相對新的開源項目,所以不太穩定,它總是一直在變,
而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
2、需求:實現一個頁面操作不會整頁刷新的網站,並且能在瀏覽器前進、后退時正確響應。給出你的技術實現方案?
至少給出自己的思路(url-hash,可以使用已有的一些框架history.js等)
3、Node.js的適用場景?
1)、實時應用:如在線聊天,實時通知推送等等(如socket.io)
2)、分布式應用:通過高效的並行I/O使用已有的數據
3)、工具類應用:海量的工具,小到前端壓縮部署(如grunt),大到桌面圖形界面應用程序
4)、游戲類應用:游戲領域對實時和並發有很高的要求(如網易的pomelo框架)
5)、利用穩定接口提升Web渲染能力
6)、前后端編程語言環境統一:前端開發人員可以非常快速地切入到服務器端的開發(如著名的純Javascript全棧式MEAN架構)
4、(如果會用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
Nodejs相關概念的理解程度
5、解釋一下 Backbone 的 MVC 實現方式?
流行的MVC架構模式
6、什么是“前端路由”?什么時候適合使用“前端路由”? “前端路由”有哪些優點和缺點?
熟悉前后端通信相關知識
前端路由就是在不進行后端請求的情況下對頁面進行跳轉
7、對Node的優點和缺點提出了自己的看法?
優點:
1. 因為Node是基於事件驅動和無阻塞的,所以非常適合處理並發請求,因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。
2. 與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。
缺點:
1. Node是一個相對新的開源項目,所以不太穩定,它總是一直在變。
2. 缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子(第三方庫現在已經很豐富了,所以這個缺點可以說不存在了)。
十一、前端概括性問題
1、常使用的庫有哪些?常用的前端開發工具?開發過什么應用或組件?
使用率較高的框架有jQuery、YUI、Prototype、Dojo、Ext.js、Mootools等。尤其是jQuery,超過91%。
輕量級框架有Modernizr、underscore.js、backbone.js、Raphael.js等。(理解這些框架的功能、性能、設計原理)
前端開發工具:Sublime Text 、Eclipse、Notepad、Firebug、HttpWatch、Yslow。
開發過的插件:城市選擇插件,汽車型號選擇插件、幻燈片插件。彈出層。(寫過開源程序,加載器,js引擎更好)
6、對BFC規范的理解?
Formatting Context:指頁面中的一個渲染區域,並且擁有一套渲染規則,他決定了其子元素如何定位,以及與其他元素的相互關系和作用。
3、99%的網站都需要被重構是那本書上寫的?
網站重構:應用web標准進行設計(第2版)
4、WEB應用從服務器主動推送Data到客戶端有那些方式?
html5 websoket
WebSocket通過Flash
XHR長時間連接
XHR Multipart Streaming
不可見的Iframe
<script>標簽的長時間連接(可跨域)
5、加班的看法
加班就像借錢,原則應當是------救急不救窮
6、平時如何管理你的項目,如何設計突發大規模並發架構?
先期團隊必須確定好全局樣式(globe.css),編碼模式(utf-8) 等
編寫習慣必須一致(例如都是采用繼承式的寫法,單樣式都寫成一行);
標注樣式編寫人,各模塊都及時標注(標注關鍵樣式調用的地方);
頁面進行標注(例如 頁面 模塊 開始和結束);
CSS跟HTML 分文件夾並行存放,命名都得統一(例如style.css)
JS 分文件夾存放 命民以該JS 功能為准英文翻譯;
圖片采用整合的 images.png png8 格式文件使用 盡量整合在一起使用方便將來的管理
7、那些操作會造成內存泄漏?
內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。如果一個對象的引用數量為 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那么該對象的內存即可回收。
setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。
閉包、控制台日志、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
8、你說你熱愛前端,那么應該WEB行業的發展很關注吧? 說說最近最流行的一些東西吧?
Node.js、Mongodb、npm、MVVM、MEAN、react、angularjs、browserify、webpack
9、你有了解我們公司嗎?說說你的認識?
因為我想去阿里,所以我針對阿里的說
最羡慕就是在雙十一購物節,350.19億元,每分鍾支付79萬筆。海量數據,居然無一漏單、無一故障。太厲害了。
攜程、去哪兒:一個主要從事在線旅游O2O,當然也可以訂酒店,買車票,買機票
10、移動端(比如:Android IOS)怎么做好用戶體驗?
融入自己的設計理念,注重用戶體驗,選擇合適的技術
11、 你所知道的頁面性能優化方法有那些?
壓縮、合並,減少請求,代碼層析優化。。。
12、 除了前端以外還了解什么其它技術么?你最最厲害的技能是什么?
知識面寬度,最好熟悉一些后台語言,比如php,展現出自己的技術兩點
13、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規范區別?
14、談談你認為怎樣做能使項目做的更好?
考慮問題的深入,不僅僅停留在完成任務上,要精益求精
15、你對前端界面工程師這個職位是怎么樣理解的?它的前景會怎么樣?
表現出對前端的認同與興趣,關注相關技術前沿
16、php中下面哪個函數可以打開一個文件,以對文件進行讀和寫操作?
A.fget(); B.file_open(); C.fopen(); D.open_file();
17、php中rmdir可以直接刪除文件夾嗎?該目錄必須是空的,而且要有相應的權限--來自api
A.任何文件夾都可以刪除 B.空文件夾可以刪除
C.有權限的任何文件夾都可以刪除 D.有權限的空文件夾可以刪除
18、phpinset和empty的區別,舉例說明
1、empty函數
用途:檢測變量是否為空
判斷:如果 var 是非空或非零的值,則 empty() 返回 FALSE。換句話說,""、0、"0"、NULL、FALSE、array()、var $var; 以及沒有任何屬性的對象都將被認為是空的,如果 var 為空,則返回 TRUE。注意:empty() 只檢測變量,檢測任何非變量的東西都將導致解析錯誤。換句話說,后邊的語句將不會起作用;
2、isset函數
用途:檢測變量是否設置
判斷:檢測變量是否設置,並且不是 NULL。如果已經使用 unset() 釋放了一個變量之后,它將不再是 isset()。若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是一個NULL 字節("\0")並不等同於 PHP 的 NULL 常數。
19、php中$_SERVER變量中如何得到當前執行腳本路勁
20、寫一個php函數,要求兩個日期字符串的天數差,如2012-02-05~2012-03-06的日期差數
21、一個衣櫃中放了許多雜亂的襯衫,如果讓你去整理一下,使得更容易找到你想要的衣服;你會怎么做?請寫出你的做法和思路?
22、如何優化網頁加載速度?
1.減少css,js文件數量及大小(減少重復性代碼,代碼重復利用),壓縮CSS和Js代碼
2.圖片的大小
3.把css樣式表放置頂部,把js放置頁面底部
4.減少http請求數
5.使用外部 Js 和 CSS
23、工作流程,你怎么來實現頁面設計圖,你認為前端應該如何高質量完成工作?
熟悉相關設計規范,自己總結的一些經驗
24、介紹項目經驗、合作開發、獨立開發。
團隊協作,個人能力。實踐經驗
25、開發過程中遇到困難,如何解決。
考察解決問題的能力
26、對前端界面工程師這個職位是怎么樣理解的?它的前景會怎么樣?
前端是最貼近用戶的程序員,比后端、數據庫、產品經理、運營、安全都近。
1、實現界面交互
2、提升用戶體驗
3、有了Node.js,前端可以實現服務端的一些事情
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,
參與項目,快速高質量完成實現效果圖,精確到1px;
與團隊成員,UI設計,產品經理的溝通;
做好的頁面結構,頁面重構和用戶體驗;
處理hack,兼容、寫出優美的代碼格式;
針對服務器的優化、擁抱最新前端技術。
其它相關的加分項:
1. 都使用和了解過哪些編輯器?都使用和了解過哪些日常工具?
2. 都知道有哪些瀏覽器內核?開發過的項目都兼容哪些瀏覽器?
3. 瀑布流布局或者流式布局是否有了解
4. HTML5都有哪些新的API?
5. 都用過什么代碼調試工具?
6. 是否有接觸過或者了解過重構。
7.你遇到過比較難的技術問題是?你是如何解決的?