1. 程式人生 > >前端javaScript經典面試題

前端javaScript經典面試題

new 可能 spa 設置 沒有 sco test 問題 輸出結果

1.alert(1&&2),alert(1||0)

alert(1&&2)的結果是2

只要“&&”前面是false,無論“&&”後面是true還是false,結果都將返“&&”前面的值;

只要“&&”前面是true,無論“&&”後面是true還是false,結果都將返“&&”後面的值;

這個就是只有前面的為對,才能進行下去,而且必須有個返回值。這裏主要是因為只有前面的為true,才會進行後面的運算,返回的就是後面的值。如果前面的是false,後面的也就沒有意義,直接返回前面的結果。

alert(0||1)的結果是1

只要“||”前面為false,不管“||”後面是true還是false,都返回“||”後面的值。

只要“||”前面為true,不管“||”後面是true還是false,都返回“||”前面的值。

這樣的就是有個對的就行,但是必須有個返回值,前面的為true,就直接返回前面的值,如果前面的為false,就返回後面的值。

2.mouseenter和mouseover的區別

不論鼠標指針穿過被選元素或其子元素,都會觸發 mouseover 事件。對應mouseout

只有在鼠標指針穿過被選元素時,才會觸發 mouseenter 事件。對應mouseleave

因此在定義鼠標位置使用mouseover的時候會出現常見的冒泡現象。

阻止冒泡的方法

W3C: 事件對象.stoppropogation(),

IE: 事件對象.cancelBubble=true;

3、正則表達式

用正則表達式匹配字符串,以字母開頭,後面是數字、字符串或者下劃線,長度為9-20

var reg=new RegExp("^[a-zA-Z][a-zA-Z0-9_]{9,20}$");

正則表達式分析身份證號碼

身份證號碼 = 6位地址編碼 + 8位出生日期 + 4位順序號

例如:出生日期在1800-2099之間的人的身份證號碼的出生日期部分的正則

(18|19|20){0,1}\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01]);
        (18|19|20){0,1}\d{2}  確定年份,
        (18|19|20){0,1}       確定年份的前兩位  (18|19|20)中匹配,{0,1}表示匹配前一項至少0次最多一次
        \d{2}                 確定年份的後兩位 \d表示匹配[0-9]中的任何一個數,匹配兩次
        
        (0[1-9]|1[012])       確定月份,
        0[1-9]                匹配01月-09月,首位是0,在1-9中選一位
        1[012]                匹配10月-12月,首位是1,在[012]中選一位
        
        0[1-9]|[12]\d|3[01]   確定日期
        0[1-9]                確定01日-09日
        [12]\d                確定10日-29日
        3[01]                 確定30號-31號

正則表達式不能含有特殊字符

var reg=new RegExp("^[\u4E00-\u9FA5a-zA-Z0-9_]{1,20}$");

reg.test("要檢測的字符串");

test是reg的一個方法符合條件是true,不符合條件返回false

4、數據存儲

數據存儲的幾種方式

cookie在客戶端存儲數據並發送給服務端,用來存儲,獲取、刪除,要設置過期時間,否則瀏覽器關閉時過期、但是只能存儲字符串類型,以文本的形式,

localStorage:存儲在本地不會發送到服務器,無時間限制,除非手動刪除,但是只有新的瀏覽器才支持。

session通過類似哈希表的數據結構來存儲,能支持任何類型的數據對象,能夠含有多個對象,沒有大小控制,安全性較高,保存在服務器,隨著保存東西的增多,對於用戶較多的網站,服務器的壓力會變大。

cookie的存取

存:

       var expireDate = new Date();

         expireDate.setYear(expireDate.getYear()+1900+1);

         $cookies.put(‘account‘,data.user,{‘expires‘:expireDate.toUTCString()});

取:

 $scope.user = $cookies.get(‘account‘);

LocalStorage的存取

存:

localStorage.setItem(“name”,”星星”);

取:

     var username =  localStorage.getItem(“name”);


session的存取

存:

 sessionStorage.setItem("cardId",keyCardId);

取:

 var cardId = sessionStorage.getItem("cardId");

5、有關作用域和異常捕獲

分析下面代碼的輸出結果

1、

if(true){
   var a = 1;
}
cosole.log(a);

這種情況打印出來是1,因為定義變量在沒有函數名稱包圍的時候,javascript相當於一個大的函數,在if中定義的變量相當於全局變量。

2、

function aaa(){
  var a = 1;
  console.log(a);
}
console.log(a);
aaa();

這種情況打印的是‘‘a未定義‘‘,函數aaa()不再執行,因為上面的報錯會影響下面函數的執行。

3、如何讓報錯不影響呢,我們可以用try catch

function aaa(){
var a = 1;
console.log(a);
}
try{
   console.log(a);
}catch(e){
}
aaa();

使用try catch把可能出錯的console.log(a)包裹起來,這樣在這段出問題的時候就不會影響後面的函數的執行。
4、看trycatch是如何打印出來的

try{
   console.log(a);
}catch(e){
    console.log(e);
}

這樣就可以看到問題具體出在哪裏了,而且不會影響後續函數的執行。打印結果如下:

[object Error]{description: "“a”未定義", message: "“a”未定義", name: "ReferenceEr...", number: -2146823279, stack: "ReferenceEr..."}

前端javaScript經典面試題