javascript面試

image.png

(1)異步與單線程,(運行機制類)

console.log(100);
        setTimeout(function() {
            console.log(200);
        }, 0);
        console.log(300);
        //100 -> 300 -> 200

console.log('a');
while(true){}
console.log('b');    //a

遇到setTimeout,里面的函數(shù)會被暫存起來期丰,等到所有的同步任務(wù)執(zhí)行完了再來執(zhí)行

(2)事件綁定通用函數(shù)

html
<div class="wrap">
        <li>我是一號</li>
        <li>俺是二號</li>
        <li>咱是三號</li>
    </div>
js
function bindEvent(elem,eventType,aim,fn){
            if(fn == null){
                fn = aim;
                aim = null;
            }
            var target;
            elem.addEventListener(eventType,function(e){
                target = e.target;
                if(aim){
                    if(target.matches(aim)){
                        fn.call(target,e);
                        //this指向target
                    }
                }else{
                    fn(e)
                }
            })
        }
        var wrap = document.querySelector('.wrap');
        bindEvent(wrap,'click',function(e){
            //console.log(this);
            //console.log(this.innerHTML);
            console.log(e.target.nodeName);
        })

(3)閉包

什么是閉包而姐?

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)

閉包的用途

可以讀取函數(shù)內(nèi)部的變量惹想,另一個就是讓這些變量的值始終保持在內(nèi)存中
閉包的兩種形式马昙,函數(shù)作為返回值,函數(shù)作為參數(shù)傳遞

兩種形式
//函數(shù)的作用域是在定義時確定的恋拍,this的指向是在調(diào)用時確定的
function earth(){
        var river = 20000;
        return function(){
            console.log(river);
                }
            }
            var river = 0;
            var earth1 = earth();
            earth1();

            function universe(fn){
                var river = 1;
                fn();
            }
            universe(earth1);
//20000
//20000
demo
var name = "godv";
        var hero = {
            name:"weidapao",
            getName:function(){
                return function(){
                    return this.name;
                }
            }
        }
        //console.log(hero.getName()()); godv
        var weiwei = hero.getName();
        console.log(weiwei());
        /**************************************/
        var card_name = "lks";
        var card_hero = {
            card_name:"dk_lks",
            getName:function(){
                var that = this;
                return function(){
                    return that.card_name;
                }
            }
        }
        console.log(card_hero.getName()()); dk_lks

(4)遍歷數(shù)組與對象的通用函數(shù)

function forEachArrOrObj(obj,fn){
            var key;
            if(obj instanceof Array){
                obj.forEach(function(item,index){
                    fn(item,index);
                })
            }else{
                for(key in obj){
                    fn(key,obj[key])
                }
            }
        }
        //var score = [88,90,100];
        var score = {"語文":88,
                     "數(shù)學":89,
                     "英語":100}
        forEachArrOrObj(score,function(item,index){
            console.log(item,index)
        })

(6)類型轉(zhuǎn)換

6種會被轉(zhuǎn)換為false,空字符串藕甩, 0施敢, false , NaN , null , nudefined
雙等號會進行隱式類型轉(zhuǎn)換

類型轉(zhuǎn)換.PNG

(7)構(gòu)造函數(shù)與原型鏈

new一個對象的過程

將this賦給一個空對象,向空對象里面加入屬性辛萍,返回這個對象悯姊,賦值給對象變量

五條原型規(guī)則
原型規(guī)則1.PNG
原型規(guī)則2.PNG
原型規(guī)則3.PNG
原型規(guī)則4.PNG
原型規(guī)則5.PNG

var Spider = function(){}
var spiderman = new Spider();
spiderman.__proto__ == Spider.prototype //true
原型鏈
Inked原型鏈_LI.jpg
原型鏈演示.PNG

(8)如何準確判斷數(shù)組類型

instanceof

instanceof 用于判斷一個對象是否是特定構(gòu)造函數(shù)的實例
判斷邏輯是 arr.proto一層層往上,能否找Array.prototype
存在的問題是當網(wǎng)頁中包含多個框架贩毕,那實際上就存在多個不同的全局環(huán)境悯许,從而存在不同版本的Array構(gòu)造函數(shù)。如果從一個框架向另一個框架傳入一個數(shù)組辉阶,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)先壕,就需要使用第三種方法,使用object的toString()

var arr = [];
arr instanceof Array //true
Object.prototype.toString.call(array)
function isArray(arr){
            return Object.prototype.toString.call(arr) === "[object Array]";
       }
       var arr = [1,2,3];
       console.log(isArray(arr)); //true

       function isArraytwo(arr){
            return Object.prototype.toString.call(arr).slice(8,-1).toLowerCase();
       }
       console.log(isArraytwo(arr));  //array
       console.log(isArraytwo({}));   //object

然后就是使用es5新增的Array.isArray( [ ] )方法

(9)得到函數(shù)參數(shù)的方法

function getParams(){
            return Array.prototype.slice.call(arguments);    //es5
       }
        
function getParams_es6(...res){    //es6
            return res;   
        }
        console.log(getParams_es6(1,2,3,4,5,6));
        console.log(typeof getParams_es6(1,2,3,4,5,6))  //object
        console.log(getParams(1,2,3,4,5,8));
        console.log(typeof getParams('wa','ha')); //object

(10)前后端分離

前后端的分離方式分為部分分離和全部分離兩種谆甜,部分分離是只把腳本和樣式分離出去垃僚,而html模板還留在后端通過jsp,velocity或者freemarker來渲染规辱;另一種就是完全分離谆棺,腳本樣式以及模板全都放在前端來維護

完全分離的方式,就是把純靜態(tài)的html模板完全放在前端罕袋,數(shù)據(jù)全部通過RESTful接口來進行交互改淑。這樣前后端就完全分開了碍岔,脫離了后端的模板,而這種方式的系統(tǒng)復雜度也會比第一種完全分離的方式低朵夏。但這種方案下蔼啦,所有的頁面數(shù)據(jù)都是用js渲染的,沒有動態(tài)模板仰猖,不太利于SEO捏肢。這個不足我們可以通過做server render或者給蜘蛛做一套定制頁面來解決


什么是前后端分離

  • 前端專注業(yè)務(wù)邏輯,后端負責接口與數(shù)據(jù)
  • 前端 處理更多的交互邏輯與路由跳轉(zhuǎn)
  • 是web應(yīng)用的一種架構(gòu)模式
  • 在前后端分離架構(gòu)中饥侵,后端只需要負責按照約定的數(shù)據(jù)格式向前端提供可調(diào)用的API服務(wù)即可鸵赫。前后端之間通過HTTP請求進行交互,前端獲取到數(shù)據(jù)后躏升,進行頁面的組裝和渲染奉瘤,最終返回給瀏覽器

前后端分離的好處

  • 實現(xiàn)了前后端的并行開發(fā)
  • 提升了用戶體驗,前端來拼接模板煮甥,減少加載時間
  • 接口可以給多種客戶端使用(PC 盗温,移動)

需要前后端分離的業(yè)務(wù)場景


image.png

(12)事件流

事件流描述的是從頁面中接收事件的順序

(13)&&與||

&&操作符總結(jié):只要一個false就取false的值,都是true取后面成肘,都是false取前面
||操作符總結(jié):只要一個是true就取true的值卖局,都是true取前面,都是false取后面

(14)任務(wù)隊列

單線程


image.png

image.png

所有任務(wù)可以分成兩種双霍,一種是同步任務(wù)(synchronous)砚偶,另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是洒闸,在主線程上排隊執(zhí)行的任務(wù)染坯,只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù)丘逸;異步任務(wù)指的是单鹿,不進入主線程、而進入"任務(wù)隊列"(task queue)的任務(wù)深纲,只有"任務(wù)隊列"通知主線程仲锄,某個異步任務(wù)可以執(zhí)行了,該任務(wù)才會進入主線程執(zhí)行


image.png

所有的程序都是在主進程中執(zhí)行的湃鹊,不管是同步還是異步任務(wù)儒喊,只是在異步隊列中進行等待輪詢


異步任務(wù)的運行機制

  1. 所有同步任務(wù)都在主線程上執(zhí)行,形成一個執(zhí)行棧(execution context stack)
  2. 主線程之外币呵,還存在一個"任務(wù)隊列"(task queue)怀愧。只要異步任務(wù)有了運行結(jié)果,就在"任務(wù)隊列"之中放置一個事件
  3. 一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會讀取"任務(wù)隊列"芯义,看看里面有哪些事件肛搬。那些對應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài)毕贼,進入執(zhí)行棧,開始執(zhí)行
  4. 主線程不斷重復上面的第三步,主線程空了蛤奢,就會去讀取"任務(wù)隊列"
(15)事件代理

事件的三個階段:捕獲鬼癣,目標,冒泡


事件代理的原理:事件的冒泡機制


事件代理的優(yōu)點:減少事件綁定啤贩,可以比如在table上代理所有td的click事件待秃,為新增的子節(jié)點綁定事件


(16)slice與splice的區(qū)別

splice() 方法向用于從數(shù)組中添加/刪除項目,然后返回被刪除的項目痹屹,會修改原數(shù)組,返回的是被刪除的項組成的數(shù)組

image.png
(17)組件化理解
image.png
(18)forEach的中斷章郁??志衍?
  • return false只是退出當前循環(huán)
  • 不能進行break
  • try catch
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暖庄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子楼肪,更是在濱河造成了極大的恐慌培廓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春叫,死亡現(xiàn)場離奇詭異肩钠,居然都是意外死亡,警方通過查閱死者的電腦和手機暂殖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門价匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呛每,你說我怎么就攤上這事踩窖。” “怎么了晨横?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵毙石,是天一觀的道長。 經(jīng)常有香客問我颓遏,道長徐矩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任叁幢,我火速辦了婚禮滤灯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己鳞骤,他們只是感情好窒百,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豫尽,像睡著了一般篙梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上美旧,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天渤滞,我揣著相機與錄音,去河邊找鬼榴嗅。 笑死妄呕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嗽测。 我是一名探鬼主播绪励,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼燎竖,長吁一口氣:“原來是場噩夢啊……” “哼灌诅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钳踊,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晤愧,失蹤者是張志新(化名)和其女友劉穎蠢护,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养涮,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡葵硕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贯吓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懈凹。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悄谐,靈堂內(nèi)的尸體忽然破棺而出介评,到底是詐尸還是另有隱情,我是刑警寧澤爬舰,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布们陆,位于F島的核電站,受9級特大地震影響情屹,放射性物質(zhì)發(fā)生泄漏坪仇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一垃你、第九天 我趴在偏房一處隱蔽的房頂上張望椅文。 院中可真熱鬧喂很,春花似錦、人聲如沸皆刺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羡蛾。三九已至漓帅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痴怨,已是汗流浹背忙干。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腿箩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓劣摇,卻偏偏與公主長得像珠移,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子末融,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 一钧惧、多線程 說明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是勾习,通過 New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,680評論 0 44
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理浓瞪,服務(wù)發(fā)現(xiàn),斷路器巧婶,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法乾颁,類相關(guān)的語法,內(nèi)部類的語法艺栈,繼承相關(guān)的語法英岭,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 好像有一段時間沒來這里寫日記了呢湿右。 上次寫日記的時候诅妹,我還在為一個大八卦開心得每天晚上都很high。但是現(xiàn)在已經(jīng)完...
    埃_閱讀 134評論 0 2
  • [幸福人兒]201706003學習力6期踐行記錄Day19 ?今天天氣不錯帶孩子出去玩了一天毅人,晚上洗漱完畢比較疲憊...
    金大地閱讀 169評論 0 0