JS面試題及答案

注:本文轉自http://blog.csdn.net/xuejianwu/article/details/7871932,但對原文中有誤或解釋不明確的地方進行了校正和擴展說明.

一、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(); //假定今天是2010年8月17日
s += d.getMonth() + "/";  //js中的month是從0開始的,所以這個值會比當前實際月份小1
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; 

alert(k);

結果:12(小心陷阱)


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,const final volatile byte int char double float boolean private protected public package export importclass extends  super interface abstract native goto static synchronize throws等 (注意:保留字不完全等同於關鍵字,所以人家既然問你保留字,就不要答關鍵字啦!)

3,    這題有點不知道怎麼答,到底聲明是什麼意思?  是聲明一個已經存在一個CSS有四種:    1.導入一個已經存在的CSS文件  <link rel="stylesheet" type="text/css" href="">    2.直接在HARD裏聲明一個CSS代碼段:  <style type="text/css">       .....  </style>    3.直接在網頁元素裏聲明使用CSS:  style="color:red;"    4.@import方式引入。 如果是聲明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,Jbpm等比較有名的。


網易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指的是window對象!!這也是js語言的一個bug
  this.num=4; //第一次執行後將在window對象中添加num屬性,值爲4
  })(); 
alert(this.num)   //3 
  } 

myObject.add(); //分別彈出undefined和3

myObject.add(); //分別彈出4和3,因爲第二次執行閉包中的alert時,window中已經存在num屬性了,且值爲4



本文主要是講預編譯。 

1. 判定一個變量是否爲undefined 
當需要判斷一個變量是否爲 undefined 時,直接用 alert(om == undefined)可能出錯。因爲 JS 如果引用未聲明的變量,那麼會出現JS錯誤,在上述例子中,如果 om 未曾聲明,就會報 JS 錯誤。因此判斷一個變量是 undefined,最好用這種方法alert( typeof om == 'undefined' );   
2. JS 中沒有塊作用域,在函數中聲明的變量在整個函數中都可用(無論是在函數開頭處聲明還是末尾處聲明),如 
Js代碼 
function() { 
  alert(om); // 顯示 undefined 
  var om = 'abc'; 
  alert(om); // 顯示 abc 

  } 

補充: 此規則並非只針對函數,在全局作用域也一樣,應該理解爲在js作用域中(分爲全局作用域和函數作用域)聲明的變量在該作用域中都可見.

3. JS 在函數執行前將整個函數的變量進行聲明,無論這個變量的聲明語句有沒有機會執行,如Js代碼 

var om = "123" ;

function foo() {   

       alert(om); // 顯示 undefined   
       if ( false ) {   
             var om = 'abc' ; // 此處聲明沒有機會執行   
        }   
 }   
foo(); //undefined
====================================================================== 

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

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

  y = add(x); //y爲undefined,因爲add()並未返回值!!!x仍爲1,因爲是值傳遞
    
  function add(n) { 
  n = n + 3; 
  } 

  z = add(x); //z爲undefined,x爲1,與上面同理,小心陷阱啊!!

</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。 
原因即是 JS 解釋器的"預編譯":JS 解析器在執行語句前會將函數聲明和變量定義進行"預編譯",而這個"預編譯",並非一個頁面一個頁面地"預編譯",而是一段一段地預編譯,所謂的段就是一個 <script> 塊,所以,在第一次調用 add 函數之前,第二個 add 函數的聲明已經覆蓋了第一個 add 函數。且看下面的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。 

那麼,將上面的題目再變換一下,如下 

<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。 

那麼,請看下面的代碼 
<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解析器先預聲明變量,再預定義函數 ,因此上面代碼中變量addB在函數addB之前被預聲明,即使代碼順序上它在後. 
小結一下: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單元格內補白

cellspacing單元格與單元格之間的間距 

colspan跨列數 
rowspan跨行數 
3、form中的input可以設置readonly和disable,請問這兩項屬性有什麼區別? 
readonly不可編輯,但可以選擇和複製 
disable不能編輯複製選擇 
4、JS中的三種彈出式消息提醒(警告窗口、確認窗口、信息輸入窗口)的命令是什麼? 
alert 
confirm 
prompt 

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