前端開發(fā)面試題之 JavaScript

“每18至24個月裙品,前端都會難一倍”

——赫門 “2015深JS大會《前端服務(wù)化之路》主題演講”

知識點

數(shù)據(jù)類型俗批、運算對象市怎、function岁忘、繼承閉包区匠、作用域干像、原型鏈事件辱志、RegExp蝠筑、JSONAjax揩懒、DOM什乙、BOM內(nèi)存泄漏已球、跨域臣镣、異步加載模板引擎智亮、前端MVC忆某、前端MVVM路由阔蛉、模塊化弃舒、CanvasjQuery状原、ECMAScript 2015(ES6)聋呢、Node.jsAngularJS颠区、React削锰、CommonJSAMD毕莱、CMD ......

題目&答案

  • 介紹一下 JS 的基本數(shù)據(jù)類型器贩。
Undefined颅夺、Null、Boolean蛹稍、Number吧黄、String
  • 介紹一下 JS 有哪些內(nèi)置對象。
Object 是 JavaScript 中所有對象的父對象
數(shù)據(jù)封裝類對象:Object稳摄、Array稚字、Boolean、Number厦酬、String
其他對象:Function胆描、Argument、Math仗阅、Date昌讲、RegExp、Error
  • 列舉幾條 JavaScript 的基本代碼規(guī)范减噪。
(1)不要在同一行聲明多個變量
(2)如果你不知道數(shù)組的長度短绸,使用 push
(3)請使用 ===/!== 來比較 true/false 或者數(shù)值
(4)對字符串使用單引號 ''(因為大多時候我們的字符串。特別html會出現(xiàn)")
(5)使用對象字面量替代 new Array 這種形式
(6)絕對不要在一個非函數(shù)塊里聲明一個函數(shù)筹裕,把那個函數(shù)賦給一個變量醋闭。瀏覽器允許你這么做,但是它們解析不同
(7)不要使用全局函數(shù)
(8)總是使用 var 來聲明變量朝卒,如果不這么做將導(dǎo)致產(chǎn)生全局變量证逻,我們要避免污染全局命名空間
(9)Switch 語句必須帶有 default 分支
(10)使用 /**...*/ 進行多行注釋,包括描述抗斤,指定類型以及參數(shù)值和返回值
(11)函數(shù)不應(yīng)該有時候有返回值囚企,有時候沒有返回值
(12)語句結(jié)束一定要加分號
(13)for 循環(huán)必須使用大括號
(14)if 語句必須使用大括號
(15)for-in 循環(huán)中的變量應(yīng)該使用 var 關(guān)鍵字明確限定作用域,從而避免作用域污染
(16)避免單個字符名瑞眼,讓你的變量名有描述意義
(17)當命名對象龙宏、函數(shù)和實例時使用駝峰命名規(guī)則
(18)給對象原型分配方法,而不是用一個新的對象覆蓋原型伤疙,覆蓋原型會使繼承出現(xiàn)問題
(19)當給事件附加數(shù)據(jù)時银酗,傳入一個哈希而不是原始值,這可以讓后面的貢獻者加入更多數(shù)據(jù)到事件數(shù)據(jù)里徒像,而不用找出并更新那個事件的事件處理器
  • 介紹一下 JavaScript 原型黍特,原型鏈,它們有何特點厨姚?
每個對象都會在其內(nèi)部初始化一個屬性,就是prototype(原型)键菱,當我們訪問一個對象的屬性時谬墙,如果這個對象內(nèi)部不存在這個屬性今布,那么他就會去prototype里找這個屬性,這個prototype又會有自己的prototype拭抬,
于是就這樣一直找下去部默,也就是我們平時所說的原型鏈的概念。
關(guān)系:instance.constructor.prototype = instance.__proto__
//
特點:JavaScript對象是通過引用來傳遞的造虎,我們創(chuàng)建的每個新對象實體中并沒有一份屬于自己的原型副本傅蹂,當我們修改原型時,與之相關(guān)的對象也會繼承這一改變算凿。
//
當我們需要一個屬性時份蝴,JavaScript引擎會先看當前對象中是否有這個屬性,如果沒有的話氓轰,就會查找它的prototype對象是否有這個屬性婚夫,如此遞推下去,一致檢索到Object內(nèi)建對象署鸡。
function Func(){}
Func.prototype.name = "Xiaosong";
Func.prototype.getInfo = function() {
    return this.name;
}
var person = new Func();
console.log(person.getInfo());
//"Xiaosong"
console.log(Func.prototype);
//Func { name = "Xiaosong", getInfo = function() }
  • JavaScript 有幾種類型的值案糙?能否畫一下它們的內(nèi)存圖?
棧:原始數(shù)據(jù)類型(Undefined靴庆,Null时捌,Boolean,Number炉抒,String)
堆:引用數(shù)據(jù)類型(對象奢讨、數(shù)組、函數(shù))
兩種類型的區(qū)別:存儲位置不同
//
原始數(shù)據(jù)類型直接存儲在棧(stack)中的簡單數(shù)據(jù)段端礼,占據(jù)空間小禽笑、大小固定,屬于被頻繁使用數(shù)據(jù)蛤奥,所以放入棧中存儲佳镜;
引用數(shù)據(jù)類型存儲在堆(heap)中的對象,占據(jù)空間大、大小不固定,如果存儲在棧中凡桥,將會影響程序運行的性能蟀伸;引用數(shù)據(jù)類型在棧中存儲了指針,該指針指向堆中該實體的起始地址缅刽。當解釋器尋找引用值時啊掏,會首先檢索其在棧中的地址,取得地址后從堆中獲得實體衰猛。
  • JavaScript 如何實現(xiàn)繼承迟蜜?
(1)構(gòu)造繼承
(2)原型繼承
(3)實例繼承
(4)拷貝繼承
//
原型prototype機制或apply和call方法去實現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式啡省。
function Parent() {
    this.name = 'song';
}
function Child() {
    this.age = 28;
}
Child.prototype = new Parent(); //通過原型,繼承了Parent
//
var demo = new Child()l;
alert(demo.age);
alert(demo.name); //得到被繼承的屬性
  • JavaScript 有哪幾種創(chuàng)建對象的方式娜睛?
javascript創(chuàng)建對象簡單的說,無非就是使用內(nèi)置對象或各種自定義對象髓霞,當然還可以用JSON;但寫法有很多種畦戒,也能混合使用方库。
//
(1)對象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
(2)用function來模擬無參的構(gòu)造函數(shù)
function Person(){}
var person = new Person(); //定義一個function,如果使用new"實例化",該function可以看作是一個Class
person.name = "Xiaosong";
person.age = "23";
person.work = function() {
    alert("Hello " + person.name);
}
person.work();
(3)用function來模擬參構(gòu)造函數(shù)來實現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)
function Person(name,age,hobby) {
    this.name = name; //this作用域:當前對象
    this.age = age;
    this.work = work;
    this.info = function() {
        alert("我叫" + this.name + "障斋,今年" + this.age + "歲纵潦,是個" + this.work);
    }
}
var Xiaosong = new Person("WooKong",23,"程序猿"); //實例化、創(chuàng)建對象
Xiaosong.info(); //調(diào)用info()方法
(4)用工廠方式來創(chuàng)建(內(nèi)置對象)
var jsCreater = new Object();
jsCreater.name = "Brendan Eich"; //JavaScript的發(fā)明者
jsCreater.work = "JavaScript";
jsCreater.info = function() {
    alert("我是"+this.work+"的發(fā)明者"+this.name);
}
jsCreater.info();
(5)用原型方式來創(chuàng)建
function Standard(){}
Standard.prototype.name = "ECMAScript";
Standard.prototype.event = function() {
    alert(this.name+"是腳本語言標準規(guī)范");
}
var jiaoben = new Standard();
jiaoben.event();
(6)用混合方式來創(chuàng)建
function iPhone(name,event) {
    this.name = name;
    this.event = event;
}
iPhone.prototype.sell = function() {
    alert("我是"+this.name+"垃环,我是iPhone5s的"+this.event+"~ haha!");
}
var SE = new iPhone("iPhone SE","官方翻新機");
SE.sell();
  • eval 是做什么的邀层?
它的功能是把對應(yīng)的字符串解析成JS代碼并運行;
應(yīng)該避免使用eval晴裹,因為不安全被济,非常耗性能(2次,一次解析成js語句涧团,一次執(zhí)行)只磷。
  • 什么是 document 對象?什么是 window 對象泌绣?
  • null 和 undefined 有何區(qū)別钮追?
null        表示一個對象被定義了,值為“空值”阿迈;
undefined   表示不存在這個值元媚。
//
typeof undefined
    //"undefined"
    undefined :是一個表示"無"的原始值或者說表示"缺少值",就是此處應(yīng)該有一個值苗沧,但是還沒有定義刊棕。當嘗試讀取時會返回 undefined; 
    例如變量被聲明了待逞,但沒有賦值時甥角,就等于undefined。
//
typeof null
    //"object"
    null : 是一個對象(空對象, 沒有任何屬性和方法)识樱;
    例如作為函數(shù)的參數(shù)嗤无,表示該函數(shù)的參數(shù)不是對象;
//
注意:
    在驗證null時怜庸,一定要使用 === 当犯,因為 == 無法分別 null 和 undefined
  • 能否寫一個通用的事件偵聽器函數(shù)?
//Event工具集割疾,from: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();
            };
        }
    },
    //視能力分別使用 demo0 || demo1 || IE 方式來綁定事件
    //參數(shù):操作的元素嚎卫,事件名稱,事件處理程序
    addEvent: function(element,type,handler) {
        if (element.addEventListener) {
            //事件類型宏榕、需要執(zhí)行的函數(shù)拓诸、是否捕捉
            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.removeEventListener) {
            element.removeEventListener(type,handler,false);
        }else if (element.datachEvent) {
            element.datachEvent('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.srcElemnt;
    },
    //獲取event對象的引用,取到事件的所有信息恰响,確保隨時能使用event;
    getEvent: function(e) {
        var ev = e || window.event;
        if (!ev) {
            var c = this.getEvent.caller;
            while(c) {
                ev = c.argument[0];
                if (ev && Event == ev.constructor) {
                    break;
                }
                c = c.caller;
            }
        }
        retrun ev;
    }
};
  • ["1","2","3"].map(parseInt) 的答案是多少涌献?
[1,NaN,NaN]
因為 parseInt 需要兩個參數(shù)(val,radix)胚宦,其中 radix 表示解析時用的基數(shù)。
map 傳了3個(element,index,array)燕垃,對應(yīng)的 radix 不合法導(dǎo)致解析失敗枢劝。
  • 事件是什么?IE與火狐的事件機制有何區(qū)別卜壕?如何阻止冒泡您旁?
(1)我們在網(wǎng)頁中的某個操作(有的操作對應(yīng)多個事件)。例如:當我們點擊一個按鈕就會產(chǎn)生一個事件轴捎。是可以被 JavaScript 偵測到的行為鹤盒。
(2)事件處理機制:IE是事件冒泡、Firefox同時支持兩種事件模型侦副,也就是:捕獲型事件和冒泡型事件侦锯;
(3)ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
  • 什么是閉包(closure),為什么要用它秦驯?
閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù)尺碰,創(chuàng)建閉包的最常見的方式就是在一個函數(shù)內(nèi)創(chuàng)建另一個函數(shù),通過另一個函數(shù)訪問這個函數(shù)的局部變量译隘,利用閉包可以突破作用鏈域亲桥,將函數(shù)內(nèi)部的變量和方法傳遞到外部。
//
閉包特性:
(1)函數(shù)內(nèi)再嵌套函數(shù)
(2)內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
(3)參數(shù)和變量不會被垃圾回收機制回收
//li節(jié)點的onclick事件都能正確的彈出當前被點擊的li索引
<ul>
    <li> index = 0 </li>
    <li> index = 1 </li>
    <li> index = 2 </li>
    <li> index = 3 </li>
</ul>
<script type="text/javascript">
    var nodes = document.getElementsByTagName('li');
    for(i = 0;i<nodes.length;i+=1) {
        nodes[i].onclick = function() {
            console.log(i+1); //不使用閉包的話固耘,值每次都是4
        }(4);
    }
</script>
  • JavaScript 代碼中的 "use strict"; 是什么意思题篷?使用它的區(qū)別是什么?
use strict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理玻驻、不嚴謹之處悼凑,減少一些怪異行為。
默認支持的糟糕特性都會被禁用璧瞬,比如不能用with户辫,也不能在意外的情況下給全局變量賦值;
全局變量的顯示聲明,函數(shù)必須聲明在頂層,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用嗤锉;
消除代碼運行的一些不安全之處渔欢,保證代碼運行的安全,限制函數(shù)中的arguments修改,嚴格模式下的eval函數(shù)的行為和非嚴格模式的也不相同;
提高編譯器效率瘟忱,增加運行速度奥额;
為未來新版本的Javascript標準化做鋪墊苫幢。
  • new 操作符具體干了什么呢?
(1)創(chuàng)建一個空對象垫挨,并且 this 變量引用該對象韩肝,同時還繼承了該函數(shù)的原型。
(2)屬性和方法被加入到 this 引用的對象中九榔。
(3)新創(chuàng)建的對象由 this 所引用哀峻,并且最后隱式的返回 this 。
//
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
  • 用原生的 JavaScript 實現(xiàn)過什么功能嗎哲泊?
  • JavaScript 中剩蟀,有一個函數(shù),執(zhí)行對象查找時切威,永遠不會去查找原型育特,這個函數(shù)是哪個?
hasOwnProperty
//
JavaScript 中 hasOwnProperty 函數(shù)方法是返回一個布爾值先朦,指出一個對象是否具有指定名稱的屬性缰冤。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員喳魏。
//
使用方法:
object.hasOwnProperty(proName)
其中參數(shù)object是必選項锋谐,一個對象的實例。
proName是必選項截酷,一個屬性名稱的字符串值涮拗。
//
如果 object 具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回 true迂苛,反之則返回 false三热。
  • 你對 JSON 了解嗎?
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式三幻。
它是基于JavaScript的一個子集就漾。數(shù)據(jù)格式簡單,易于讀寫念搬,占用帶寬小抑堡。
如:
{"age":"12", "name":"back"}
  • js延遲加載的方式有哪些?
defer和async朗徊、動態(tài)創(chuàng)建DOM方式(用得最多)首妖、按需異步載入js
  • Ajax 是什么?如何創(chuàng)建一個 Ajax 爷恳?
ajax的全稱:Asynchronous Javascript And XML有缆。
異步傳輸+js+xml。
所謂異步,在這里簡單地解釋就是:向服務(wù)器發(fā)送請求的時候棚壁,我們不必等待結(jié)果杯矩,而是可以同時做其他的事情,等到有了結(jié)果它自己會根據(jù)設(shè)定進行后續(xù)操作袖外,與此同時史隆,頁面是不會發(fā)生整頁刷新的,提高了用戶體驗曼验。
//
(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象
(2)創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法逆害、URL及驗證信息
(3)設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù)
(4)發(fā)送HTTP請求
(5)獲取異步調(diào)用返回的數(shù)據(jù)
(6)使用JavaScript和DOM實現(xiàn)局部刷新
  • 同步和異步的區(qū)別?
同步的概念應(yīng)該是來自于操作系統(tǒng)中關(guān)于同步的概念:
不同進程為協(xié)同完成某項工作而在先后次序上調(diào)整(通過阻塞,喚醒等方式)蚣驼。同步強調(diào)的是順序性,誰先誰后相艇;異步則不存在這種順序性颖杏。
//
同步:瀏覽器訪問服務(wù)器請求,用戶看得到頁面刷新坛芽,重新發(fā)請求,等請求完留储,頁面刷新,新內(nèi)容出現(xiàn)咙轩,用戶看到新內(nèi)容,進行下一步操作获讳。
//
異步:瀏覽器訪問服務(wù)器請求,用戶正常操作活喊,瀏覽器后端進行請求丐膝。等請求完,頁面不刷新钾菊,新內(nèi)容也會出現(xiàn)帅矗,用戶看到新內(nèi)容。
  • 如何解決跨域問題煞烫?
jsonp浑此、iframe、window.name滞详、window.postMessage凛俱、服務(wù)器上設(shè)置代理頁面
  • 頁面編碼和被請求的資源編碼如果不一致如何處理?
  • 談一談你對 ECMAScript6 的了解料饥?
ECMAScript 6 是JavaScript語言的下一代標準蒲犬,已經(jīng)在2015年6月正式發(fā)布了。它的目標岸啡,是使得JavaScript語言可以用來編寫復(fù)雜的大型應(yīng)用程序暖哨,成為企業(yè)級開發(fā)語言。
標準的制定者有計劃,以后每年發(fā)布一次標準篇裁,使用年份作為標準的版本沛慢。因為當前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015达布。也就是說团甲,ES6就是ES2015
  • ECMAScript 6 怎么寫 class ,為何會出現(xiàn) class黍聂?
ES6的class可以看作只是一個語法糖躺苦,它的絕大部分功能,ES5都可以做到产还,新的class寫法只是讓對象原型的寫法更加清晰匹厘、更像面向?qū)ο缶幊痰恼Z法而已。
//定義類
class Point {
    constructor(x,y) {  //構(gòu)造方法
        this.x = x;  //this關(guān)鍵字代表實例對象
        this.y = y;
    }
    toString() {
        return '(' + this.x + ',' + this.y + ')';
    }
}
  • 異步加載 JS 的方式有哪些脐区?
(1)defer愈诚,只支持 IE
(2)async:
(3)創(chuàng)建 script,插入到 DOM 中牛隅,加載完畢后 callBack
  • document.write 和 innerHTML 有何區(qū)別炕柔?
document.write 只能重繪整個頁面
innerHTML 可以重繪頁面的一部分
  • DOM 操作——怎樣添加、移除媒佣、移動匕累、復(fù)制、創(chuàng)建和查找節(jié)點默伍?
(1)創(chuàng)建新節(jié)點
  createDocumentFragment()    //創(chuàng)建一個DOM片段
  createElement()   //創(chuàng)建一個具體的元素
  createTextNode()   //創(chuàng)建一個文本節(jié)點
(2)添加欢嘿、移除、替換也糊、插入
  appendChild()
  removeChild()
  replaceChild()
  insertBefore() //在已有的子節(jié)點前插入一個新的子節(jié)點
(3)查找
  getElementsByTagName()    //通過標簽名稱
  getElementsByName()    //通過元素的Name屬性的值(IE容錯能力較強际插,會得到一個數(shù)組,其中包括id等于name值的)
  getElementById()    //通過元素Id显设,唯一性
  • 數(shù)組和對象有哪些原生方法框弛?能否列舉一下?
  • 哪些操作會造成內(nèi)存泄漏瑟枫?
內(nèi)存泄漏是指任何對象在您不再擁有或需要它之后任然存在。
垃圾回收器定期掃描對象指攒,并計算引用了每個對象的其他對象的數(shù)量慷妙,如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象),或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的允悦,那么該對象的內(nèi)存即可回收膝擂。
//
setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內(nèi)存泄漏。
閉包架馋、控制臺日志狞山、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))
  • 是否看過 jQuery 的源碼叉寂?能否簡單概括一下它的實現(xiàn)原理萍启?
  • jQuery.fn 的 init 方法返回的 this 指的是什么對象?為什么要返回 this 屏鳍?
  • jQuery 中如何將數(shù)組轉(zhuǎn)化為 json 字符串勘纯,然后再轉(zhuǎn)化回來?
jQuery 中沒有提供這個功能钓瞭,所以需要先編寫兩個 jQuery 的擴展:
$.fn.stringifyArray = function(array) {
    return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
    return JSON.parse(array)
}
//
然后調(diào)用:
$("").stringifyArray(array)
  • jQuery 的屬性拷貝(extend)的實現(xiàn)原理是什么驳遵?如何實現(xiàn)深拷貝?
  • jQuery.extend 與 jQuery.fn.extend 有何區(qū)別山涡?
  • jQuery 的隊列是如何實現(xiàn)的堤结?隊列可以用在哪些地方?
  • jQuery 中一個對象可以同時綁定多個事件佳鳖,這是如何實現(xiàn)的?
  • 是否了解針對 jQuery 性能的優(yōu)化方法媒惕?
基于Class的選擇性的性能相對于Id選擇器開銷很大系吩,因為需遍歷所有DOM元素。
//
頻繁操作的DOM妒蔚,先緩存起來再操作穿挨。用Jquery的鏈式調(diào)用更好。
 比如:var str=$("a").attr("href");
 //
for (var i = size; i < arr.length; i++) {}
for 循環(huán)每一次循環(huán)都查找了數(shù)組 (arr) 的.length 屬性肴盏,在開始循環(huán)的時候設(shè)置一個變量來存儲這個數(shù)字科盛,可以讓循環(huán)跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
  • jQuery 與 jQuery UI 有何區(qū)別?
`jQuery`是一個js庫菜皂,主要提供的功能是選擇器贞绵,屬性修改和事件綁定等等。
`jQuery UI`則是在jQuery的基礎(chǔ)上恍飘,利用jQuery的擴展性榨崩,設(shè)計的插件。提供了一些常用的界面元素章母,諸如對話框母蛛、拖動行為、改變大小行為等等
  • jQuery UI 如何自定義組件乳怎?
  • 如何判斷當前腳本運行在瀏覽器還是 node 環(huán)境中彩郊?(阿里)
通過判斷 Global 對象是否為 window ,如果不為 window ,當前腳本沒有運行在瀏覽器中
  • 什么是“前端路由”秫逝?什么時候適合使用“前端路由”恕出?“前端路由”有哪些優(yōu)點和缺點?
  • 怎樣用js實現(xiàn)千位分隔符筷登?
正則 + replace
function commafy(num) {
    num = num + '';
    var reg = /(-?d+)(d{3})/;
    if (reg.test(num)) {
        num = num.replace(reg, '$1,$2');
    }
    return num;
}
  • 檢測瀏覽器版本有哪些方式剃根?
功能檢測、userAgent 特征檢測
比如:navigator.userAgent
//"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
  • 談?wù)勀銓?JavaScript 中的模塊規(guī)范 CommonJS前方、AMD狈醉、CMD 的了解?
//個人拙見
|   CommonJS   |   AMD   |   CMD   |
|--------------|---------|---------|
|    Node.js   |RequireJS|  SeaJS  |

詳細文章:淺析JS中的模塊規(guī)范(CommonJS惠险,AMD苗傅,CMD)關(guān)于 CommonJS AMD CMD UMD

  • 前端 MVC班巩、MVVM
    1渣慕、MVC


    MVC
模型(Model):數(shù)據(jù)保存
視圖(View):用戶界面
控制器(Controller):業(yè)務(wù)邏輯
(1)View 傳送指令到 Controller
(2)Controller 完成業(yè)務(wù)邏輯后,要求 Model 改變狀態(tài)
(3)Model 將新的數(shù)據(jù)發(fā)送到 View 抱慌,用戶得到反饋
所有通信都是單向的逊桦。

2、MVVM


MVVM
模型(Model)
視圖(View)
視圖模型(ViewModel)
(1)各部分間都是雙向通信
(2)View 與 Model 不發(fā)生聯(lián)系抑进,都通過 ViewModel 傳遞
(3)View 非常薄强经,不部署任何業(yè)務(wù)邏輯,稱為“被動視圖”(Passive View)寺渗,即沒有任何主動性匿情;而 ViewModel 非常厚,所有邏輯都部署在那里
采用雙向綁定(data-binding):View 的變動信殊,自動反映在 ViewModel 炬称,反之亦然。

系列:
前端開發(fā)面試題之 HTML
前端開發(fā)面試題之綜合篇
前端開發(fā)面試題之 CSS


資料搜集整理自 網(wǎng)絡(luò)
同時發(fā)布在 GitHub-前端開發(fā)面試題之 JavaScript涡拘、GitHub-《WEB-DE》前端開發(fā)面試題之 JavaScript

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玲躯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳄乏,更是在濱河造成了極大的恐慌府蔗,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汞窗,死亡現(xiàn)場離奇詭異姓赤,居然都是意外死亡,警方通過查閱死者的電腦和手機仲吏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門不铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝌焚,“玉大人,你說我怎么就攤上這事誓斥≈蝗鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵劳坑,是天一觀的道長毕谴。 經(jīng)常有香客問我,道長距芬,這世上最難降的妖魔是什么涝开? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮框仔,結(jié)果婚禮上舀武,老公的妹妹穿的比我還像新娘。我一直安慰自己离斩,他們只是感情好银舱,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跛梗,像睡著了一般寻馏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上核偿,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天诚欠,我揣著相機與錄音,去河邊找鬼宪祥。 笑死聂薪,一個胖子當著我的面吹牛家乘,可吹牛的內(nèi)容都是我干的蝗羊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼馍迄,長吁一口氣:“原來是場噩夢啊……” “哼颈嚼!你這毒婦竟也來了畅厢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤野芒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后双炕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狞悲,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年妇斤,在試婚紗的時候發(fā)現(xiàn)自己被綠了摇锋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹拯。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荸恕,靈堂內(nèi)的尸體忽然破棺而出乖酬,到底是詐尸還是另有隱情,我是刑警寧澤融求,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布咬像,位于F島的核電站,受9級特大地震影響生宛,放射性物質(zhì)發(fā)生泄漏县昂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一茅糜、第九天 我趴在偏房一處隱蔽的房頂上張望七芭。 院中可真熱鬧,春花似錦蔑赘、人聲如沸狸驳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙箍。三九已至,卻和暖如春酥馍,著一層夾襖步出監(jiān)牢的瞬間辩昆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工旨袒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汁针,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓砚尽,卻偏偏與公主長得像施无,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子必孤,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 相關(guān)知識點 數(shù)據(jù)類型猾骡、運算、對象敷搪、function兴想、繼承、閉包赡勘、作用域嫂便、原型鏈、事件闸与、RegExp毙替、JSON曼振、Aj...
    sandisen閱讀 22,926評論 20 251
  • 相關(guān)知識點數(shù)據(jù)類型、運算蔚龙、對象冰评、function、繼承木羹、閉包甲雅、作用域、原型鏈坑填、事件抛人、RegExp、JSON脐瑰、Aja...
    heyunqiang99閱讀 912評論 6 28
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,269評論 24 450
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品妖枚,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式苍在。簡單...
    舟漁行舟閱讀 7,721評論 2 17
  • 倚望西樓 無愁不寐卻生愁绝页, 難解煩憂獨倚樓。 當羨放舟垂釣客寂恬, 一壺濁酒臥船頭续誉。 孤獨的背影躑躅在塵世的盡頭,零亂...
    知一書齋閱讀 276評論 0 4