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 并將其解釋執(zhí)行為一個布爾值。如果這個布爾值true,那么返回true(1),不再計算 Y,因為“或”的條件已經(jīng)滿足。如果這個布爾值為false,那么我們?nèi)匀徊荒苤?X||Y是真是假,直到我們計算 Y,并且也把它解釋執(zhí)行為一個布爾值。 因此, 0 || 1 的計算結果為true(1),同理計算1 || 2。 與( &&)運算符。在形如 X&&Y的表達式中,首先計算 X并將其解釋執(zhí)行為一個布爾值。如果這個布爾值為 false,那么返回 false(0),不再計算 Y,因為“與”的條件已經(jīng)失敗。如果這個布爾值為true,但是,我們?nèi)匀徊恢?X&&Y 是真是假,直到我們?nèi)ビ嬎?Y,并且也把它解釋執(zhí)行為一個布爾值。 不過,關于 &&運算符有趣的地方在于,當一個表達式計算為“true”的時候,那么就返回表達式本身。這很好,雖然它在邏輯表達式方面計算為“真”,但如果你希望的話也可用于返回該值。這就解釋了為什么,有些令人奇怪的是, 1 && 2返回 2(而不是你以為的可能返回 true 或 1)。 2、執(zhí)行下面的代碼時將輸出什么?請解釋。 console.log(false == '0')console.log(false === '0') 代碼將輸出: truefalse 在JavaScript中,有兩種等式運算符。三個等于運算符 === 的作用類似傳統(tǒng)的等于運算符:如果兩側的表達式有著相同的類型和相同的值,那么計算結果為true。而雙等于運算符,會只強制比較它們的值。因此,總體上而言,使用 ===而不是 ==的做法更好。 !==vs !=亦是同理。 3、以下代碼將輸出什么?并解釋你的答案。 var a={}, b={key:'b'}, c={key:'c'}; a[b]=123; a[c]=456; console.log(a[b]); 這段代碼將輸出 456(而不是 123)。 原因為:當設置對象屬性時,JavaScript會暗中字符串化參數(shù)值。在這種情況下,由于 b 和 c都是對象,因此它們都將被轉(zhuǎn)換為"[object Object]"。結果就是, a[b]和a[c]均相當于a["[object Object]"] ,并可以互換使用。因此,設置或引用 a[c]和設置或引用 a[b]完全相同。 4、以下代碼行將輸出什么到控制臺? console.log((function f(n){return ((n > 1) ? n * f(n-1) : n)})(10)); 并解釋你的答案。 代碼將輸出10!的值(即10!或3628800)。 原因是: 命名函數(shù) f()遞歸地調(diào)用本身,當調(diào)用 f(1)的時候,只簡單地返回1。下面就是它的調(diào)用過程: f(1): returns n, which is 1f(2): returns 2 * f(1), which is 2f(3): returns 3 * f(2), which is 6f(4): returns 4 * f(3), which is 24f(5): returns 5 * f(4), which is 120f(6): returns 6 * f(5), which is 720f(7): returns 7 * f(6), which is 5040f(8): returns 8 * f(7), which is 40320f(9): returns 9 * f(8), which is 362880f(10): returns 10 * f(9), which is 3628800 5、請看下面的代碼段??刂婆_將輸出什么,為什么? (function(x) { return (function(y) { console.log(x); })(2) })(1); 控制臺將輸出 1,即使從來沒有在函數(shù)內(nèi)部設置過x的值。原因是: 閉包是一個函數(shù),連同在閉包創(chuàng)建的時候,其范圍內(nèi)的所有變量或函數(shù)一起。在JavaScript中,閉包是作為一個“內(nèi)部函數(shù)”實施的:即,另一個函數(shù)主體內(nèi)定義的函數(shù)。閉包的一個重要特征是,內(nèi)部函數(shù)仍然有權訪問外部函數(shù)的變量。 因此,在本例中,由于 x未在函數(shù)內(nèi)部中定義,因此在外部函數(shù)范圍中搜索定義的變量 x,且被發(fā)現(xiàn)具有1的值。 6、下面的代碼將輸出什么到控制臺,為什么: var hero = { _name: 'John Doe', getSecretIdentity: function (){ return this._name; } }; var stoleSecretIdentity = hero.getSecretIdentity;console.log(stoleSecretIdentity());console.log(hero.getSecretIdentity()); 代碼有什么問題,以及應該如何修復。 代碼將輸出: undefinedJohn Doe 第一個 console.log之所以輸出 undefined,是因為我們正在從 hero對象提取方法,所以調(diào)用了全局上下文中(即窗口對象)的 stoleSecretIdentity(),而在此全局上下文中, _name屬性不存在。 其中一種修復stoleSecretIdentity() 函數(shù)的方法如下: var stoleSecretIdentity = hero.getSecretIdentity.bind(hero); 7、創(chuàng)建一個給定頁面上的一個DOM元素,就會去訪問元素本身及其所有子元素(不只是它的直接子元素)的函數(shù)。對于每個被訪問的元素,函數(shù)應該傳遞元素到提供的回調(diào)函數(shù)。 此函數(shù)的參數(shù)為: DOM元素 回調(diào)函數(shù)(將DOM元素作為其參數(shù)) 訪問樹(DOM)的所有元素是經(jīng)典的深度優(yōu)先搜索算法應用。下面是一個示范的解決方案: function Traverse(p_element,p_callback) { p_callback(p_element); var list = p_element.children; for (var i = 0; i < list.length; i++) { Traverse(list[i],p_callback); // recursive call } } |
|
來自: 好程序員IT > 《Java培訓教程》