前端面試題js部分小集

 JAVASCRIPt

介紹js的基本數據類型。

 UndefinedNullBooleanNumberString   Array

·        介紹js有哪些內置對象?

·        Object  JavaScript 中所有對象的父對象

·         

·        數據封裝類對象:ObjectArrayBooleanNumber  String

其他對象:FunctionArgumentsMathDateRegExpError

·        說幾條寫JavaScript的基本規範?

·        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();//現在可以參考varperson = Object.create(oldObject);

·            console.log(person.getInfo());//它擁有了Func的屬性和方法

·            //"Sean"

·            console.log(Func.prototype);

   // Func {name="Sean", getInfo=function()}

·        JavaScript有幾種類型的值?,你能畫一下他們的內存圖嗎?

·        棧:原始數據類型(UndefinedNullBooleanNumberString

·        堆:引用數據類型(對象、數組和函數)

·         

·        兩種類型的區別是:存儲位置不同;

·        原始數據類型直接存儲在棧(stack)中的簡單數據段,佔據空間小、大小固定,屬於被頻繁使用數據,所以放入棧中存儲;

·        引用數據類型存儲在堆(heap)中的對象,佔據空間大、大小不固定,如果存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其

在棧中的地址,取得地址後從堆中獲得實體

·        Javascript如何實現繼承?

·        1、構造繼承

·        2、原型繼承

·        3、實例繼承

·        4、拷貝繼承

·         

·        原型prototype機制或applycall方法去實現較簡單,建議使用構造函數與原型混合方式。

·         

·         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繼承的幾種實現方式?

o    參考:構造函數的繼承非構造函數的繼承

·        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對象的理解。

o   this總是指向函數的直接調用者(而非間接調用者);

o   如果有new關鍵字,this指向new出來的那個對象;

o   在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全局對象Window

·        eval是做什麼的?

·        它的功能是把對應的字符串解析成JS代碼並運行;

·        應該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執行)。

JSON字符串轉換爲JSON對象的時候可以用evalvar obj =eval('('+ str +')');

·        什麼是window對象什麼是document對象?

·        nullundefined 的區別?

·        null        表示一個對象被定義了,值爲空值

·        undefined   表示不存在這個值。

·         

·         

·        typeof undefined

·            //"undefined"

·            undefined :是一個表示""的原始值或者說表示"缺少值",就是此處應該有一個值,但是還沒有定義。當嘗試讀取時會返回 undefined

·            例如變量被聲明瞭,但沒有賦值時,就等於undefined

·         

·        typeof null

·            //"object"

·            null : 是一個對象(空對象, 沒有任何屬性和方法)

·            例如作爲函數的參數,表示該函數的參數不是對象;

·         

·        注意:

·            在驗證null時,一定要使用 === ,因爲 == 無法分別 null 和 undefined

·         

·         

·        再來一個例子:

·         

·            null

·            Q:有張三這個人麼?

·            A:有!

·            Q:張三有房子麼?

·            A:沒有!

·         

·            undefined

·            Q:有張三這個人麼?

   A:沒有!

參考閱讀:undefinednull的區別

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

·            // 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) 答案是多少?

·         [1, NaN, NaN] 因爲parseInt 需要兩個參數 (val, radix)

·         其中 radix表示解析時用的基數。

 map 傳了 3  (element, index, array),對應的 radix不合法導致解析失敗。

·        事件是?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(= 0;i<nodes.length;i+= 1){

·                nodes[i].onclick = function(){

·                    console.log(i+1);//不用閉包的話,值每次都是4

·                }(i);

·            }

·        </script>

·         

·         

·         

·        執行say667(),say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在

·        使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源

·        因爲say667()的內部函數的執行需要依賴say667()中的變量

·        這是對閉包作用的非常直白的描述

·         

·          function say667() {

·            // Local variable that ends up withinclosure

·            var num = 666;

·            var sayAlert = function() {

·                alert(num);

·            }

·            num++;

·            return sayAlert;

·        }

·         

·         var sayAlert = say667();

 sayAlert()//執行結果應該彈出的667

·        javascript代碼中的"use strict";是什麼意思 ? 使用它區別是什麼?

·        usestrict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,

·         

·        使JS編碼更加規範化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行爲。

·        默認支持的糟糕特性都會被禁用,比如不能用with,也不能在意外的情況下給全局變量賦值;

·        全局變量的顯示聲明,函數必須聲明在頂層,不允許在非函數代碼塊內聲明函數,arguments.callee也不允許使用;

·        消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數中的arguments修改,嚴格模式下的eval函數的行爲和非嚴格模式的也不相同;

·         

·        提高編譯器效率,增加運行速度;

爲未來新版本的Javascript標準化做鋪墊。

·        如何判斷一個對象是否屬於某個類?

·          使用instanceof (待完善)

·           if(instanceof Person){

·               alert('yes');

  }

·        new操作符具體幹了什麼呢?

·             1、創建一個空對象,並且 this 變量引用該對象,同時還繼承了該函數的原型。

·             2、屬性和方法被加入到 this 引用的對象中。

·             3、新創建的對象由 this 所引用,並且最後隱式的返回 this 

·         

·        varobj  = {};

·        obj.__proto__ = Base.prototype;

Base.call(obj);

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

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

·        hasOwnProperty

·         

·        javaScripthasOwnProperty函數方法是返回一個布爾值,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員。

·        使用方法:

·        object.hasOwnProperty(proName)

·        其中參數object是必選項。一個對象的實例。

·        proName是必選項。一個屬性名稱的字符串值。

·         

如果 object 具有指定名稱的屬性,那麼JavaScripthasOwnProperty函數方法返回 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="1pxsolid #"+(~~(Math.random()*(1<<24))).toString(16)}) 能解釋一下這段代碼的意思嗎?

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

deferasync、動態創建DOM方式(用得最多)、按需異步載入js

·        Ajax是什麼如何創建一個Ajax

·        ajax的全稱:Asynchronous Javascript And XML

·        異步傳輸+js+xml

·        所謂異步,在這裏簡單地解釋就是:向服務器發送請求的時候,我們不必等待結果,而是可以同時做其他的事情,等到有了結果它自己會根據設定進行後續操作,與此同時,頁面是不會發生整頁刷新的,提高了用戶體驗。

·         

·        (1)創建XMLHttpRequest對象,也就是創建一個異步調用對象

·        (2)創建一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息

·        (3)設置響應HTTP請求狀態變化的函數

·        (4)發送HTTP請求

·        (5)獲取異步調用返回的數據

(6)使用JavaScriptDOM實現局部刷新

·        同步和異步的區別?

同步的概念應該是來自於OS中關於同步的概念:不同進程爲協同完成某項工作而在先後次序上調整(通過阻塞,喚醒等方式).同步強調的是順序性.誰先誰後.異步則不存在這種順序性.

同步:瀏覽器訪問服務器請求,用戶看得到頁面刷新,重新發請求,等請求完,頁面刷新,新內容出現,用戶看到新內容,進行下一步操作。

異步:瀏覽器訪問服務器請求,用戶正常操作,瀏覽器後端進行請求。等請求完,頁面不刷新,新內容也會出現,用戶看到新內容。

(待完善)

·        如何解決跨域問題?

jsonpiframewindow.namewindow.postMessage、服務器上設置代理頁面

·        頁面編碼和被請求的資源編碼如果不一致如何處理?

·        模塊化開發怎麼做?

立即執行函數,不暴露私有成員

   var module1 = (function(){

       var _count = 0;

       var m1 = function(){

         //...

       };

       var m2 = function(){

         //...

       };

       return {

         m1 : m1,

         m2 : m2

       };

     })();

·        AMDModules/Asynchronous-Definition)、CMDCommon 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 aspossible.

   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()

   // ...

})

·        談一談你對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 來替換 subadd.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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章