好程式設計師Java教程分享JavaScript常見面試題五

好程式設計師IT發表於2019-10-29

  好程式設計師Java 教程分享 JavaScript 常見面試題五

 

  1 、以下程式碼行將輸出什麼到控制檯 ?

 

  console.log("0||1="+(0||1));console.log("1||2="+(1||2));console.log("0&&1="+(0&&1));console.log("1&&2="+(1&&2));

 

  並解釋。

 

  該程式碼將輸出:

 

  0||1=11||2=10&&1=01&&2=2

 

  在JavaScript 中, || && 都是邏輯運算子,用於在從左至右計算時,返回第一個可完全確定的“邏輯值”。

 

  或(||) 運算子。在形如 X||Y 的表示式中,首先計算 X 並將其解釋執行為一個布林值。如果這個布林值 true ,那麼返回 true(1) ,不再計算 Y ,因為“或”的條件已經滿足。如果這個布林值為 false ,那麼我們仍然不能知道 X||Y 是真是假,直到我們計算 Y ,並且也把它解釋執行為一個布林值。

 

  因此,0||1 的計算結果為 true(1) ,同理計算 1||2

 

  與(&&) 運算子。在形如 X&&Y 的表示式中,首先計算 X 並將其解釋執行為一個布林值。如果這個布林值為 false ,那麼返回 false(0) ,不再計算 Y ,因為“與”的條件已經失敗。如果這個布林值為 true ,但是,我們仍然不知道 X&&Y 是真是假,直到我們去計算 Y ,並且也把它解釋執行為一個布林值。

 

  不過,關於&& 運算子有趣的地方在於,當一個表示式計算為“ true ”的時候,那麼就返回表示式本身。這很好,雖然它在邏輯表示式方面計算為“真”,但如果你希望的話也可用於返回該值。這就解釋了為什麼,有些令人奇怪的是, 1&&2 返回 2( 而不是你以為的可能返回 true 1)

 

  2 、執行下面的程式碼時將輸出什麼 ? 請解釋。

 

  console.log(false=='0')console.log(false==='0')

 

  程式碼將輸出:

 

  truefalse

 

  在JavaScript 中,有兩種等式運算子。三個等於運算子 === 的作用類似傳統的等於運算子:如果兩側的表示式有著相同的型別和相同的值,那麼計算結果為 true 。而雙等於運算子,會只強制比較它們的值。因此,總體上而言,使用 === 而不是 == 的做法更好。 !==vs!= 亦是同理。

 

  3 、以下程式碼將輸出什麼 ? 並解釋你的答案。

 

  vara={},

 

  b={key:'b'},c={key:'c'};

 

  a=123;

 

  a[c]=456;

 

  console.log(a);

 

  這段程式碼將輸出456( 而不是 123)

 

  原因為:當設定物件屬性時,JavaScript 會暗中字串化引數值。在這種情況下,由於 b c 都是物件,因此它們都將被轉換為 "[objectObject]" 。結果就是, a a[c] 均相當於 a["[objectObject]"] ,並可以互換使用。因此,設定或引用 a[c] 和設定或引用 a 完全相同。

 

  4 、以下程式碼行將輸出什麼到控制檯 ?

 

  console.log((functionf(n){return((n>1)?n*f(n-1):n)})(10));

 

  並解釋你的答案。

 

  程式碼將輸出10! 的值 ( 10! 3628800)

 

  原因是:

 

  命名函式f() 遞迴地呼叫本身,當呼叫 f(1) 的時候,只簡單地返回 1 。下面就是它的呼叫過程:

 

  f(1):returnsn,whichis1f(2):returns2*f(1),whichis2f(3):returns3*f(2),whichis6f(4):returns4*f(3),whichis24f(5):returns5*f(4),whichis120f(6):returns6*f(5),whichis720f(7):returns7*f(6),whichis5040f(8):returns8*f(7),whichis40320f(9):returns9*f(8),whichis362880f(10):returns10*f(9),whichis3628800

 

  5 、請看下面的程式碼段。控制檯將輸出什麼,為什麼 ?

 

  (function(x){return(function(y){console.log(x);

 

  })(2)

 

  })(1);

 

  控制檯將輸出1 ,即使從來沒有在函式內部設定過 x 的值。原因是:

 

  閉包是一個函式,連同在閉包建立的時候,其範圍內的所有變數或函式一起。在JavaScript 中,閉包是作為一個“內部函式”實施的:即,另一個函式主體內定義的函式。閉包的一個重要特徵是,內部函式仍然有權訪問外部函式的變數。

 

  因此,在本例中,由於x 未在函式內部中定義,因此在外部函式範圍中搜尋定義的變數 x ,且被發現具有 1 的值。

 

  6 、下面的程式碼將輸出什麼到控制檯,為什麼:

 

  varhero={

 

  _name:'JohnDoe',

 

  getSecretIdentity:function(){returnthis._name;

 

  }

 

  };varstoleSecretIdentity=hero.getSecretIdentity;console.log(stoleSecretIdentity());console.log(hero.getSecretIdentity());

 

  程式碼有什麼問題,以及應該如何修復。

 

  程式碼將輸出:

 

  undefinedJohnDoe

 

  第一個console.log 之所以輸出 undefined ,是因為我們正在從 hero 物件提取方法,所以呼叫了全域性上下文中 ( 即視窗物件 ) stoleSecretIdentity() ,而在此全域性上下文中, _name 屬性不存在。

 

  其中一種修復stoleSecretIdentity() 函式的方法如下:

 

  varstoleSecretIdentity=hero.getSecretIdentity.bind(hero);

 

  7 、建立一個給定頁面上的一個 DOM 元素,就會去訪問元素本身及其所有子元素 ( 不只是它的直接子元素 ) 的函式。對於每個被訪問的元素,函式應該傳遞元素到提供的回撥函式。

 

  此函式的引數為:

 

  DOM 元素

 

  回撥函式( DOM 元素作為其引數 )

 

  訪問樹(DOM) 的所有元素是經典的深度優先搜尋演算法應用。下面是一個示範的解決方案:

 

  functionTraverse(p_element,p_callback){

 

  p_callback(p_element);varlist=p_element.children;for(vari=0;i<list.length;i++){

 

  Traverse(list,p_callback);//recursivecall

 

  }

 

  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2661749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章