天天看點

2015百度前端研發筆試題

一、HTML的Doctype作用? 嚴格模式與混雜模式如何區分?它們有何意義?

1.<!DOCTYPE> 聲明位于文檔中的最前面,處于 <html> 标簽之前。告知浏覽器的解析器,用什麼文檔類型 規範來解析這個文檔。

2.嚴格模式的排版和 JS 運作模式是 以該浏覽器支援的最高标準運作。在混雜模式中,頁面以寬松的向後相容的方式顯示。模拟老式浏覽器的行為以防止站點無法工作。

3.DOCTYPE不存在或格式不正确會導緻文檔以混雜模式呈現。

二、請用CSS實作如下圖的樣式,相關尺寸如圖示,其中dom結構為:

<div id=”demo”></div>

2015百度前端研發筆試題

#demo {

width: 100px;

height: 100px;

background-color: #fff;

position: relative;

border: 2px solid #

333

;

}

#demo:after, #demo:before {

border: solid transparent;

content: 

' '

;

height: 

;

left: 

100

%;

position: absolute;

width: 

;

}

#demo:after {

border-width: 10px;

border-left-color: #fff;

top: 20px;

}

#demo:before {

border-width: 12px;

border-left-color: #

000

;

top: 18px;

}

三、簡述document.write和 innerHTML的差別。

document.write是直接寫入到頁面的内容流,如果在寫之前沒有調用document.open, 浏覽器會自動調用open。每次寫完關閉之後重新調用該函數,會導緻頁面被重寫。 innerHTML則是DOM頁面元素的一個屬性,代表該元素的html内容。你可以精确到某一個具體的元素來進行更改。如果想修改document的内容,則需要修改document.documentElement.innerElement。

innerHTML很多情況下都優于document.write,其原因在于其允許更精确的控制要重新整理頁面的那一個部分。

四、你知道的,javascript語言的執行環境是"單線程模式",這種模式的好處是實作起來比較簡單,執行環境相對單純;壞處是隻要有一個任務耗時很長,後面的任務都必須排隊等着,會拖延整個程式的執行,是以很多時候需要進行“異步模式”,請列舉js異步程式設計的方法。

$.ajax, 異步加載請求,加載完成後執行回調。 Promise類。

1 2 3 4 5 6 7 8

promise = 

new

Promise( function(resolve, reject) {

// heavy function

resolve(

'ok'

)

});

promise.then( function(data1,data2) {

//here heavy function has been done

//your code here

})

自定義回調 var heavyFunc = function(callback) {     // heavy function here

    // a lot of time

    callback()

} var callback = function() {     // execute when heavy function is done

    // your code here

} heavyFunc(callback)

五、使用者從手機的浏覽器通路www.baidu.com,看到的可能跟桌面PC電腦,是不太一樣的網頁效果,會更适合移動裝置使用。請簡要分析一下,實作這種網頁區分顯示的原因及技術原理

回答一:手機螢幕的px與css中寫的px并不完全一緻. 因為手機螢幕尺寸關系, 手機浏覽器會對頁面大小進行優化. 其方法就是改變螢幕分辨率算法, 比如将4個像素點算成1個像素點, 以此降低手機螢幕分辨率, 得到更好的顯示效果. 如iphone, 其螢幕分辨率其實為320PX(此px對應css中的px). 而在head中設定viewport即是告訴手機浏覽器, 該如何顯示網頁. 一般設定為viewport="device".

回答二:手機的網速問題、螢幕大小、記憶體、CPU等。通過不同裝置的特征,實作不同的網頁展現或輸出效果。根據useragent、螢幕大小資訊、IP、網速、css media Query等原理,實作前端或後端的特征識别和行為改變。

六、Flappy Bird是風靡一時的手機遊戲,玩家要操作一隻小鳥穿過無窮無盡的由鋼管組成的障礙。如果要你在HTML前端開發這個遊戲,為了保證遊戲的流暢運作,并長時間運作也不會崩潰,請列舉開發要注意的性能問題和解決的方法。

背景的卷軸效果優化。背景不能是無限長的圖檔拼接,必須有回收已移出的場景的方法。

将複雜運算從主UI線程中解耦。比如場景中小鳥的運動軌迹、碰撞算法等,需要在空閑時間片運算,不能和UI動畫同時進行。

将比較大的運算分解成不同的時間片,防止阻塞主UI線程。最好使用webworker。

注意記憶體洩漏和回收。使用對象池管理記憶體,提高記憶體檢測和垃圾回收。

進行預處理。将一些常用的過程進行預處理,

控制好幀率。将1秒分解成多個時間片,在固定間隔時間片進行UI動畫,其他時間片用在背景運算。

通過   GPU    加速和   CSS transition    将小鳥飛行動畫和背景動畫分離

七、如下圖,請實作表格資訊的排序功能,當點選表頭的屬性區域,将表格資訊進行排序切換功能,即第一次點選為降序排序,再一次點選進行升序排序。

我看很多人的回答都沒考慮清楚:

1、點選表頭,也可以是點選“姓名”,需要區分中文和數字的排序方式;

2、“第一次點選為降序排序,再一次點選進行升序排序”,需要可逆,并且如果點選“力量”一次,再點選“靈活”,然後再次點選“力量”,需要實作的是力量的降序,而不是力量的升序;

3、可擴充性,如果屬性不止這4個,那麼很多人的代碼直接廢棄。

貼代碼,原生JS寫的:

var the_table=document.getElementById("the_table");

var the_table_tr=the_table.getElementsByTagName("tr");

var the_table_tbody=the_table.getElementsByTagName("tbody")[0];

var the_table_head_td=the_table_tr[0].getElementsByTagName("td");

var click_switch=[];

for(i=0;i<the_table_head_td.length;i++){

    (function each_one(_i){

        click_switch.push(0);

        the_table_head_td[_i].οnclick=function(){

            for(q=0;q<click_switch.length;q++){

                if(q!==_i){

                    click_switch[q]=0;

                }

            }

            var temp_arr=[];

            var the_table_tr_arr=[];

            for(j=1;j<the_table_tr.length;j++){

                temp_arr.push(the_table_tr[j].getElementsByTagName("td")[_i].innerHTML);

                the_table_tr_arr.push(the_table_tr[j].cloneNode(true));

            };

            var tr_length_temp=the_table_tr.length

            for(x=1;x<tr_length_temp;x++){

                the_table_tbody.removeChild(the_table_tbody.getElementsByTagName("tr")[1]);

            }

            if(temp_arr[0]*1){

                temp_arr.sort(function compare(a,b){return a-b;});

            }else{

                temp_arr.sort(function(a,b){return a<b?-1:1;});

            }

            if(click_switch[_i]==1){

                click_switch[_i]=0;

                for(k=temp_arr.length-1;k>=0;k--){

                    (function each_two(_k){

                        for(vv=0;vv<the_table_tr_arr.length;vv++){

                            if(temp_arr[_k]==the_table_tr_arr[vv].getElementsByTagName("td")[_i].innerHTML){

                                the_table_tbody.appendChild(the_table_tr_arr[vv]);

                            }

                        }

                    })(k);

                }

            }else{

                click_switch[_i]=1;

                for(k=0;k<temp_arr.length;k++){

                    (function each_two(_k){

                        for(vv=0;vv<the_table_tr_arr.length;vv++){

                            if(temp_arr[_k]==the_table_tr_arr[vv].getElementsByTagName("td")[_i].innerHTML){

                                the_table_tbody.appendChild(the_table_tr_arr[vv]);

                            }

                        }

                    })(k);

                }

            }

        }

    })(i)

}