js面試問題

一、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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章