前端『童鞋』面試心得
HTML篇:
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 規範。(重點:告訴瀏覽器按照何種規範解析頁面)
Advertisements
3.Quirks模式是什麼?它和Standards模式有什麼區別
答案:
從IE6開始,引入了Standards模式,標準模式中,瀏覽器嘗試給符合標準的文檔在規範上的正確處理達到在指定瀏覽器中的程度。
在IE6之前CSS還不夠成熟,所以IE5等之前的瀏覽器對CSS的支持很差, IE6將對CSS提供更好的支持,然而這時的問題就來了,因為有很多頁面是基於舊的布局方式寫的,而如果IE6 支持CSS則將令這些頁面顯示不正常,如何在即保證不破壞現有頁面,又提供新的渲染機制呢?
在寫程序時我們也會經常遇到這樣的問題,如何保證原來的介面不變,又提供更強大的功能,尤其是新功能不兼容舊功能時。遇到這種問題時的一個常見做法是增加參數和分支,即當某個參數為真時,我們就使用新功能,而如果這個參數不為真時,就使用舊功能,這樣就能不破壞原有的程序,又提供新功能。IE6也是類似這樣做的,它將DTD當成了這個「參數」,因為以前的頁面大家都不會去寫DTD,所以IE6就假定如果寫了DTD,就意味著這個頁面將採用對CSS支持更好的布局,而如果沒有,則採用兼容之前的布局方式。這就是Quirks模式(怪癖模式,詭異模式,怪異模式)。
Advertisements
區別:
總體會有布局、樣式解析和腳本執行三個方面的區別。
盒模型:在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.a:img的alt與title有何異同?b:strong與em的異同?
答案:
a:
·alt(alt text):為不能顯示圖像、窗體或applets的用戶代理(UA),alt屬性用來指定替換文字。替換文字的語言由lang屬性指定。(在IE瀏覽器下會在沒有title時把alt當成 tool tip顯示)
·title(tool tip):該屬性為設置該屬性的元素提供建議性的信息。
b:
·strong:粗體強調標籤,強調,表示內容的重要性
·em:斜體強調標籤,更強烈強調,表示內容的強調點
6.你能描述一下漸進增強和優雅降級之間的不同嗎?
·漸進增強 progressive enhancement:針對低版本瀏覽器進行構建頁面,保證最基本的功能,然後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
·優雅降級 graceful degradation:一開始就構建完整的功能,然後再針對低版本瀏覽器進行兼容。
區別:優雅降級是從複雜的現狀開始,並試圖減少用戶體驗的供給,而漸進增強則是從一個非常基礎的,能夠起作用的版本開始,並不斷擴充,以適應未來環境的需要。降級(功能衰減)意味著往回看;而漸進增強則意味著朝前看,同時保證其根基處於安全地帶。
「優雅降級」觀點
「優雅降級」觀點認為應該針對那些最高級、最完善的瀏覽器來設計網站。而將那些被認為「過時」或有功能缺失的瀏覽器下的測試工作安排在開發周期的最後階段,並把測試對象限定為主流瀏覽器(如 IE、Mozilla 等)的前一個版本。
在這種設計範例下,舊版的瀏覽器被認為僅能提供「簡陋卻無妨 (poor, but passable)」 的瀏覽體驗。你可以做一些小的調整來適應某個特定的瀏覽器。但由於它們並非我們所關注的焦點,因此除了修復較大的錯誤之外,其它的差異將被直接忽略。
「漸進增強」觀點
「漸進增強」觀點則認為應關注於內容本身。
內容是我們建立網站的誘因。有的網站展示它,有的則收集它,有的尋求,有的操作,還有的網站甚至會包含以上的種種,但相同點是它們全都涉及到內容。這使得「漸進增強」成為一種更為合理的設計範例。這也是它立即被 Yahoo! 所採納並用以構建其「分級式瀏覽器支持 (Graded Browser Support)」策略的原因所在。
那麼問題了。現在產品經理看到IE6,7,8網頁效果相對高版本現代瀏覽器少了很多圓角,陰影(CSS3),要求兼容(使用圖片背景,放棄CSS3),你會如何說服他?
(自由發揮)
7.為什麼利用多個域名來存儲網站資源會更有效?
·CDN緩存更方便
·突破瀏覽器併發限制,瀏覽器對同一個域名的併發請求個數有限制
·節約cookie帶寬,同一個域名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,Apng。(是否有關注新技術,新鮮事物)
科普一下Webp:WebP格式,谷歌(google)開發的一種旨在加快圖片載入速度的圖片格式。圖片壓縮體積大約只有JPEG的2/3,並能節省大量的伺服器帶寬資源和數據空間。Facebook Ebay等知名網站已經開始測試並使用WebP格式。
在質量相同的情況下,WebP格式圖像的體積要比JPEG格式圖像小40%。
Apng:全稱是「Animated Portable Network Graphics」, 是PNG的點陣圖動畫擴展,可以實現png格式的動態圖片效果。04年誕生,但一直得不到各大瀏覽器廠商的支持,直到日前得到 iOS safari 8的支持,有望代替GIF成為下一代動態圖標準。
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(「衝浪」)。其它網站到你的網站的鏈接越多,你也就會獲得更多的訪問量。更重要的是,你的網站的外部鏈接數越多,會被搜索引擎認為它的重要性越大,從而給你更高的排名。
·合理的標籤使用
Css篇:
1.有哪項方式可以對一個DOM設置它的CSS樣式?
·外部樣式表,引入一個外部css文件
·內部樣式表,將css代碼放在 <head> 標籤內部
·內聯樣式,將css樣式直接定義在 HTML 元素內部
2.CSS都有哪些選擇器?
·標籤選擇器(用HTML標籤申明)
·id選擇器(用DOM的ID申明)
·類選擇器(用一個樣式類名申明)
·屬性選擇器(用DOM的屬性申明,屬於CSS2,IE6不支持,不常用,不知道就算了)
除了前3種基本選擇器,還有一些擴展選擇器,包括
·後代選擇器(利用空格間隔,比如div .a{ })
·群組選擇器(利用逗號間隔,比如p,div,#a{ })
那麼問題來了,CSS選擇器的優先順序是怎麼樣定義的?
基本原則:
一般而言,選擇器越特殊,它的優先順序越高。也就是選擇器指向的越準確,它的優先順序就越高。
複雜的計算方法:
·用1表示標籤選擇器的優先順序
·用10表示類選擇器的優先順序
·用100標示ID選擇器的優先順序
·行內樣式優先順序是1000
·!important優先順序高於一切
odiv.test1 .span var 優先順序 1+10 +10 +1
ospan#xxx .songs li 優先順序1+100 + 10 + 1
o#xxx li 優先順序 100 +1
那麼問題來了,看下列代碼,<p>標籤內的文字是什麼顏色的?。
1 <style>
2 .classA{ color:blue;}
3
4 .classB{ color:red;}
5 </style>
6
7 <body>
8
9 <p class='classB classA'> 123 </p>
10
11 </body>
答案:red。與樣式定義在文件中的先後順序有關,即是後面的覆蓋前面的,與在<p class=』classB classA』>中的先後關係無關。
3.CSS中可以通過哪些屬性定義,使得一個DOM元素不顯示在瀏覽器可視範圍內?
最基本的:
設置display屬性為none,或者設置visibility屬性為hidden
技巧性:
設置寬高為0,設置透明度為0,設置z-index位置在-1000
4.超鏈接訪問過後hover樣式就不出現的問題是什麼?如何解決?
答案:被點擊訪問過的超鏈接樣式不在具有hover和active了,解決方法是改變CSS屬性的排列順序: L-V-H-A(link,visited,hover,active)
5.什麼是Css Hack?ie6,7,8的hack分別是什麼?
答案:針對不同的瀏覽器寫不同的CSS code的過程,就是CSS hack。
示例如下:
1 #test {
2 width:300px;
3 height:300px;
4
5 background-color:blue;
6 background-color:red\9;
7 background-color:yellow\0;
8 +background-color:pink;
9 _background-color:orange; }
10 :root #test { background-color:purple\9; }
11 @media all and (min-width:0px){ #test {background-color:black\0;} }
12 @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }
6.請用Css寫一個簡單的幻燈片效果頁面
答案:知道是要用css3。使用animation動畫實現一個簡單的幻燈片效果。
1 /**HTML**/
2 div.ani
3
4 /**css**/
5 .ani{
6 width:480px;
7 height:320px;
8 margin:50px auto;
9 overflow: hidden;
10 box-shadow:0 0 5px rgba(0,0,0,1);
11 background-size: cover;
12 background-position: center;
13 -webkit-animation-name: "loops";
14 -webkit-animation-duration: 20s;
15 -webkit-animation-iteration-count: infinite;
16 }
17 @-webkit-keyframes "loops" {
18 0% {
19 background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat;
20 }
21 25% {
22 background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat;
23 }
24 50% {
25 background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat;
26 }
27 75% {
28 background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat;
29 }
30 100% {
31 background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat;
32 }
33 }
7.行內元素和塊級元素的具體區別是什麼?行內元素的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>。
8.什麼是外邊距重疊?重疊的結果是什麼?
答案:
外邊距重疊就是margin-collapse。
在CSS當中,相鄰的兩個盒子(可能是兄弟關係也可能是祖先關係)的外邊距可以結合成一個單獨的外邊距。這種合併外邊距的方式被稱為摺疊,並且因而所結合成的外邊距稱為摺疊外邊距。
9.rgba()和opacity的透明效果有什麼不同?
答案:
rgba()和opacity都能實現透明效果,但最大的不同是opacity作用於元素,以及元素內的所有內容的透明度,
而rgba()只作用於元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)
10.css中可以讓文字在垂直和水平方向上重疊的兩個屬性是什麼?
答案:
垂直方向:line-height
水平方向:letter-spacing
那麼問題來了,關於letter-spacing的妙用知道有哪些么?
答案:可以用於消除inline-block元素間的換行符空格間隙問題。
11.如何垂直居中一個浮動元素?
1 // 方法一:已知元素的高寬
2
3 #div1{
4 background-color:#6699FF;
5 width:200px;
6 height:200px;
7
8 position: absolute; //父元素需要相對定位
9 top: 50%;
10 left: 50%;
11 margin-top:-100px ; //二分之一的height,width
12 margin-left: -100px;
13 }
14
15 //方法二:未知元素的高寬
16
17 #div1{
18 width: 200px;
19 height: 200px;
20 background-color: #6699FF;
21
22 margin:auto;
23 position: absolute; //父元素需要相對定位
24 left: 0;
25 top: 0;
26 right: 0;
27 bottom: 0;
28 }
那麼問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
1 #container //<img>的容器設置如下
2 {
3 display:table-cell;
4 text-align:center;
5 vertical-align:middle;
6 }
12.px和em的區別。
px和em都是長度單位,區別是,px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,並且em會繼承父級元素的字體大小。
瀏覽器的默認字體高都是16px。所以未經調整的瀏覽器都符合: 1em=16px。那麼12px=0.75em, 10px=0.625em。
13.描述一個」reset」的CSS文件並如何使用它。知道normalize.css嗎?你了解他們的不同之處?
重置樣式非常多,凡是一個前端開發人員肯定有一個常用的重置CSS文件並知道如何使用它們。他們是盲目的在做還是知道為什麼這麼做呢?原因是不同的瀏覽器對一些元素有不同的默認樣式,如果你不處理,在不同的瀏覽器下會存在必要的風險,或者更有戲劇性的性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置所有的樣式風格,但僅提供了一套合理的默認樣式值。既能讓眾多瀏覽器達到一致和合理,但又不擾亂其他的東西(如粗體的標題)。
在這一方面,無法做每一個複位重置。它也確實有些超過一個重置,它處理了你永遠都不用考慮的怪癖,像HTML的audio元素不一致或line-height不一致。
14.Sass、LESS是什麼?大家為什麼要使用他們?
他們是CSS預處理器。他是CSS上的一種抽象層。他們是一種特殊的語法/語言編譯成CSS。
例如Less是一種動態樣式語言. 將CSS賦予了動態語言的特性,如變數,繼承,運算, 函數. LESS 既可以在客戶端上運行 (支持IE 6+, Webkit, Firefox),也可一在服務端運行 (藉助 Node.js)。
為什麼要使用它們?
·結構清晰,便於擴展。
·可以方便地屏蔽瀏覽器私有語法差異。這個不用多說,封裝對瀏覽器語法差異的重複處理,減少無意義的機械勞動。
·可以輕鬆實現多重繼承。
·完全兼容 CSS 代碼,可以方便地應用到老項目中。LESS 只是在 CSS 語法上做了擴展,所以老的 CSS 代碼也可以與 LESS 代碼一同編譯。
15.display:none與visibility:hidden的區別是什麼?
·display : 隱藏對應的元素但不擠占該元素原來的空間。
·visibility: 隱藏對應的元素並且擠占該元素原來的空間。
即是,使用CSS display:none屬性后,HTML元素(對象)的寬度、高度等各種屬性值都將「丟失」;而使用visibility:hidden屬性后,HTML元素(對象)僅僅是在視覺上看不見(完全透明),而它所佔據的空間位置仍然存在。
16.知道css有個content屬性嗎?有什麼作用?有什麼應用?
答案:
知道。css的content屬性專門應用在 before/after 偽元素上,用於來插入生成內容。
最常見的應用是利用偽類清除浮動。
1 //一種常見利用偽類清除浮動的代碼
2 .clearfix:after {
3 content:"."; //這裡利用到了content屬性
4 display:block;
5 height:0;
6 visibility:hidden;
7 clear:both; }
8
9 .clearfix {
10 *zoom:1;
11 }
after偽元素通過 content 在元素的後面生成了內容為一個點的塊級元素,再利用clear:both清除浮動。
初級Javascript:
1.JavaScript是一門什麼樣的語言,它有哪些特點?
沒有標準答案。
2.JavaScript的數據類型都有什麼?
基本數據類型:String,boolean,Number,Undefined, Null
引用數據類型:Object(Array,Date,RegExp,Function)
那麼問題來了,如何判斷某變數是否為數組數據類型?
·方法一.判斷其是否具有「數組性質」,如slice()方法。可自己給該變數定義slice方法,故有時會失效
·方法二.obj instanceof Array 在某些IE版本中不正確
·方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法如下:
1 if(typeof Array.isArray==="undefined")
2 {
3 Array.isArray = function(arg){
4 return Object.prototype.toString.call(arg)==="[object Array]"
5 };
6 }
3.已知ID的Input輸入框,希望獲取這個輸入框的輸入值,怎麼做?(不使用第三方框架)
1 document.getElementById(「ID」).value
4.希望獲取到頁面中所有的checkbox怎麼做?(不使用第三方框架)
1 var domList = document.getElementsByTagName(『input』)
2 var checkBoxList = [];
3 var len = domList.length; //緩存到局部變數
4 while (len--) { //使用while的效率會比for循環更高
5 if (domList[len].type == 『checkbox』) {
6 checkBoxList.push(domList[len]);
7 }
8 }
5.設置一個已知ID的DIV的html內容為xxxx,字體顏色設置為黑色(不使用第三方框架)
1 var dom = document.getElementById(「ID」);
2 dom.innerHTML = 「xxxx」
3 dom.style.color = 「#000」
6.當一個DOM節點被點擊時候,我們希望能夠執行一個函數,應該怎麼做?
·直接在DOM里綁定事件:<div onclick=」test()」></div>
·在JS里通過onclick綁定:xxx.onclick = test
·通過事件添加進行綁定:addEventListener(xxx, 『click』, test)
那麼問題來了,Javascript的事件流模型都有什麼?
·「事件冒泡」:事件開始由最具體的元素接受,然後逐級向上傳播
·「事件捕獲」:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的
·「DOM事件流」:三個階段:事件捕捉,目標階段,事件冒泡
7.什麼是Ajax和JSON,它們的優缺點。
Ajax是非同步JavaScript和XML,用於在Web頁面中實現非同步數據交互。
優點:
· 可以使得頁面不重載全部內容的情況下載入局部內容,降低數據傳輸量
· 避免用戶不斷刷新或者跳轉頁面,提高用戶體驗
缺點:
· 對搜索引擎不友好(
· 要實現ajax下的前後退功能成本較大
· 可能造成請求數的增加
· 跨域問題限制
JSON是一種輕量級的數據交換格式,ECMA的一個子集
優點:輕量級、易於人的閱讀和編寫,便於機器(JavaScript)解析,支持複合數據類型(數組、對象、字元串、數字)
8.看下列代碼輸出為何?解釋原因。
1 var a;
2 alert(typeof a); // undefined
3 alert(b); // 報錯
解釋:Undefined是一個只有一個值的數據類型,這個值就是「undefined」,在使用var聲明變數但並未對其賦值進行初始化時,這個變數的值就是undefined。而b由於未聲明將報錯。注意未申明的變數和聲明了未賦值的是不一樣的。
9.看下列代碼,輸出什麼?解釋原因。
1 var a = null;
2 alert(typeof a); //object
解釋:null是一個只有一個值的數據類型,這個值就是null。表示一個空指針對象,所以用typeof檢測會返回」object」。
10.看下列代碼,輸出什麼?解釋原因。
1 var a;
2 undefined == null; // true
3 1 == true; // true
4 2 == true; // false
5 0 == false; // true
6 0 == ''; // true
7 NaN == NaN; // false
8 [] == false; // true
9 [] == ![]; // true
·undefined與null相等,但不恆等(===)
·一個是number一個是string時,會嘗試將string轉換為number
·嘗試將boolean轉換為number,0或1
·嘗試將Object轉換成number或string,取決於另外一個對比量的類型
·所以,對於0、空字元串的判斷,建議使用 「===」 。「===」會先判斷兩邊的值類型,類型不匹配時為false。
那麼問題來了,看下面的代碼,輸出什麼,foo的類型為什麼?
1 var foo = "11"+2-"1";
2 console.log(foo);
3 console.log(typeof foo);
執行完后foo的值為111,foo的類型為Number。
1 var foo = "11"+2+"1"; //體會加一個字元串'1' 和 減去一個字元串'1'的不同
2 console.log(foo);
3 console.log(typeof foo);
執行完后foo的值為113,foo的類型為String。
11.看代碼給答案。
1 var a = new Object();
2 a.value = 1;
3 b = a;
4 b.value = 2;
5 alert(a.value);
答案:2(考察引用數據類型細節)
12.已知數組var stringArray = [「This」, 「is」, 「Baidu」, 「Campus」],Alert出」This is Baidu Campus」。
答案:alert(stringArray.join(「」))
已知有字元串foo=」get-element-by-id」,寫一個function將其轉化成駝峰表示法」getElementById」。
1 function combo(msg){
2 var arr=msg.split("-");
3 for(var i=1;i<arr.length;i++){
4 arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
5 }
6 msg=arr.join("");
7 return msg;
8 }
(考察基礎API)
13.var numberArray = [3,6,2,4,1,5]; (考察基礎API)
1) 實現對該數組的倒排,輸出[5,1,4,2,6,3]
2) 實現對該數組的降序排列,輸出[6,5,4,3,2,1]
1 var numberArray = [3,6,2,4,1,5];
2
3 numberArray.reverse(); // 5,1,4,2,6,3
4
5 numberArray.sort(function(a,b){ //6,5,4,3,2,1
6 return b-a;
7 })
14.輸出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,則輸出2014-09-26
1 var d = new Date();
2 // 獲取年,getFullYear()返回4位的數字
3 var year = d.getFullYear();
4 // 獲取月,月份比較特殊,0是1月,11是12月
5 var month = d.getMonth() + 1;
6 // 變成兩位
7 month = month < 10 ? '0' + month : month;
8 // 獲取日
9 var day = d.getDate();
10 day = day < 10 ? '0' + day : day;
11 alert(year + '-' + month + '-' + day);
15.將字元串」<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』);
16.為了保證頁面輸出安全,我們經常需要對一些特殊的字元進行轉義,請寫一個函數escapeHtml,將<, >, &, 「進行轉義
1 function escapeHtml(str) {
2 return str.replace(/[<>」&]/g, function(match) {
3 switch (match) {
4 case 「<」:
5 return 「<」;
6 case 「>」:
7 return 「>」;
8 case 「&」:
9 return 「&」;
10 case 「\」」:
11 return 「"」;
12 }
13 });
14 }
17.foo = foo||bar ,這行代碼是什麼意思?為什麼要這樣寫?
答案:if(!foo) foo = bar; //如果foo存在,值不變,否則把bar的值賦給foo。
短路表達式:作為」&&」和」||」操作符的操作數表達式,這些表達式在進行求值時,只要最終的結果已經可以確定是真或假,求值過程便告終止,這稱之為短路求值。
18.看下列代碼,將會輸出什麼?(變數聲明提升)
1 var foo = 1;
2 function(){
3 console.log(foo);
4 var foo = 2;
5 console.log(foo);
6 }
答案:輸出undefined 和 2。上面代碼相當於:
1 var foo = 1;
2 function(){
3 var foo;
4 console.log(foo); //undefined
5 foo = 2;
6 console.log(foo); // 2;
7 }
函數聲明與變數聲明會被JavaScript引擎隱式地提升到當前作用域的頂部,但是只提升聲明不會提升賦值部分。
19.用js實現隨機選取10–100之間的10個數字,存入一個數組,並排序。
1 var iArray = [];
2 funtion getRandom(istart, iend){
3 var iChoice = istart - iend +1;
4 return Math.floor(Math.random() * iChoice + istart;
5 }
6 for(var i=0; i<10; i++){
7 iArray.push(getRandom(10,100));
8 }
9 iArray.sort();
20.把兩個數組合併,並刪除第二個元素。
1 var array1 = ['a','b','c'];
2 var bArray = ['d','e','f'];
3 var cArray = array1.concat(bArray);
4 cArray.splice(1,1);
21.怎樣添加、移除、移動、複製、創建和查找節點(原生JS,實在基礎,沒細寫每一步)
1)創建新節點
createDocumentFragment() //創建一個DOM片段
createElement() //創建一個具體的元素
createTextNode() //創建一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標籤名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
22.有這樣一個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}。
答案:
1 function serilizeUrl(url) {
2 var result = {};
3 url = url.split("?")[1];
4 var map = url.split("&");
5 for(var i = 0, len = map.length; i < len; i++) {
6 result[map[i].split("=")[0]] = map[i].split("=")[1];
7 }
8 return result;
9 }
23.正則表達式構造函數var reg=new RegExp(「xxx」)與正則表達字面量var reg=//有什麼不同?匹配郵箱的正則表達式?
答案:當使用RegExp()構造函數的時候,需要雙反斜杠(即\\表示一個\)。使用正則表達字面量的效率更高。
郵箱的正則匹配:
1 var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
24.看下面代碼,給出輸出結果。
1 for(var i=1;i<=3;i++){
2 setTimeout(function(){
3 console.log(i);
4 },0);
5 };
答案:4 4 4。
原因:Javascript事件處理器在線程空閑之前不會運行。那麼問題來了,如何讓上述代碼輸出1 2 3?
1 for(var i=1;i<=3;i++){
2 setTimeout((function(a){ //改成立即執行函數
3 console.log(a);
4 })(i),0);
5 };
6
7 1 //輸出
8 2
9 3
25.寫一個function,清除字元串前後的空格。(兼容所有瀏覽器)
使用自帶介面trim(),考慮兼容性:
1 if (!String.prototype.trim) {
2 String.prototype.trim = function() {
3 return this.replace(/^\s+/, "").replace(/\s+$/,"");
4 }
5 }
6
7 // test the function
8 var str = " \t\n test string ".trim();
9 alert(str == "test string"); // alerts "true"
26.Javascript中callee和caller的作用?
答案:
caller是返回一個對函數的引用,該函數調用了當前函數;
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
那麼問題來了?如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
1 var result=[];
2 function fn(n){ //典型的斐波那契數列
3 if(n==1){
4 return 1;
5 }else if(n==2){
6 return 1;
7 }else{
8 if(result[n]){
9 return result[n];
10 }else{
11 //arguments.callee()表示fn()
12 result[n]=arguments.callee(n-1)+arguments.callee(n-2);
13 return result[n];
14 }
15 }
16 }
中級Javascript:
1.實現一個函數clone,可以對JavaScript中的5種主要的數據類型(包括Number、String、Object、Array、Boolean)進行值複製
·考察點1:對於基本數據類型和引用數據類型在內存中存放的是值還是指針這一區別是否清楚
·考察點2:是否知道如何判斷一個變數是什麼類型的
·考察點3:遞歸演算法的設計
1 // 方法一:
2 Object.prototype.clone = function(){
3 var o = this.constructor === Array ? [] : {};
4 for(var e in this){
5 o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
6 }
7 return o;
8 }
9
10 //方法二:
11 /**
12 * 克隆一個對象
13 * @param Obj
14 * @returns
15 */
16 function clone(Obj) {
17 var buf;
18 if (Obj instanceof Array) {
19 buf = []; //創建一個空的數組
20 var i = Obj.length;
21 while (i--) {
22 buf[i] = clone(Obj[i]);
23 }
24 return buf;
25 }else if (Obj instanceof Object){
26 buf = {}; //創建一個空對象
27 for (var k in Obj) { //為這個對象添加新的屬性
28 buf[k] = clone(Obj[k]);
29 }
30 return buf;
31 }else{ //普通變數直接賦值
32 return Obj;
33 }
34 }
2.如何消除一個數組裡面重複的元素?
1 var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
2 function deRepeat(){
3 var newArr=[];
4 var obj={};
5 var index=0;
6 var l=arr.length;
7 for(var i=0;i<l;i++){
8 if(obj[arr[i]]==undefined)
9 {
10 obj[arr[i]]=1;
11 newArr[index++]=arr[i];
12 }
13 else if(obj[arr[i]]==1)
14 continue;
15 }
16 return newArr;
17
18 }
19 var newArr2=deRepeat(arr);
20 alert(newArr2); //輸出1,2,3,4,5,6,9,25
3.小賢是一條可愛的小狗(Dog),它的叫聲很好聽(wow),每次看到主人的時候就會乖乖叫一聲(yelp)。從這段描述可以得到以下對象:
1 function Dog() {
2 this.wow = function() {
3 alert(』Wow』);
4 }
5 this.yelp = function() {
6 this.wow();
7 }
8 }
小芒和小賢一樣,原來也是一條可愛的小狗,可是突然有一天瘋了(MadDog),一看到人就會每隔半秒叫一聲(wow)地不停叫喚(yelp)。請根據描述,按示例的形式用代碼來實。(繼承,原型,setInterval)
答案:
1 function MadDog() {
2 this.yelp = function() {
3 var self = this;
4 setInterval(function() {
5 self.wow();
6 }, 500);
7 }
8 }
9 MadDog.prototype = new Dog();
10
11 //for test
12 var dog = new Dog();
13 dog.yelp();
14 var madDog = new MadDog();
15 madDog.yelp();
4.下面這個ul,如何點擊每一列的時候alert其index?(閉包)
1 <ul id=」test」>
2 <li>這是第一條</li>
3 <li>這是第二條</li>
4 <li>這是第三條</li>
5 </ul>
答案:
1 // 方法一:
2 var lis=document.getElementById('2223').getElementsByTagName('li');
3 for(var i=0;i<3;i++)
4 {
5 lis[i].index=i;
6 lis[i].onclick=function(){
7 alert(this.index);
8 };
9 }
10
11 //方法二:
12 var lis=document.getElementById('2223').getElementsByTagName('li');
13 for(var i=0;i<3;i++)
14 {
15 lis[i].index=i;
16 lis[i].onclick=(function(a){
17 return function() {
18 alert(a);
19 }
20 })(i);
21 }
5.請評價以下代碼並給出改進意見。
1 if(window.addEventListener){
2 var addListener = function(el,type,listener,useCapture){
3 el.addEventListener(type,listener,useCapture);
4 };
5 }
6 else if(document.all){
7 addListener = function(el,type,listener){
8 el.attachEvent("on"+type,function(){
9 listener.apply(el);
10 });
11 }
12 }
評價:
·不應該在if和else語句中聲明addListener函數,應該先聲明;
·不需要使用window.addEventListener或document.all來進行檢測瀏覽器,應該使用能力檢測;
·由於attachEvent在IE中有this指向問題,所以調用它時需要處理一下
改進如下:
1 function addEvent(elem, type, handler){
2 if(elem.addEventListener){
3 elem.addEventListener(type, handler, false);
4 }else if(elem.attachEvent){
5 elem['temp' + type + handler] = handler;
6 elem[type + handler] = function(){
7 elem['temp' + type + handler].apply(elem);
8 };
9 elem.attachEvent('on' + type, elem[type + handler]);
10 }else{
11 elem['on' + type] = handler;
12 }
13 }
6.給String對象添加一個方法,傳入一個string類型的參數,然後將string的每個字元間價格空格返回,例如:
addSpace(「hello world」) // -> 『h e l l o w o r l d』
1 String.prototype.spacify = function(){
2 return this.split('').join(' ');
3 };
接著上述答題,那麼問題來了
1)直接在對象的原型上添加方法是否安全?尤其是在Object對象上。
如果是多人協作,盡量不要在通用類型上(例如String,Number,Array,Date,Object原型中添加自己的方法,會影響到別人開發)
2)函數聲明與函數表達式的區別?
答案:在Javscript中,解析器在向執行環境中載入數據時,對函數聲明和函數表達式並非是一視同仁的,解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問),至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解析執行。(函數聲明提升)
7.定義一個log方法,讓它可以代理console.log的方法。
可行的方法一:
1 function log(msg) {
2 console.log(msg);
3 }
4
5 log("hello world!") // hello world!
6
如果要傳入多個參數呢?顯然上面的方法不能滿足要求,所以更好的方法是:
1 function log(){
2 console.log.apply(console, arguments);
3 };
那麼問題來了,apply和call方法的異同?
答案:
對於apply和call兩者在作用上是相同的,即是調用一個對象的一個方法,以另一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
但兩者在參數上有區別的。對於第一個參數意義都一樣,但對第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3]) 。
8.在Javascript中什麼是偽數組?如何將偽數組轉化為標準數組?
答案:
偽數組(類數組):無法直接調用數組方法或期望length屬性有什麼特殊的行為,但仍可以對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組。可以使用Array.prototype.slice.call(fakeArray)將數組轉化為真正的Array對象。
假設接第八題題干,我們要給每個log方法添加一個」(app)」前綴,比如』hello world!』 ->』(app)hello world!』。方法如下:
1 function log(){
2 var args = Array.prototype.slice.call(arguments); //為了使用unshift數組方法,將argument轉化為真正的數組
3 args.unshift('(app)');
5 console.log.apply(console, args);
6 };
9.對作用域上下文和this的理解,看下列代碼:
1 var User = {
2 count: 1,
3
4 getCount: function() {
5 return this.count;
6 }
7 };
8
9 console.log(User.getCount()); // what?
10
11 var func = User.getCount;
12 console.log(func()); // what?
問兩處console輸出什麼?為什麼?
答案是1和undefined。
func是在winodw的上下文中被執行的,所以會訪問不到count屬性。
那麼問題來了,如何確保Uesr總是能訪問到func的上下文,即正確返回1。
答案:正確的方法是使用Function.prototype.bind。兼容各個瀏覽器完整代碼如下:
1 Function.prototype.bind = Function.prototype.bind || function(context){
2 var self = this;
3
4 return function(){
5 return self.apply(context, arguments);
6 };
7 }
8
9 var func = User.getCount.bind(User);
10 console.log(func());
10.原生JS的window.onload與Jquery的$(document).ready(function(){})有什麼不同?如何用原生JS實現Jq的ready方法?
window.onload()方法是必須等到頁面內包括圖片的所有元素載入完畢后才能執行。
$(document).ready()是DOM結構繪製完畢后就執行,不必等到載入完畢。
11.(設計題)想實現一個對頁面某個節點的拖曳?如何做?(使用原生JS)
回答出概念即可,下面是幾個要點
1.給需要拖拽的節點綁定mousedown, mousemove, mouseup事件
2.mousedown事件觸發后,開始拖拽
3.mousemove時,需要通過event.clientX和clientY獲取拖拽位置,並實時更新位置
4.mouseup時,拖拽結束
5.需要注意瀏覽器邊界的情況
12.
1 function setcookie(name,value,days){ //給cookie增加一個時間變數
2 var exp = new Date();
3 exp.setTime(exp.getTime() + days*24*60*60*1000); //設置過期時間為days天
4 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
5 }
6 function getCookie(name){
7 var result = "";
8 var myCookie = ""+document.cookie+";";
9 var searchName = "+name+"=";
10 var startOfCookie = myCookie.indexOf(searchName);
11 var endOfCookie;
12 if(satrtOfCookie != -1){
13 startOfcookie += searchName.length;
14 endOfCookie = myCookie.indexOf(";",startOfCookie);
15 result = (myCookie.substring(startOfCookie,endOfCookie));
16 }
17 return result;
18 }
19 (function(){
20 var oTips = document.getElementById('tips');//假設tips的id為tips
21 var page = {
22 check: function(){//檢查tips的cookie是否存在並且允許顯示
23 var tips = getCookie('tips');
24 if(!tips || tips == 'show') return true;//tips的cookie不存在
25 if(tips == "never_show_again") return false;
26 },
27 hideTip: function(bNever){
28 if(bNever) setcookie('tips', 'never_show_again', 365);
29 oTips.style.display = "none";//隱藏
30 },
31 showTip: function(){
32 oTips.style.display = "inline";//顯示,假設tips為行級元素
33 },
34 init: function(){
35 var _this = this;
36 if(this.check()){
37 _this.showTip();
38 setcookie('tips', 'show', 1);
39 }
40 oTips.onclick = function(){
41 _this.hideTip(true);
42 };
43 }
44 };
45 page.init();
46 })();
13.說出以下函數的作用是?空白區域應該填寫什麼?
1 //define
2 (function(window){
3 function fn(str){
4 this.str=str;
5 }
6
7 fn.prototype.format = function(){
8 var arg = ______;
9 return this.str.replace(_____,function(a,b){
10 return arg[b]||"";
11 });
12 }
13 window.fn = fn;
14 })(window);
15
16 //use
17 (function(){
18 var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>');
19 console.log(t.format('http://www.alibaba.com','Alibaba','Welcome'));
20 })();
答案:訪函數的作用是使用format函數將函數的參數替換掉{0}這樣的內容,返回一個格式化后的結果:
第一個空是:arguments
第二個空是:/\{(\d+)\}/ig
14.用面向對象的Javascript來介紹一下自己。(沒答案哦親,自己試試吧)
答案: 對象或者Json都是不錯的選擇哦