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

  好程序員Java教程分享JavaScript常見面試題二:1.JavaScript源文件的開頭包含 use strict 有什麼意義和好處?程序員

  對於這個問題,既簡要又最重要的答案是,use strict 是一種在JavaScript代碼運行時自動實行更嚴格解析和錯誤處理的方法。那些被忽略或默默失敗了的代碼錯誤,會產生錯誤或拋出異常。一般而言,這是一個很好的作法。面試

  嚴格模式的一些主要優勢包括:編程

  使調試更加容易。那些被忽略或默默失敗了的代碼錯誤,會產生錯誤或拋出異常,所以儘早提醒你代碼中的問題,你才能更快地指引到它們的源代碼。安全

  防止意外的全局變量。若是沒有嚴格模式,將值分配給一個未聲明的變量會自動建立該名稱的全局變量。這是JavaScript中最多見的錯誤之一。在嚴格模式下,這樣作的話會拋出錯誤。ide

  消除 this 強制。若是沒有嚴格模式,引用null或未定義的值到 this 值會自動強制到全局變量。這可能會致使許多使人頭痛的問題和讓人巴不得拔本身頭髮的bug。在嚴格模式下,引用 null或未定義的 this 值會拋出錯誤。函數

  不容許重複的屬性名稱或參數值。當檢測到對象(例如,var object = {foo: "bar", foo: "baz"};)中重複命名的屬性,或檢測到函數中(例如,function foo(val1, val2, val1){})重複命名的參數時,嚴格模式會拋出錯誤,所以捕捉幾乎能夠確定是代碼中的bug能夠避免浪費大量的跟蹤時間。測試

  使eval() 更安全。在嚴格模式和非嚴格模式下,eval() 的行爲方式有所不一樣。最顯而易見的是,在嚴格模式下,變量和聲明在 eval() 語句內部的函數不會在包含範圍內建立(它們會在非嚴格模式下的包含範圍中被建立,這也是一個常見的問題源)this

   delete使用無效時拋出錯誤。delete操做符(用於從對象中刪除屬性)不能用在對象不可配置的屬性上。當試圖刪除一個不可配置的屬性時,非嚴格代碼將默默地失敗,而嚴格模式將在這樣的狀況下拋出異常。spa

  

  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函數爲基礎的方法在 取許多值時都能工做良好,但一旦 取值至關大的時候,就會沒法正常工做。問題在於 parseInt() 在解析數字以前強制其第一個參數到字符串。所以,一旦數目變得足夠大,它的字符串就會表達爲指數形式(例如, 1e+21)。所以,parseInt() 函數就會去解析 1e+21,但當到達 e字符串的時候,就會中止解析,所以只會返回值 1。注意:

> String(1000000000000000000000)'1e+21'> parseInt(1000000000000000000000, 10)1> parseInt(1000000000000000000000, 10) === 1000000000000000000000false

相關文章
相關標籤/搜索