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));

  並解釋。

  該代碼將輸出:

  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):returns2f(1),whichis2f(3):returns3f(2),whichis6f(4):returns4f(3),whichis24f(5):returns5f(4),whichis120f(6):returns6f(5),whichis720f(7):returns7f(6),whichis5040f(8):returns8f(7),whichis40320f(9):returns9f(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

  Traverse(list,p_callback);//recursivecall

  }

  }

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