JS面試題及答案

瓜瓜東西發表於2014-12-26
一、JS閉包。
f = function() {return true;};   
g = function() {return false;};   
(function() {   
   if (g() && [] == ![]) {   
      f = function f() {return false;};   
      function g() {return true;}   
   }   
})();   
alert(f()); // true or false ?  
------------------------ 
答案: 
(function() {     
   if (g() && [] == ![]) {     
//應該看成if((g() && [] )== ![])   
//因為g()是false後面那個&&[]就沒起作用 整個都是false    
//![]也是false 所以if成立 進入if塊內   
      f = function f() {return false;};     
//重新定義f    
      function g() {return true;}     
//這句沒用   
   }     
})();    
alert(f());   
//false  

二、擷取字串abcdefg的efg 
abcdefg 
    <script type="text/javascript"> 
  var mytext=document.getElementByIdx_x_x("text"); 
  var myvalue=mytext.innerHTML; 
  var jiequ=myvalue.substring(myvalue.length-3,myvalue.length); 
  alert(jiequ) 
</script> 

三、寫出一下運算結果 
alert(typeof(null))  // object 
alert(typeof(undefined))  // undefined 
alert(typeof(NaN))  // number 
alert(NaN==undefined)  // false 
alert(NaN==NaN)  // false 
var str="123abc"; 
alert(typeof(str++)) // number 
alert(str) // NaN
四、寫出函式DateDemo的返回結果,系統時間假定為今天 
function DateDemo(){ 
var d, s="今天日期是:"; 
d = new Date(); 
s += d.getMonth() + "/"; 
s += d.getDate() + "/"; 
s += d.getYear(); 
return s; 


結果:今天日期是:7/17/2010 

五、寫出程式執行的結果? 
for(i=0, j=0; i<10, j<6; i++, j++){ 
k = i + j; 

結果:10(小心陷阱)


var str= "aaaebbbcccddd";
str = str.replace(/(.)\1+/g,'$1')

alert(str)

2.把字串中所有單詞的首字母都轉換為大寫
name = 'aaa bbb ccc'; uw=name.replace(/\b\w+\b/g, function(word){ return word.substring(0,1).toUpperCase()+word.substring(1);} );
alert(uw)


1.以下哪個在JAVASCRIPT中會報錯: 
var a=(); 
var a=[]; 
var a={}; 
var a=//; 
2.JAVA中有哪些保留字,越多越好,10個以上. 
3.CSS中有幾種宣告方式. 
4.寫出你所知道的開源專案或軟體,並說明他們的好處以及作用. 
最佳答案 
1,var a=();var a=//; 報錯     兩個不行!  ---------------------------------  2,JAVA!  int  char  while  for  do  switch  void  double  float  unsigned  long  try  abstract   super  extent  bool  break  case  catch  class  delegate foreach in   static  void  public private protected internal  等等  太多了  3,    這題有點不知道怎麼答,到底宣告是什麼意思?  是宣告一個已經存在一個CSS有三種:    1.匯入一個已經存在的CSS檔案  <link rel="stylesheet" type="text/css" href="">    2.直接在HARD裡宣告一個CSS程式碼段:  <style type="text/css">       .....  </style>    3.直接在網頁元素裡宣告使用CSS:  style="color:red;"    如果是宣告CSS類 , 則有三種:  直接標籤名作為CSS類名稱:  TagName{ ... }  以元素ID作為CSS類宣告:    #ID{...}  自定義CSS類名稱 :         .ClassName{}    --------------------------------------------------------------  4,開源的    客戶端指令碼的話就說說 ExtJS    她可以用來開發RIA也即富客戶端的AJAX應用,是一個用javascript寫的,主要用於建立前端使用者介面,是一個與後臺技術無關的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各種開發語言開發的應 用中。  而且,使用這個框架可以直接用一行程式碼實現非常漂亮的而且標準的網頁控制元件介面,可以使用程式碼呼叫的控制元件來替代目前的流行網頁佈局,和WinForm程式一樣,使得前端開發完全控制元件化。  Jquery也是優秀的前臺框架,優點:  程式碼簡練、語義易懂、學習快速、文件豐富。    jQuery是一個輕量級的指令碼,其程式碼非常小巧,最新版的JavaScript包只有20K左右。    jQuery支援CSS1-CSS3,以及基本的xPath。    jQuery是跨瀏覽器的,它支援的瀏覽器包括IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+。    可以很容易的為jQuery擴充套件其他功能。    能將JS程式碼和HTML程式碼完全分離,便於程式碼和維護和修改。    外掛豐富,除了jQuery本身帶有的一些特效外,可以通過外掛實現更多功能,如表單驗證、tab導航、拖放效果、表格排序、DataGrid,樹形選單、影像特效以及ajax上傳等。     除此之外,還有ProtoType,Bindows(JS框架)   服務,ZedGragh(.Net做統計圖的),Spring,Hibernate,Structs,EJB,Jbmp等比較有名的
網易JS面試題引起的討論 
2012-02-05 23:58 
第一道: 

var tt = 'aa';  
function test(){  
alert(tt);  //underfined; 
var tt = 'dd';  
alert(tt);  //dd 
}  
test();  


第二道: 

var myObject= { 
  num: 2, 
  add: function(){ 
  this.num=3; 
  (function(){ 
  alert(this.num);  //underfined 
  this.num=4; 
  })(); 
alert(this.num)   //3 
  } 


myObject.add(); 


本文主要是講預編譯。 

1. undefined 
當需要判斷一個變數是否為 undefined 時,直接用 
Js程式碼 

  1. alert(om == undefined);   

alert(om == undefined); 


可能出錯。因為 JS 如果引用未宣告的變數,那麼會出現JS錯誤,在上述例子中,如果 om 未曾宣告,就會報 JS 錯誤。因此判斷一個變數是 undefined,最好用這種方法
Js程式碼 

  1. alert( typeof om == 'undefined' );   

alert(typeof om == 'undefined'); 



2. JS 中沒有塊作用域,在函式中宣告的變數在整個函式中都可用(無論是在函式開頭處宣告還是末尾處宣告),如 
Js程式碼 

function() { 
  alert(om); // 顯示 undefined 
  var om = 'abc'; 
  alert(om); // 顯示 abc 
  } 



3. JS 在函式執行前將整個函式的變數進行宣告,無論這個變數的宣告語句有沒有機會執行,如 
Js程式碼 

  1. function () {   
  2. alert(om); // 顯示 undefined   
  3. if ( false ) {   
  4. var om = 'abc' ; // 此處宣告沒有機會執行   
  5. }   
  6. }   

====================================================================== 

今天工作需要,搜尋下JS面試題,看到一個題目,大約是這樣的 
Js程式碼 

<script> 
  var x = 1, y = z = 0; 
  function add(n) { 
  n = n+1; 
  } 

  y = add(x); 
    
  function add(n) { 
  n = n + 3; 
  } 

  z = add(x); 
</script> 



問執行完畢後 x, y, z 的值分別是多少? 

仔細看的人馬上就知道了, x, y 和 z 分別是 1, undefined 和 undefined。 

不過,如果將兩個 add 函式修改一下,題目變為 
Js程式碼 

<script> 
  var x = 1, y = z = 0; 
  function add(n) { 
  return n = n+1; 
  } 

  y = add(x); 
    
  function add(n) { 
  return n = n + 3; 
  } 

  z = add(x); 
</script> 


那麼這時 y 和 z 分別是什麼呢?我馬上想到是 2 和 4,不過結果卻是 4 和 4。 
這說明,在第一次呼叫 add 函式之前,第二個 add 函式已經覆蓋了第一個 add 函式。原來,這是 JS 直譯器的"預編譯",JS 解析器在執行語句前會將函式宣告和變數定義進行"預編譯",而這個"預編譯",並非一個頁面一個頁面地"預編譯",而是一段一段地預編譯,所謂的段就是一個 <script> 塊。且看下面的程式碼
Js程式碼 


<script> 
  function add(n) { 
  return n = n+1; 
  } 
  alert(add(1)); 
</script> 

<script> 
  function add(n) { 
  return n = n+3; 
  } 
  alert(add(1)); 
</script> 



會分別彈出 2 和 4。 

那麼,將上面的題目再變換一下,如下 
Js程式碼 

<script> 
  alert(typeof addA); 
  addA(); 
  function addA() { 
  alert("A executed!"); 
  }; 
</script> 
<script> 
  alert(typeof addB); 
  addB(); 
  var addB = function() { 
  alert("B executed!"); 
  }; 
</script> 



執行結果是什麼呢? 按照前面的知識,第一個 <script> 塊執行正常,結果就是彈出 "function" 和 "A executed!" 的對話方塊。 
那麼第二個 <script> 塊呢? 執行結果是彈出 "undefined" 的對話方塊後報 JS 錯誤,說 addB 不是一個 function。 
有點出乎意料?呵呵,其實第一個 script 塊中的 addA 一句是函式宣告,當然進行了"預編譯",但是第二個 script 塊中的 addB 一句並非函式宣告。只不過在執行這段 <script> 之前對變數進行了"預宣告",因此一開始變數addB是存在的,只不過是 undefined 的(可參看http://eclipse07.javaeye.com/admin/blogs/484566 )。因此執行結果便如上面所示。

將題目再變化下,如下 
Js程式碼 


<script> 
  alert(typeof addB); 
  addB(); 
  var addB = function addB() { 
  alert("B executed!"); 
  }; 
</script> 


執行結果如何呢? 
在 ff 下執行,與上面執行結果一樣。打住,且在 IE6 下執行看看如何。 
結果是彈出 "function" 和 "B executed!",一切正常。 
Google 了一下,有人說這是 IE 的 BUG。 

那麼,請看下面的程式碼 
Js程式碼 

<script> 
  alert(typeof addB); 
  var addB = "variable"; 
  function addB() { 
  alert("function addB"); 
  } 
  alert(addB); 
</script> 


執行結果是"function"和"variable"。 
JS解析器先預定義了 addB 變數為 undefined, 但是 addB 函式覆蓋了此變數,因此一開始執行結果是 function,然後 addB 被賦值為 "variable",因此最後執行結果是 "variable",上面的程式碼即使變為
Js程式碼 

<script> 
  alert(typeof addB); 
  function addB() { 
  alert("function addB"); 
  } 
  var addB = "variable"; 
  alert(addB); 
</script> 


結果也一樣,這說明JS解析器先預宣告變數,再預定義函式 。 
小結一下:JS 在執行前會進行類似"預編譯"的操作,而且先預定義變數再預定義函式。 








1、form中的input有哪些型別?各是做什麼處理使用的? 
2、table標籤中border,cellpadding     td標籤中colspan,rowspan分別起什麼作用? 
3、form中的input可以設定readonly和disable,請問這兩項屬性有什麼區別? 
4、JS中的三種彈出式訊息提醒(警告視窗、確認視窗、資訊輸入視窗)的命令是什麼? 

1、form中的input有哪些型別?各是做什麼處理使用的? 
text   radio   checkbox   file   button   image   submit   reset   hidden 
2、table標籤中border,cellpadding     td標籤中colspan,rowspan分別起什麼作用? 
border邊界 
cellpadding邊距 
colspan跨列數 
rowspan跨行數 
3、form中的input可以設定readonly和disable,請問這兩項屬性有什麼區別? 
readonly不可編輯,但可以選擇和複製 
disable不能編輯複製選擇 
4、JS中的三種彈出式訊息提醒(警告視窗、確認視窗、資訊輸入視窗)的命令是什麼? 
alert 
confirm 
prompt 





var Prize = new Array(); 
Prize[0]="對講機"; 
Prize[1]="5Q幣"; 
Prize[2]="地下城與勇士禮包"; 
Prize[3]="10Q幣"; 
Prize[4]="QQ飛車禮包"; 
Prize[5]="1Q幣"; 
function startLuckDraw(){ 
    //verify(); 
    var number = document.fm.name.value;    
    var xmlhttp=getXMLHttp(); 
    xmlhttp.open("GET","select.php?number="+number,true); 
    xmlhttp.send(); 
    xmlhttp.onreadystatechange=function() 
      { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) 
        { 
            if(xmlhttp.responseText=="1") 
            { 
                alert("一個身份證號碼只能抽一次獎"); 
            } 
            else 
            { 
                start(); 
            } 
        } 
      } 

function start() 

            var t=parseInt(18*Math.random()); 
            if(t==18){t=0} 
            for(var i=0;i<18;i++) 
            { 
                document.getElementById("Prize"+i).className = ""; 
            } 
                document.getElementById("Prize"+t).className="choose"; 
               document.fm.displayBox.value=t; 
               meter=setTimeout("start()",100); 

function endLuckDraw(){ 

    clearTimeout(meter); 
    var x= document.fm.displayBox.value; 
    var number = document.fm.name.value; 
    var request=getXMLHttp(); 

    request.open("GET","add.php?number="+number+"&prize="+Prize[x],true); 
    request.send(); 
    if(Prize[x]!="謝謝參與"){ 
    alert("恭喜您獲得了獎品:"+Prize[x]+"!");} 
    else {alert("謝謝參與!")} 



function getResult(){ 
    var t = document.getElementsByTagName("ul")[0].firstChild; 
    var x = Number(document.getElementById("count").value); 
    var newNode = document.createElement("li"); 
    var request=getXMLHttp(); 
    request.open("GET","select2.php?id="+x,true); 
    request.send(); 
    request.onreadystatechange=function(){ 
    if (request.readyState==4 && request.status==200) 
        { 
            if(request.responseText){ 
            var text = document.createTextNode(request.responseText); 
            newNode.appendChild(text); 
            document.getElementById("number").insertBefore(newNode,t); 
            document.getElementById("count").value=x+1; 
            } 
            //document.getElementById("123").innerHTML = request.responseText;   
        } 
    } 

    function verify(){  
            var phone = document.fm.name.value;  
            var tmp = /^1[3-9]\d{9}$/;     //支援11位手機號碼驗證  
            var flag=tmp.test(phone);  
            if(!flag){  
               alert("手機號輸入不合法");  
               return false;  
               //startLuckDraw();    
            } 
            else { 
                startLuckDraw();    
            }        
    }  
function getXMLHttp(){ 
     var xmlhttp; 
      try { 
             // Mozilla / Safari / IE7 
             xmlhttp = new XMLHttpRequest(); 
      } catch (e) { 
           // IE 
           var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0', 
                                            'MSXML2.XMLHTTP.4.0', 
                                            'MSXML2.XMLHTTP.3.0', 
                                            'MSXML2.XMLHTTP', 
                                            'Microsoft.XMLHTTP' ); 
       var success = false; 
       for (var i=0;i < XMLHTTP_IDS.length && !success; i++) { 
         try { 
             xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]); 
              success = true; 
         } catch (e) {} 
       } 
       if (!success) { 
        throw new Error('Unable to create XMLHttpRequest.'); 
     } 
   } 
   return xmlhttp; 
   } 
//建立建立一個XMLHttpRequest物件  

setInterval("getResult()",5000);

相關文章