好程序員Java教程分享JavaScript常見面試題五

  好程序員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));算法

 

  並解釋。閉包

 

  該代碼將輸出:ide

 

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

 

  在JavaScript中,||&&都是邏輯運算符,用於在從左至右計算時,返回第一個可徹底肯定的「邏輯值」。this

 

  或(||)運算符。在形如X||Y的表達式中,首先計算X並將其解釋執行爲一個布爾值。若是這個布爾值true,那麼返回true(1),再也不計算Y,由於「或」的條件已經知足。若是這個布爾值爲false,那麼咱們仍然不能知道X||Y是真是假,直到咱們計算Y,而且也把它解釋執行爲一個布爾值。spa

 

  所以,0||1的計算結果爲true(1),同理計算1||2orm

 

  與(&&)運算符。在形如X&&Y的表達式中,首先計算X並將其解釋執行爲一個布爾值。若是這個布爾值爲false,那麼返回false(0),再也不計算Y,由於「與」的條件已經失敗。若是這個布爾值爲true,可是,咱們仍然不知道X&&Y是真是假,直到咱們去計算Y,而且也把它解釋執行爲一個布爾值。對象

 

  不過,關於&&運算符有趣的地方在於,當一個表達式計算爲「true」的時候,那麼就返回表達式自己。這很好,雖然它在邏輯表達式方面計算爲「真」,但若是你但願的話也可用於返回該值。這就解釋了爲何,有些使人奇怪的是,1&&2返回2(而不是你覺得的可能返回true1)

 

  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會暗中字符串化參數值。在這種狀況下,因爲bc都是對象,所以它們都將被轉換爲"[objectObject]"。結果就是,aa[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

 

  }

 

}

相關文章
相關標籤/搜索