好程式設計師Java教程分享JavaScript常見面試題二
好程式設計師Java 教程分享JavaScript 常見面試題二:1. 在 JavaScript 原始檔的開頭包含 use strict 有什麼意義和好處 ?
對於這個問題,既簡要又最重要的答案是,use strict 是一種在 JavaScript 程式碼執行時自動實行更嚴格解析和錯誤處理的方法。那些被忽略或默默失敗了的程式碼錯誤,會產生錯誤或丟擲異常。通常而言,這是一個很好的做法。
嚴格模式的一些主要優點包括:
使除錯更加容易。那些被忽略或默默失敗了的程式碼錯誤,會產生錯誤或丟擲異常,因此儘早提醒你程式碼中的問題,你才能更快地指引到它們的原始碼。
防止意外的全域性變數。如果沒有嚴格模式,將值分配給一個未宣告的變數會自動建立該名稱的全域性變數。這是JavaScript 中最常見的錯誤之一。在嚴格模式下,這樣做的話會丟擲錯誤。
消除 this 強制。如果沒有嚴格模式,引用 null 或未定義的值到 this 值會自動強制到全域性變數。這可能會導致許多令人頭痛的問題和讓人恨不得拔自己頭髮的 bug 。在嚴格模式下,引用 null 或未定義的 this 值會丟擲錯誤。
不允許重複的屬性名稱或引數值。當檢測到物件( 例如, var object = {foo: "bar", foo: "baz"};) 中重複命名的屬性,或檢測到函式中 ( 例如, function foo(val1, val2, val1){}) 重複命名的引數時,嚴格模式會丟擲錯誤,因此捕捉幾乎可以肯定是程式碼中的 bug 可以避免浪費大量的跟蹤時間。
使eval() 更安全。在嚴格模式和非嚴格模式下, eval() 的行為方式有所不同。最顯而易見的是,在嚴格模式下,變數和宣告在 eval() 語句內部的函式不會在包含範圍內建立 ( 它們會在非嚴格模式下的包含範圍中被建立,這也是一個常見的問題源 ) 。
在 delete 使用無效時丟擲錯誤。 delete 運算子 ( 用於從物件中刪除屬性 ) 不能用在物件不可配置的屬性上。當試圖刪除一個不可配置的屬性時,非嚴格程式碼將默默地失敗,而嚴格模式將在這樣的情況下丟擲異常。
2. 考慮以下兩個函式。它們會返回相同的東西嗎 ? 為什麼相同或為什麼不相同 ?
function foo1(){ return {
bar: "hello"
};
}function foo2(){ return
{
bar: "hello"
};
}
出人意料的是,這兩個函式返回的內容並不相同。更確切地說是:
console.log("foo1 returns:");console.log(foo1());console.log("foo2 returns:");console.log(foo2());
將產生:
foo1 returns:Object {bar: "hello"}foo2 returns:undefined
這不僅是令人驚訝,而且特別讓人困惑的是, foo2() 返回 undefined 卻沒有任何錯誤丟擲。
原因與這樣一個事實有關,即分號在JavaScript 中是一個可選項 ( 儘管省略它們通常是非常糟糕的形式 ) 。其結果就是,當碰到 foo2() 中包含 return 語句的程式碼行 ( 程式碼行上沒有其他任何程式碼 ) ,分號會立即自動插入到返回語句之後。
也不會丟擲錯誤,因為程式碼的其餘部分是完全有效的,即使它沒有得到呼叫或做任何事情( 相當於它就是是一個未使用的程式碼塊,定義了等同於字串 "hello" 的屬性 bar) 。
這種行為也支援放置左括號於JavaScript 程式碼行的末尾,而不是新程式碼行開頭的約定。正如這裡所示,這不僅僅只是 JavaScript 中的一個風格偏好。
3. NaN 是什麼 ? 它的型別是什麼 ? 你如何可靠地測試一個值是否等於 NaN ?
NaN 屬性代表一個“不是數字”的值。這個特殊的值是因為運算不能執行而導致的,不能執行的原因要麼是因為其中的運算物件之一非數字 ( 例如, "abc" / 4) ,要麼是因為運算的結果非數字 ( 例如,除數為零 ) 。
雖然這看上去很簡單,但 NaN 有一些令人驚訝的特點,如果你不知道它們的話,可能會導致令人頭痛的 bug 。
首先,雖然 NaN 意味著“不是數字”,但是它的型別,不管你信不信,是 Number :
console.log(typeof NaN === "number"); // logs "true"
此外, NaN 和任何東西比較——甚至是它自己本身 ! ——結果是 false :
console.log(NaN === NaN); // logs "false"
一種半可靠的方法來測試一個數字是否等於 NaN ,是使用內建函式 isNaN() ,但即使使用 isNaN() 依然並非是一個完美的解決方案。
一個更好的解決辦法是使用 value !== value ,如果值等於 NaN ,只會產生 true 。另外, ES6 提供了一個新的 Number.isNaN() 函式,這是一個不同的函式,並且比老的全域性 isNaN() 函式更可靠。
4. 下列程式碼將輸出什麼 ? 並解釋原因。
console.log(0.1 + 0.2);console.log(0.1 + 0.2 == 0.3);
一個稍微有點程式設計基礎的回答是:“你不能確定。可能會輸出“ 0.3 ”和“ true ”,也可能不會。 JavaScript 中的數字和浮點精度的處理相同,因此,可能不會總是產生預期的結果。“
以上所提供的例子就是一個演示了這個問題的典型例子。但出人意料的是,它會輸出:
0.30000000000000004false
5. 討論寫函式 isInteger(x) 的可能方法,用於確定 x 是否是整數。
這可能聽起來是小菜一碟,但事實上,這很瑣碎,因為ECMAScript 6 引入了一個新的正以此為目的 Number.isInteger() 函式。然而,之前的 ECMAScript 6 ,會更復雜一點,因為沒有提供類似的 Number.isInteger() 方法。
問題是,在ECMAScript 規格說明中,整數只概念上存在:即,數字值總是儲存為浮點值。
考慮到這一點,最簡單又最乾淨的ECMAScript6 之前的解決方法 ( 同時也非常穩健地返回 false ,即使一個非數字的值,如字串或 null ,被傳遞給函式 ) 如下:
function isInteger(x) { return (x^0) === x; }
下面的解決方法也是可行的,雖然不如上面那個方法優雅:
function isInteger(x) { return Math.round(x) === x; }
請注意 Math.ceil() 和 Math.floor() 在上面的實現中等同於 Math.round() 。
或:
function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0);
相當普遍的一個不正確的解決方案是:
function isInteger(x) { return parseInt(x, 10) === x; }
雖然這個以 parseInt 函式為基礎的方法在 x 取許多值時都能工作良好,但一旦 x 取值相當大的時候,就會無法正常工作。問題在於 parseInt() 在解析數字之前強制其第一個引數到字串。因此,一旦數目變得足夠大,它的字串就會表達為指數形式 ( 例如, 1e+21) 。因此, parseInt() 函式就會去解析 1e+21 ,但當到達 e 字串的時候,就會停止解析,因此只會返回值 1 。注意:
> String(1000000000000000000000)'1e+21'> parseInt(1000000000000000000000, 10)1> parseInt(1000000000000000000000, 10) === 1000000000000000000000false
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2661619/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java教程分享JavaScript常見面試題五程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題四程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題三程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題一程式設計師JavaScript面試題
- 好程式設計師Java教程分享XML常見面試題程式設計師JavaXML面試題
- 好程式設計師Java教程分享:Java工程師常見面試題程式設計師Java工程師面試題
- 好程式設計師Java教程分享Java面試常見技術難題程式設計師Java面試
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- 好程式設計師Java教程分享Java多執行緒常見面試題程式設計師Java執行緒面試題
- 好程式設計師web前端教程分享Jquery常見面試題程式設計師Web前端jQuery面試題
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 好程式設計師Python教程分享Python常見面試問題程式設計師Python面試
- 好程式設計師Python教程分享常見的Python面試題程式設計師Python面試題
- 好程式設計師web前端教程分享HTML/CSS部分常見面試題程式設計師Web前端HTMLCSS面試題
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題二程式設計師Linux面試
- 好程式設計師web前端教程分享JavaScript面試題程式設計師Web前端JavaScript面試題
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師web前端分享HTML5常見面試題集錦二程式設計師Web前端HTML面試題
- 好程式設計師Java培訓分享Java多執行緒常見面試問題程式設計師Java執行緒面試
- 好程式設計師分享Java常見面試題Tomcat最佳化經驗程式設計師Java面試題Tomcat
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題一程式設計師Linux面試
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題三程式設計師Linux面試
- Java程式設計師面試常見問題Java程式設計師面試
- 好程式設計師Java教程分享Java實習生面試題集錦程式設計師Java面試題
- 好程式設計師Java教程分享經典Java main方法面試題程式設計師JavaAI面試題
- 好程式設計師Java教程分享jsp相關面試題程式設計師JavaJS面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師web前端教程分享常見基礎面試題之效能最佳化程式設計師Web前端面試題
- 好程式設計師web前端教程分享前端javascript練習題二程式設計師Web前端JavaScript
- 好程式設計師web前端教程分享前端 javascript 練習題二程式設計師Web前端JavaScript
- 好程式設計師分享JavaScript中8個常見的陷阱程式設計師JavaScript
- 好程式設計師Java教程分享Java中經常出現的問題程式設計師Java
- 好程式設計師Java分享Javamain十個面試題程式設計師JavaAI面試題
- 好程式設計師web前端分享HTML5常見面試題集錦五程式設計師Web前端HTML面試題
- 好程式設計師web前端分享HTML5常見面試題集錦四程式設計師Web前端HTML面試題
- 好程式設計師web前端分享HTML5常見面試題集錦三程式設計師Web前端HTML面試題