天天看點

2018前端必考面試題總結6前端必考面試題總結6

前端必考面試題總結6

  • JavaScript的typeof傳回哪些資料類型?

    字元串(String)—–>typeof傳回的值是string

    數字(Number)——>typeof傳回的值是number(NaN,infinity等特殊的數字類型傳回值也是number);

    布爾(Boolean)——>typeof傳回的值是Boolean

    數組(Array)——>typeof傳回的值是object

    日期(Date)——>typeof傳回的值是object

    對象(Object)——>typeof傳回的值是object

    空(Null)——>typeof傳回的值是object

    未定義(undefined)——>typeof傳回的值是undefined(不存在的變量、函數或者undefined等傳回的值都是undefined);

    function——>typeof傳回的值是function

    symbol——>typeof傳回的值是symbol(ES6引入了一種新的原始資料類型symbol,表示獨一無二的值)。

  • 列舉3種強制類型轉換和兩種隐式類型轉換

    強制類型轉換:

    Boolean(value):把值轉換成Boolean類型;

    Number(value):把值轉換成數字;

    String(value):把值轉換成字元串。

    隐式類型轉換:

    JavaScript在運算之前會進行隐式類型轉換,是以-,*,%等算術運算符都會把操作數轉換成數字的(“+”号就有點不一樣了,有些情況下,他是算術加号,有些情況下,是字元串連接配接符,具體要看它的操作數);

    JavaScript在做比較時也會進行隐式類型轉換,例如:字元串和數字比較時,字元串轉數字;數字與布爾值比較時,布爾轉數字;字元串和布爾值比較時,兩者轉數字。

  • split(),join()的差別

    split()擷取一個字元串,然後在分隔符處将其斷開,進而傳回一批字元串。

    join()擷取一批字元串,然後用分隔符字元串将他們連接配接起來,進而傳回一個字元串。

    這兩個函數之間主要差別在于join()可以使用任何分隔符字元串将多個字元串連接配接起來,而split隻能使用一個字元分割符将字元串斷開。

    簡單的說,如果你用split()是把一串字元(根據某個分隔符)分成若幹個元素存放在一個數組裡。而join()是把數組中的字元串連成一個長串,可以大體上認為是split的逆操作。

  • 事件綁定和普通事件有什麼差別?
    普通添加事件的方法不支援添加多個事件,最下面的事件會覆寫上面的,而事件綁定(addEventListener)方式添加事件可以添加多個。
//普通添加事件的方法,執行下面的代碼隻會alert 2
            var btn1=document.getElementById("hello");
            btn1.onclick=function(){
                alert();
            }
            btn1.onclick=function(){
                alert();
            }
            //事件綁定方式添加事件,執行下面的代碼會先alert 1再alert 2
            var btn2=document.getElementById("hi");
            btn2.addEventListener("click",function(){
                alert();
            },false);
            btn2.addEventListener("click",function(){
                alert();
            },false);
           
  • IE和DOM事件流的差別
(1)IE采用冒泡型事件,DOM使用先捕獲後冒泡型事件,Netscape使用捕獲型事件。
<body>
<div>
<button>點選這裡</button>
</div>
</body>
           

冒泡型事件模型:button->div->body(IE事件流)

捕獲型事件:body->div->button(Netscape事件流)

DOM事件模型:body->div->button->button->div->body(先捕獲後冒泡)

(2)事件偵聽函數的差別

IE使用:

[object].attachEvent(“name_of_event_handler”,fnHandler);//綁定函數

[object].detachEvent(“name_of_event_handler”,fnHandler);//移除綁定

DOM使用:

[object].attachEventListener(“name_of_event”,fnHandler,bCapture);//綁定函數

[object].removeEventListener(“name_of_event”,fnHandler,bCapture);//移除綁定

bCapture參數用于設定綁定的階段,true為捕獲階段,false為冒泡階段。

function addEventHandler(object,eventType,fnHandler){
                if(object.addEventListener){//DOM
                    object.addEventListener(eventType,fnHandler,false);
                }else if(object.attachEvent){//IE
                    object.attachEvent("on"+eventType,fnHandler);
                }else{//others
                    object["on"+eventType]=fnHandler;
                }
            };

            function removeEventHandler(object,eventType,fnHandler){
                if(object.removeEventListener){//DOM
                    object.removeEventListener(eventType,fnHandler,false);
                }else if(object.detachEvent){//IE
                    object.detachEvent("on"+eventType,fnHandler);
                }else{//others
                    object["on"+eventType]=null;
                }
            };

            addEventListener(oDiv,"click",function(){
                alert("clicked");
            });
           

(3)事件對象定位(擷取)

IE:事件對象是window對象的一個屬性event,event隻能在事件發生時通路,事件處理函數執行完畢,事件對象被銷毀。

DOM:event對象必須作為唯一的參數傳遞給事件處理函數,且必須為第一個參數。

(4)擷取目标(target)

IE:var oTarget=oEvent.srcElement;

DOM:var oTarget=oEvent.target;

(5)阻止事件預設行為

IE:oEvent.returnValue=false;

DOM:oEvent.preventDefault();

//屏蔽網頁右鍵菜單
            document.body.oncontextmenu=function(oEvent){
                if(document.all){
                    oEvent=window.event;
                    oEvent.returnValue=false;
                }else{
                    oEvent.preventDefault();
                }
            }
           

(6)停止事件複制(冒泡)

IE:oEvent.cancelBubble=true;

DOM:oEvent.stopPropagation();

(7)this問題:IE6-8中當方法執行的時候,方法中的this不是目前的元素box,而是window。