web前端面試試題總結---javascript篇

JavaScript

  • 介紹js的基本數據類型。javascript

     Undefined、Null、Boolean、Number、String、
     ECMAScript 2015 新增:Symbol(建立後獨一無二且不可變的數據類型 )
  • 介紹js有哪些內置對象?css

    Object 是 JavaScript 中全部對象的父對象
    
    數據封裝類對象:Object、Array、Boolean、Number 和 String
    其餘對象:Function、Arguments、Math、Date、RegExp、Error
    參考:http://www.ibm.com/developerworks/cn/web/wa-objectsinjs-v1b/index.html
  • 說幾條寫JavaScript的基本規範?html

    1.不要在同一行聲明多個變量。
    2.請使用 ===/!==來比較true/false或者數值
    3.使用對象字面量替代new Array這種形式
    4.不要使用全局函數。
    5.Switch語句必須帶有default分支
    6.函數不該該有時候有返回值,有時候沒有返回值。
    7.For循環必須使用大括號
    8.If語句必須使用大括號
    9.for-in循環中的變量 應該使用var關鍵字明確限定做用域,從而避免做用域污染。
  • JavaScript原型,原型鏈 ? 有什麼特色?前端

    每一個對象都會在其內部初始化一個屬性,就是prototype(原型),當咱們訪問一個對象的屬性時,
    若是這個對象內部不存在這個屬性,那麼他就會去prototype裏找這個屬性,這個prototype又會有本身的prototype,
    因而就這樣一直找下去,也就是咱們平時所說的原型鏈的概念。
    關係:instance.constructor.prototype = instance.__proto__
    
    特色:
    JavaScript對象是經過引用來傳遞的,咱們建立的每一個新對象實體中並無一份屬於本身的原型副本。當咱們修改原型時,與之相關的對象也會繼承這一改變。
    
     當咱們須要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 若是沒有的話,
     就會查找他的Prototype對象是否有這個屬性,如此遞推下去,一直檢索到 Object 內建對象。
        function Func(){}
        Func.prototype.name = "Sean";
        Func.prototype.getInfo = function() {
          return this.name;
        }
        var person = new Func();//如今能夠參考var person = Object.create(oldObject);
        console.log(person.getInfo());//它擁有了Func的屬性和方法
        //"Sean"
        console.log(Func.prototype);
        // Func { name="Sean", getInfo=function()}
  • JavaScript有幾種類型的值?,你能畫一下他們的內存圖嗎?html5

    棧:原始數據類型(Undefined,Null,Boolean,Number、String) 
    堆:引用數據類型(對象、數組和函數)
    
    兩種類型的區別是:存儲位置不一樣;
    原始數據類型直接存儲在棧(stack)中的簡單數據段,佔據空間小、大小固定,屬於被頻繁使用數據,因此放入棧中存儲;
    引用數據類型存儲在堆(heap)中的對象,佔據空間大、大小不固定。若是存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址後從堆中得到實體

  • 如何將字符串轉化爲數字,例如'12.3b'?java

    * parseFloat('12.3b');
    * 正則表達式,'12.3b'.match(/(\d)+(\.)?(\d)+/g)[0] * 1, 可是這個不太靠譜,提供一種思路而已。
  • 如何將浮點數點左邊的數每三位添加一個逗號,如12000000.11轉化爲『12,000,000.11』?node

    function commafy(num){
        return num && num
            .toString()
            .replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){
                return $2 + ',';
            });
    }
  • 如何實現數組的隨機排序?jquery

  • 方法一: 
    ```javascript 

      var arr = [1,2,3,4,5,6,7,8,9,10]; function randSort1(arr){ for(var i = 0,len = arr.length;i < len; i++ ){ var rand = parseInt(Math.random()*len); var temp = arr[rand]; arr[rand] = arr[i]; arr[i] = temp; } return arr; } console.log(randSort1(arr)); ``` 方法二: ```javascript var arr = [1,2,3,4,5,6,7,8,9,10]; function randSort2(arr){ var mixedArray = []; while(arr.length > 0){ var randomIndex = parseInt(Math.random()*arr.length); mixedArray.push(arr[randomIndex]); arr.splice(randomIndex, 1); } return mixedArray; } console.log(randSort2(arr)); ``` 方法三: ```javascript var arr = [1,2,3,4,5,6,7,8,9,10]; arr.sort(function(){ return Math.random() - 0.5; }) console.log(arr); ```
  • Javascript如何實現繼承?git

    1、構造繼承
    2、原型繼承
    3、實例繼承
    4、拷貝繼承
    
    原型prototype機制或apply和call方法去實現較簡單,建議使用構造函數與原型混合方式。
    ```javascript
            function Parent(){
                this.name = 'wang';
            }
    
            function Child(){
                this.age = 28;
            }
            Child.prototype = new Parent();//繼承了Parent,經過原型
    
            var demo = new Child();
            alert(demo.age);
            alert(demo.name);//獲得被繼承的屬性
    
    ```
  • JavaScript繼承的幾種實現方式?程序員

  • javascript建立對象的幾種方式?

    javascript建立對象簡單的說,無非就是使用內置對象或各類自定義對象,固然還能夠用JSON;但寫法有不少種,也能混合使用。
    
    
    1、對象字面量的方式
    
        person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
    
    2、用function來模擬無參的構造函數
    
        function Person(){}
        var person=new Person();//定義一個function,若是使用new"實例化",該function能夠看做是一個Class
        person.name="Mark";
        person.age="25";
        person.work=function(){
        alert(person.name+" hello...");
        }
        person.work();
    
    3、用function來模擬參構造函數來實現(用this關鍵字定義構造的上下文屬性)
    
        function Pet(name,age,hobby){
           this.name=name;//this做用域:當前對象
           this.age=age;
           this.hobby=hobby;
           this.eat=function(){
              alert("我叫"+this.name+",我喜歡"+this.hobby+",是個程序員");
           }
        }
        var maidou =new Pet("麥兜",25,"coding");//實例化、建立對象
        maidou.eat();//調用eat方法
    
    4、用工廠方式來建立(內置對象)
    
         var wcDog =new Object();
         wcDog.name="旺財";
         wcDog.age=3;
         wcDog.work=function(){
           alert("我是"+wcDog.name+",汪汪汪......");
         }
         wcDog.work();
    
    5、用原型方式來建立
    
        function Dog(){
    
         }
         Dog.prototype.name="旺財";
         Dog.prototype.eat=function(){
         alert(this.name+"是個吃貨");
         }
         var wangcai =new Dog();
         wangcai.eat();
    
    5、用混合方式來建立
    
        function Car(name,price){
          this.name=name;
          this.price=price; 
        }
         Car.prototype.sell=function(){
           alert("我是"+this.name+",我如今賣"+this.price+"萬元");
          }
        var camry =new Car("凱美瑞",27);
        camry.sell(); 
  • Javascript做用鏈域?

    全局函數沒法查看局部函數的內部細節,但局部函數能夠查看其上層的函數細節,直至全局細節。
    當須要從局部函數查找某一屬性或方法時,若是當前做用域沒有找到,就會上溯到上層做用域查找,
    直至全局函數,這種組織形式就是做用域鏈。
  • 談談This對象的理解。

  • this老是指向函數的直接調用者(而非間接調用者);
    
    若是有new關鍵字,this指向new出來的那個對象;
    在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this老是指向全局對象Window;
  • eval是作什麼的?

    它的功能是把對應的字符串解析成JS代碼並運行;
    
    應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)。
    由JSON字符串轉換爲JSON對象的時候能夠用eval,
    var obj =eval('('+ str +')');
  • 什麼是window對象? 什麼是document對象?

    window對象是指瀏覽器打開的窗口。
    document對象是Documentd對象(HTML 文檔對象)的一個只讀引用,window對象的一個屬性。
  • null,undefined 的區別?

    null        表示一個對象是「沒有值」的值,也就是值爲「空」;
    undefined   表示一個變量聲明瞭沒有初始化(賦值);
    
    undefined不是一個有效的JSON,而null是;
    undefined的類型(typeof)是undefined;
    null的類型(typeof)是object;
    
    Javascript將未賦值的變量默認值設爲undefined;
    Javascript歷來不會將變量設爲null。它是用來讓程序員代表某個用var聲明的變量時沒有值的。
    
    typeof undefined
        //"undefined"
        undefined :是一個表示"無"的原始值或者說表示"缺乏值",就是此處應該有一個值,可是尚未定義。當嘗試讀取時會返回 undefined; 
        例如變量被聲明瞭,但沒有賦值時,就等於undefined
    
    typeof null
        //"object"
        null : 是一個對象(空對象, 沒有任何屬性和方法);
        例如做爲函數的參數,表示該函數的參數不是對象;
    
    注意:
        在驗證null時,必定要使用 === ,由於 == 沒法分別 null 和 undefined
        null == undefined // true
        null === undefined // false
    
    再來一個例子:
    
        null
        Q:有張三這我的麼?
        A:有!
        Q:張三有房子麼?
        A:沒有!
    
        undefined
        Q:有張三這我的麼?
        A:有!
        Q: 張三有多少歲?
        A: 不知道(沒有被告訴)

    參考閱讀:undefined與null的區別

  • 寫一個通用的事件偵聽器函數。

      // event(事件)工具集,來源: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();
                    };
                }
            },
            // 視能力分別使用dom0||dom2||IE方式 來綁定事件
            // 參數: 操做的元素,事件名稱 ,事件處理程序
            addEvent : function(element, type, handler) {
                if (element.addEventListener) {
                    //事件類型、須要執行的函數、是否捕捉
                    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.detachEvent('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.srcElement;
            },
            // 獲取event對象的引用,取到事件的全部信息,確保隨時能使用event;
            getEvent : function(e) {
                var ev = e || window.event;
                if (!ev) {
                    var c = this.getEvent.caller;
                    while (c) {
                        ev = c.arguments[0];
                        if (ev && Event == ev.constructor) {
                            break;
                        }
                        c = c.caller;
                    }
                }
                return ev;
            }
        };
  • ["1", "2", "3"].map(parseInt) 答案是多少?

    parseInt() 函數能解析一個字符串,並返回一個整數,須要兩個參數 (val, radix),
    其中 radix 表示要解析的數字的基數。【該值介於 2 ~ 36 之間,而且字符串中的數字不能大於radix才能正確返回數字結果值】;
    但此處 map 傳了 3 個 (element, index, array),咱們重寫parseInt函數測試一下是否符合上面的規則。
    
    function parseInt(str, radix) {
        return str+'-'+radix;
    };
    var a=["1", "2", "3"];
    a.map(parseInt);  // ["1-0", "2-1", "3-2"] 不能大於radix
    
    由於二進制裏面,沒有數字3,致使出現超範圍的radix賦值和不合法的進制解析,纔會返回NaN
    因此["1", "2", "3"].map(parseInt) 答案也就是:[1, NaN, NaN]
    詳細解析:http://blog.csdn.net/justjavac/article/details/19473199
  • 事件是?IE與火狐的事件機制有什麼區別? 如何阻止冒泡?

     1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。
     2. 事件處理機制:IE是事件冒泡、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件;
     3. ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
  • 什麼是閉包(closure),爲何要用它?

    閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域,將函數內部的變量和方法傳遞到外部。
    
    閉包的特性:
    
    1.函數內再嵌套函數
    2.內部函數能夠引用外層的參數和變量
    3.參數和變量不會被垃圾回收機制回收
    
    //li節點的onclick事件都能正確的彈出當前被點擊的li索引
     <ul id="testUL">
        <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(i){
                      return function() {
                         console.log(i);
                      } //不用閉包的話,值每次都是4
                    })(i);
        }
    </script>
    
    
    
    執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在
    使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源
    由於say667()的內部函數的執行須要依賴say667()中的變量
    這是對閉包做用的很是直白的描述
    
      function say667() {
        // Local variable that ends up within closure
        var num = 666;
        var sayAlert = function() {
            alert(num);
        }
        num++;
        return sayAlert;
    }
    
     var sayAlert = say667();
     sayAlert()//執行結果應該彈出的667
  • javascript 代碼中的"use strict";是什麼意思 ? 使用它區別是什麼?

    use strict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,
    
    使JS編碼更加規範化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲。
    默認支持的糟糕特性都會被禁用,好比不能用with,也不能在乎外的狀況下給全局變量賦值;
    全局變量的顯示聲明,函數必須聲明在頂層,不容許在非函數代碼塊內聲明函數,arguments.callee也不容許使用;
    消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數中的arguments修改,嚴格模式下的eval函數的行爲和非嚴格模式的也不相同;
    
    提升編譯器效率,增長運行速度;
    爲將來新版本的Javascript標準化作鋪墊。
  • 如何判斷一個對象是否屬於某個類?

     使用instanceof (待完善)
       if(a instanceof Person){
           alert('yes');
       }
  • new操做符具體幹了什麼呢?

    一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
    二、屬性和方法被加入到 this 引用的對象中。
    三、新建立的對象由 this 所引用,而且最後隱式的返回 thisvar obj  = {};
    obj.__proto__ = Base.prototype;
    Base.call(obj);

     

  • 用原生JavaScript的實現過什麼功能嗎?

  • Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?

    hasOwnProperty
    
    javaScript中hasOwnProperty函數方法是返回一個布爾值,指出一個對象是否具備指定名稱的屬性。此方法沒法檢查該對象的原型鏈中是否具備該屬性;該屬性必須是對象自己的一個成員。
    使用方法:
    object.hasOwnProperty(proName)
    其中參數object是必選項。一個對象的實例。
    proName是必選項。一個屬性名稱的字符串值。
    
    若是 object 具備指定名稱的屬性,那麼JavaScript中hasOwnProperty函數方法返回 true,反之則返回 false
  • JSON 的瞭解?

    JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
    它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小
    如:{"age":"12", "name":"back"}
    
    JSON字符串轉換爲JSON對象:
    var obj =eval('('+ str +')');
    var obj = str.parseJSON();
    var obj = JSON.parse(str);
    
    JSON對象轉換爲JSON字符串:
    var last=obj.toJSONString();
    var last=JSON.stringify(obj);
  • [].forEach.call($$("*"),function(a){a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)}) 能解釋一下這段代碼的意思嗎?

  • js延遲加載的方式有哪些?

    defer和async、動態建立DOM方式(用得最多)、按需異步載入js
  • Ajax 是什麼? 如何建立一個Ajax?

    ajax的全稱:Asynchronous Javascript And XML。
    異步傳輸+js+xml。
    所謂異步,在這裏簡單地解釋就是:向服務器發送請求的時候,咱們沒必要等待結果,而是能夠同時作其餘的事情,等到有告終果它本身會根據設定進行後續操做,與此同時,頁面是不會發生整頁刷新的,提升了用戶體驗。
    
    (1)建立XMLHttpRequest對象,也就是建立一個異步調用對象
    
    (
    2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
    (
    3)設置響應HTTP請求狀態變化的函數
    (
    4)發送HTTP請求
    (
    5)獲取異步調用返回的數據
    (
    6)使用JavaScript和DOM實現局部刷新
  • Ajax 解決瀏覽器緩存問題?

    一、在ajax發送請求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。
    
    二、在ajax發送請求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。
    
    三、在URL後面加上一個隨機數: "fresh=" + Math.random();。
    
    四、在URL後面加上時間搓:"nowtime=" + new Date().getTime();。
    
    五、若是是使用jQuery,直接這樣就能夠了 $.ajaxSetup({cache:false})。這樣頁面的全部ajax都會執行這條語句就是不須要保存緩存記錄。
  • 同步和異步的區別?

    同步的概念應該是來自於OS中關於同步的概念:不一樣進程爲協同完成某項工做而在前後次序上調整(經過阻塞,喚醒等方式).同步強調的是順序性.誰先誰後.異步則不存在這種順序性.
    
    同步:瀏覽器訪問服務器請求,用戶看獲得頁面刷新,從新發請求,等請求完,頁面刷新,新內容出現,用戶看到新內容,進行下一步操做。
    
    異步:瀏覽器訪問服務器請求,用戶正常操做,瀏覽器後端進行請求。等請求完,頁面不刷新,新內容也會出現,用戶看到新內容。
    
    (待完善)
  • 如何解決跨域問題?

    jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面
  • 頁面編碼和被請求的資源編碼若是不一致如何處理?

  • 模塊化開發怎麼作?

    當即執行函數,不暴露私有成員
    
        var module1 = (function(){
            var _count = 0;
            var m1 = function(){
              //...
            };
            var m2 = function(){
              //...
            };
            return {
              m1 : m1,
              m2 : m2
            };
          })();
    (待完善)
  • AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規範區別?

    AMD 規範在這裏:https://github.com/amdjs/amdjs-api/wiki/AMD

    CMD 規範在這裏:https://github.com/seajs/seajs/issues/242

     

    Asynchronous Module Definition,異步模塊定義,全部的模塊將被異步加載,模塊加載不影響後面語句運行。全部依賴某些模塊的語句均放置在回調函數中。
    
     區別:
    
        1. 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.
        2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:
    
    // CMD
    define(function(require, exports, module) {
        var a = require('./a')
        a.doSomething()
        // 此處略去 100 行
        var b = require('./b') // 依賴能夠就近書寫
        b.doSomething()
        // ...
    })
    
    // AMD 默認推薦
    define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
        a.doSomething()
        // 此處略去 100 行
        b.doSomething()
        // ...
    })
  • requireJS的核心原理是什麼?(如何動態加載的?如何避免屢次加載的?如何 緩存的?)

    參考:http://annn.me/how-to-realize-cmd-loader/
  • JS模塊加載器的輪子怎麼造,也就是如何實現一個模塊加載器?

  • 談一談你對ECMAScript6的瞭解?

  • ECMAScript6 怎麼寫class麼,爲何會出現class這種東西?

  • 異步加載JS的方式有哪些?

    (1) defer,只支持IE
    
    (2) async:
    
    (3) 建立script,插入到DOM中,加載完畢後callBack
  • documen.write和 innerHTML的區別

    document.write只能重繪整個頁面
    
    innerHTML能夠重繪頁面的一部分
  • DOM操做——怎樣添加、移除、移動、複製、建立和查找節點?

    (1)建立新節點
      createDocumentFragment()    //建立一個DOM片斷
      createElement()   //建立一個具體的元素
      createTextNode()   //建立一個文本節點
    (2)添加、移除、替換、插入
      appendChild()
      removeChild()
      replaceChild()
      insertBefore() //在已有的子節點前插入一個新的子節點
    (3)查找
      getElementsByTagName()    //經過標籤名稱
      getElementsByName()    //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的)
      getElementById()    //經過元素Id,惟一性
  • .call() 和 .apply() 的區別?

     例子中用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,因此運行結果爲:alert(4);
    
      注意:js 中的函數實際上是對象,函數名是對 Function 對象的引用。
    
        function add(a,b)
        {
            alert(a+b);
        }
    
        function sub(a,b)
        {
            alert(a-b);
        }
    
        add.call(sub,3,1);
  • 數組和對象有哪些原生方法,列舉一下?

  • JS 怎麼實現一個類。怎麼實例化這個類

  • JavaScript中的做用域與變量聲明提高?

  • 如何編寫高性能的Javascript?

  • 那些操做會形成內存泄漏?

  • JQuery的源碼看過嗎?能不能簡單概況一下它的實現原理?

  • jQuery.fn的init方法返回的this指的是什麼對象?爲何要返回this?

  • jquery中如何將數組轉化爲json字符串,而後再轉化回來?

  • jQuery 的屬性拷貝(extend)的實現原理是什麼,如何實現深拷貝?

  • jquery.extend 與 jquery.fn.extend的區別?

    * jquery.extend 爲jquery類添加類方法,能夠理解爲添加靜態方法
    * jquery.fn.extend: 
        源碼中jquery.fn = jquery.prototype,因此對jquery.fn的擴展,就是爲jquery類添加成員函數
    使用:
    jquery.extend擴展,須要經過jquery類來調用,而jquery.fn.extend擴展,全部jquery實例均可以直接調用。
  • jQuery 的隊列是如何實現的?隊列能夠用在哪些地方?

  • 談一下Jquery中的bind(),live(),delegate(),on()的區別?

  • JQuery一個對象能夠同時綁定多個事件,這是如何實現的?

  • 是否知道自定義事件。jQuery裏的fire函數是什麼意思,何時用?

  • jQuery 是經過哪一個方法和 Sizzle 選擇器結合的?(jQuery.fn.find()進入Sizzle)

  • 針對 jQuery性能的優化方法?

  • Jquery與jQuery UI 有啥區別?

    *jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
    
    *jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
     提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等
  • JQuery的源碼看過嗎?能不能簡單說一下它的實現原理?

  • jquery 中如何將數組轉化爲json字符串,而後再轉化回來?

  • jQuery中沒有提供這個功能,因此你須要先編寫兩個jQuery的擴展:
    
        $.fn.stringifyArray = function(array) {
            return JSON.stringify(array)
        }
    
        $.fn.parseArray = function(array) {
            return JSON.parse(array)
        }
    
        而後調用:
        $("").stringifyArray(array)
  • jQuery和Zepto的區別?各自的使用場景?

  • 針對 jQuery 的優化方法?

    *基於Class的選擇性的性能相對於Id選擇器開銷很大,由於需遍歷全部DOM元素。
    
    *頻繁操做的DOM,先緩存起來再操做。用Jquery的鏈式調用更好。
     好比:var str=$("a").attr("href");
    
    *for (var i = size; i < arr.length; i++) {}
     for 循環每一次循環都查找了數組 (arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可讓循環跑得更快:
     for (var i = size, length = arr.length; i < length; i++) {}
  • Zepto的點透問題如何解決?

  • jQueryUI如何自定義組件?

  • 需求:實現一個頁面操做不會整頁刷新的網站,而且能在瀏覽器前進、後退時正確響應。給出你的技術實現方案?

  • 如何判斷當前腳本運行在瀏覽器仍是node環境中?(阿里)

    this === window ? 'browser' : 'node';
    
    經過判斷Global對象是否爲window,若是不爲window,當前腳本沒有運行在瀏覽器中
  • 移動端最小觸控區域是多大?

  • jQuery 的 slideUp動畫 ,若是目標元素是被外部事件驅動, 當鼠標快速地連續觸發外部元素事件, 動畫會滯後的反覆執行,該如何處理呢?

    jquery stop(): 如:$("#div").stop().animate({width:"100px"},100);
  • 把 Script 標籤 放在頁面的最底部的body封閉以前 和封閉以後有什麼區別?瀏覽器會如何解析它們?

  • 移動端的點擊事件的有延遲,時間是多久,爲何會有? 怎麼解決這個延時?(click 有 300ms 延遲,爲了實現safari的雙擊事件的設計,瀏覽器要知道你是否是要雙擊操做。)

  • 知道各類JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)麼? 能講出他們各自的優勢和缺點麼?

  • Underscore 對哪些 JS 原生對象進行了擴展以及提供了哪些好用的函數方法?

  • 解釋JavaScript中的做用域與變量聲明提高?

  • 那些操做會形成內存泄漏?

    內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
    垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
    
    setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
    閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
  • JQuery一個對象能夠同時綁定多個事件,這是如何實現的?

    * 多個事件同一個函數:
        $("div").on("click mouseover", function(){});
    * 多個事件不一樣函數
        $("div").on({
            click: function(){},
            mouseover: function(){}
        });
  • Node.js的適用場景?

  • (若是會用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering麼?

  • 解釋一下 Backbone 的 MVC 實現方式?

  • 什麼是「前端路由」?何時適合使用「前端路由」? 「前端路由」有哪些優勢和缺點?

  • 知道什麼是webkit麼? 知道怎麼用瀏覽器的各類工具來調試和debug代碼麼?

    Chrome,Safari瀏覽器內核。
  • 如何測試前端代碼麼? 知道BDD, TDD, Unit Test麼? 知道怎麼測試你的前端工程麼(mocha, sinon, jasmin, qUnit..)?

  • 前端templating(Mustache, underscore, handlebars)是幹嗎的, 怎麼用?

  • 簡述一下 Handlebars 的基本用法?

  • 簡述一下 Handlerbars 的對模板的基本處理流程, 如何編譯的?如何緩存的?

  • 用js實現千位分隔符?(來源:前端農民工,提示:正則+replace)

    參考:http://www.tuicool.com/articles/ArQZfui
    function commafy(num) {
        return num && num
            .toString()
            .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
                return $1 + ",";
            });
    }
    console.log(commafy(1234567.90)); //1,234,567.90
  • 檢測瀏覽器版本版本有哪些方式?

    功能檢測、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"
  • What is a Polyfill?

    polyfill 是「在舊版瀏覽器上覆制標準 API 的 JavaScript 補充」,能夠動態地加載 JavaScript 代碼或庫,在不支持這些標準 API 的瀏覽器中模擬它們。
    例如,geolocation(地理位置)polyfill 能夠在 navigator 對象上添加全局的 geolocation 對象,還能添加 getCurrentPosition 函數以及「座標」回調對象,
    全部這些都是 W3C 地理位置 API 定義的對象和函數。由於 polyfill 模擬標準 API,因此可以以一種面向全部瀏覽器將來的方式針對這些 API 進行開發,
    一旦對這些 API 的支持變成絕對大多數,則能夠方便地去掉 polyfill,無需作任何額外工做。
  • 作的項目中,有沒有用過或本身實現一些 polyfill 方案(兼容性處理方案)?

    好比: html5shiv、Geolocation、Placeholder 
  • 咱們給一個dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡。會執行幾回事件,會先執行冒泡仍是捕獲?

  • 使用JS實現獲取文件擴展名?

    function getFileExtension(filename) {
      return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
    }   
    
    String.lastIndexOf() 方法返回指定值(本例中的'.')在調用該方法的字符串中最後出現的位置,若是沒找到則返回 -1。
    對於'filename'和'.hiddenfile',lastIndexOf的返回值分別爲0和-1無符號右移操做符(»>) 將-1轉換爲4294967295,將-2轉換爲4294967294,這個方法能夠保證邊緣狀況時文件名不變。
    String.prototype.slice() 從上面計算的索引處提取文件的擴展名。若是索引比文件名的長度大,結果爲""。

     

目錄:

一、web前端面試試題總結---html篇

二、web前端面試試題總結---css篇

三、web前端面試試題總結---javascript篇

四、web前端面試試題總結---其餘

相關文章
相關標籤/搜索