前端面試題(最近遇到的)

1.下面這段代碼拓春,輸出內(nèi)容是什么,并說明為什么
A. 0 1 2 3 ????B. 0 0 0 0?????C. 4 4 4 4????D. 3 3 3 3

var length = 4;
for(var i=0; i<length; i++){
    setTimeout(function ting(){
        console.log(i);
    }, 2000);
}

答案是C拷肌,原因如下:
setTimeout是異步調(diào)用的,且延遲兩秒執(zhí)行,因此等到setTimeout執(zhí)行的時候蘸拔,這個時候i的值已經(jīng)變成了4,因此循環(huán)四次就會輸出4個4环葵。
以上是個人的理解调窍,這里有更詳細(xì)的介紹:戳我就能看了

2.下面那個選項是返回true的
A. null == undefined
B. null === undefined
C. null instanceof Object
D. NaN == NaN
答案是A,原因如下:
null和undefined是類似的值张遭,undefined值是派生自null值的邓萨,因此A會返回true;可是又因為null和undefined的值雖然類似,可卻是不同類型的值缔恳,因此B返回false宝剖;instanceof 運算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型,因此C返回false歉甚;因為NaN與任何值都不相等万细,包括NaN本身,因此D返回false

3.下面的代碼返回的值分別是什么
A. 3 1 ????B. 1 2?????C. 1 3 ????D. 2 1

// 第一段
var one = 1;
function ha (ha_val){
    ha_val = 2;
    ha2(ha_val);
}
function ha2(ha2_val){
    ha2_val = 3;
}
ha(one);
console.log(one);

// 第二段
var two = {
    'val': 1
};
function changeVal_1(two){
    two.val = 2;
    changeVal_2(two.val);
}
function changeVal_2(value){
    value = 3;
}
changeVal_1(two);
console.log(two.val);

答案是B铃芦,原因如下:

  • 這題考察的是局部變量跟全局變量的內(nèi)容雅镊,第一段代碼,只是將one的值傳給函數(shù)ha刃滓,并賦值給函數(shù)局部變量ha_val仁烹,因此ha_val變量的值改變,不會影響變量one的值咧虎,所以最后輸出的值是1卓缰。
  • 第二段代碼,傳給函數(shù) changeVal_1的是對象two砰诵,而不是僅僅傳了two的值征唬,因此改變的是對象two的值;而傳給函數(shù)changeVal_2的是two.val的值茁彭,改變它的值总寒,不會改變對象two的值,因此最后輸出的值是2理肺。
    點擊查看對應(yīng)的參考文章

4.下面運用了哪個之后摄闸,左右上下偏移量無效
A. position: absolute
B. position: relative
C. position: fixed
D. position: static
答案是D,原因是:
static是position屬性的默認(rèn)值妹萨。這時候年枕,我們稱那個元素沒有被定位,只有設(shè)置了定位之后乎完,我們才能使用offset參數(shù)來為我們的元素指定我們想要的位置熏兄,否則top、left树姨、right摩桶、bottom等偏移量設(shè)置無效

5.Ajax的請求有多少種Callback,分別是什么娃弓?
Ajax請求總共有八種Callback典格,分別是:onSuccess、onFailure台丛、onUninitialized耍缴、onLoading砾肺、onLoaded、onInteractive防嗡、onComplete和onException变汪。

6.ajax的同步請求跟異步請求的區(qū)別是什么?
同步請求:當(dāng)執(zhí)行當(dāng)前ajax的時候會停止執(zhí)行后面的JS代碼蚁趁,直到ajax執(zhí)行完畢后時裙盾,才能繼續(xù)執(zhí)行后面的JS代碼。
異步請求:當(dāng)ajax發(fā)送請求后他嫡,在等待server端返回的這個過程中番官,前臺會繼續(xù) 執(zhí)行ajax塊后面的腳本,直到server端返回正確的結(jié)果才會去執(zhí)行success钢属,也就是說這時候執(zhí)行的是兩個線程徘熔,ajax塊發(fā)出請求后一個線程 和ajax塊后面的腳本(另一個線程)
參考文章:
AJAX中同步和異步的區(qū)別和使用
同步請求和異步請求的區(qū)別

7.用javascript寫一個一秒的定時任務(wù),一秒之后彈出彈窗淆党,內(nèi)容是“你好”

// 我當(dāng)時的做法是這樣的
var isPause =  false;
var startTime = new Date().getTime();
while(!isPause){
   var nowTime = new Date().getTime();
   if (nowTime - startTime >= 1000) {
       window.alert('你好');
       isPause = true;
   }
}

結(jié)束后去網(wǎng)上看看有沒有更好的方法酷师,發(fā)現(xiàn)網(wǎng)上大部分是直接用setTimeout的,看來是我想太多了染乌?

8.說說對前端工程化的理解

前端工程化

  • 使用軟件工程的技術(shù)和方法來進(jìn)行前端項目的開發(fā)山孔、維護(hù)和管理
  • 所有能降低成本,并且能提高效率的事情的總稱為工程化
  • 軟件工程化關(guān)注的是性能荷憋、穩(wěn)定性台颠、可用性、可維護(hù)性等方面勒庄,一切以這些為目標(biāo)的工作都是"前端工程化"
前端工程化分為這四個部分:規(guī)范化蓉媳,自動化,模塊化锅铅,組件化。

下面是一些詳細(xì)解析上面四個部分內(nèi)容的參考文章:
1.http://www.reibang.com/p/2e096d7d3e03
2.http://www.xuefeng666.com/WebGCH/WebGCH/#%E5%BD%92%E7%B1%BB%E6%8F%8F%E8%BF%B0
3.https://segmentfault.com/a/1190000009815823

9.下面的代碼最終的結(jié)果會輸入什么减宣?

function Test(){
    this.a = 0;
    this.b = function(){
        alert(this.a);
    }
}
Test.prototype = {
    b: function(){
        this.a = 20;
        alert(a);
    },
    c: (function(){
        this.a = 20;
        alert(this.a);
    })()
};
var fanshu = new Test();
fanshu.b();
fanshu.c;

fanshu.b()彈出的數(shù)字是:0
fanshu.c彈出的數(shù)字是:20
原因是:fanshu是Test的實例盐须,當(dāng)調(diào)用fanshu.b()時,會先在實例上查找有沒有b屬性漆腌,發(fā)現(xiàn)有對應(yīng)的b屬性贼邓,因此不會繼續(xù)往上查找,因此彈出的值是0闷尿;當(dāng)調(diào)用fanshu.c時塑径,在實例沒有查找到對應(yīng)的屬性,因此繼續(xù)在原型對象上查找填具,查找到對應(yīng)的c屬性统舀, c屬性是一個立即執(zhí)行的函數(shù)匆骗,因此可以直接執(zhí)行,彈出值20誉简。

10.事件委托的優(yōu)點碉就,如何優(yōu)化?
優(yōu)點:1.減少事件處理程序的綁定闷串,節(jié)省內(nèi)存瓮钥;2.減少dom節(jié)點操作,提高性能
優(yōu)化:1.降低層級烹吵,把事件綁定在低層級的元素上碉熄,不在body元素或者document上綁定;2.即使是用事件委托肋拔,也要減少綁定的次數(shù)锈津。
參考文章:深入理解-事件委托事件委托優(yōu)缺點

11.用javaScript寫一個用來替換replace方法的方法只损,替換掉下面的字符串

var type = { "company": "信息科技公司", "adjective": "領(lǐng)導(dǎo)nice" };
var date = "{{ company }} {{ adjective }}一姿,而且人才很多。";

額外思考:type的順序可以跟字符串里面的變量順序不一致跃惫,以及字符串的變量不一定存在于type中叮叹。
代碼如下:

function replaceString(type, string){
    var result = [];
    // 對字符串進(jìn)行第一次切割
    var items = string.split("{{");
    // 循環(huán)切割后得到的數(shù)組
    for(var i=0; i<items.length; i++){
        var item = items[i];
        // 對有“}}”的字符串進(jìn)行二次切割,沒有則放進(jìn)新數(shù)組中
        if(item.indexOf('}}') !== -1){
            var pieces = item.split("}}");
            // 獲取對應(yīng)的映射值爆存,并放進(jìn)新數(shù)組中
            var mappingVal = type[pieces[0]] ? type[pieces[0]] : ("{{" + pieces[0] + "}}");
            result.push(mappingVal);
            // 若"}}"后面還有字符串蛉顽,則放進(jìn)新數(shù)組中
            if(pieces.length > 1 && pieces[1] !== ''){
                result.push(pieces[1]);
            }
        }
        else if(item !== ''){
            result.push(item);
        }
    }
    // 連接數(shù)組中各項
    var result = result.join('');
    return result;
}

后來跟朋友討論了下,發(fā)現(xiàn)還可以用遞歸+substring的方法:

function replaceString(type, stringVal){
    var startIndex = 0;
    var res = '';
    function runStr(stringVal, startIndex){
        var leftIndex = stringVal.indexOf('{{', startIndex);
        var rightIndex = stringVal.indexOf("}}", startIndex);
        if(leftIndex !== -1 && rightIndex !== -1){
            var val = stringVal.substring(leftIndex + 2, rightIndex);
            if(type[val]){
                res = stringVal.substring(0, leftIndex) + type[val] + stringVal.substring(rightIndex + 2, stringVal.length);
                startIndex = res.indexOf("{{");
            }
            else {
                startIndex = res.indexOf("}}") + 2;
            }
            runStr(res, startIndex);
        }
    }
    runStr(stringVal, startIndex);
    return (res !== '' ? res : stringVal);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末先较,一起剝皮案震驚了整個濱河市携冤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闲勺,老刑警劉巖曾棕,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異菜循,居然都是意外死亡翘地,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門癌幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙耕,“玉大人,你說我怎么就攤上這事勺远〕却” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵胶逢,是天一觀的道長厅瞎。 經(jīng)常有香客問我饰潜,道長,這世上最難降的妖魔是什么磁奖? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任囊拜,我火速辦了婚禮,結(jié)果婚禮上比搭,老公的妹妹穿的比我還像新娘冠跷。我一直安慰自己,他們只是感情好身诺,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布蜜托。 她就那樣靜靜地躺著,像睡著了一般霉赡。 火紅的嫁衣襯著肌膚如雪橄务。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天穴亏,我揣著相機與錄音蜂挪,去河邊找鬼。 笑死嗓化,一個胖子當(dāng)著我的面吹牛棠涮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刺覆,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼严肪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谦屑?” 一聲冷哼從身側(cè)響起驳糯,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氢橙,沒想到半個月后酝枢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悍手,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年隧枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涝焙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孕暇,到底是詐尸還是另有隱情仑撞,我是刑警寧澤赤兴,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布隧哮,位于F島的核電站,受9級特大地震影響沮翔,放射性物質(zhì)發(fā)生泄漏陨帆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一采蚀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榆鼠,春花似錦纲爸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽神妹。三九已至颓哮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間题翻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工腰鬼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嵌赠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓熄赡,卻偏偏與公主長得像姜挺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子彼硫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5炊豪? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,486評論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,103評論 1 32
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化拧篮,入門級到專家級词渤,廣度和深度都會有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,584評論 0 7
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評論 0 3
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,798評論 0 38