你有必要知道的一些JavaScript 面試題(中)

9.實現函數 isInteger(x) 來判斷 x 是否是整數

可以將 x 轉換成10進制,判斷和本身是不是相等即可:

function isInteger(x) { 
    return parseInt(x, 10) === x; 
}

ES6 對數值進行了擴展,提供了靜態方法 isInteger() 來判斷參數是否是整數:

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false

JavaScript能夠準確表示的整數範圍在 -2^53 到 2^53 之間(不含兩個端點),超過這個範圍,無法精確表示這個值。ES6 引入了Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER這兩個常量,用來表示這個範圍的上下限,並提供了 Number.isSafeInteger() 來判斷整數是否是安全型整數。

10.在下面的代碼中,數字 1-4 會以什麼順序輸出?爲什麼會這樣輸出?

(function() {
    console.log(1); 
    setTimeout(function(){console.log(2)}, 1000); 
    setTimeout(function(){console.log(3)}, 0); 
    console.log(4);
})();

這個就不多解釋了,主要是 JavaScript 的定時機制和時間循環,不要忘了,JavaScript 是單線程的。詳解可以參考 從setTimeout談JavaScript運行機制。

11.寫一個少於 80 字符的函數,判斷一個字符串是不是迴文字符串

function isPalindrome(str) {
    str = str.replace(/\W/g, '').toLowerCase();
    return (str == str.split('').reverse().join(''));
}

這個題我在 codewars 上碰到過,並收錄了一些不錯的解決方式,可以戳這裏:Palindrome For Your Dome

12.寫一個按照下面方式調用都能正常工作的 sum 方法

console.log(sum(2,3));   // Outputs 5
console.log(sum(2)(3));  // Outputs 5

針對這個題,可以判斷參數個數來實現:

function sum() {
  var fir = arguments[0];
  if(arguments.length === 2) {
    return arguments[0] + arguments[1]
  } else {
    return function(sec) {
       return fir + sec;
    }
  }
 
}

13.根據下面的代碼片段回答後面的問題

for (var i = 0; i < 5; i++) {
  var btn = document.createElement('button');
  btn.appendChild(document.createTextNode('Button ' + i));
  btn.addEventListener('click', function(){ console.log(i); });
  document.body.appendChild(btn);
}

1、點擊 Button 4,會在控制檯輸出什麼? 
2、給出一種符合預期的實現方式

1、點擊5個按鈕中的任意一個,都是輸出5 
2、參考 IIFE。

14.下面的代碼會輸出什麼?爲什麼?

var arr1 = "john".split(''); j o h n
var arr2 = arr1.reverse(); n h o j
var arr3 = "jones".split(''); j o n e s
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
會輸出什麼呢?你運行下就知道了,可能會在你的意料之外。

MDN 上對於 reverse() 的描述是醬紫的:

Description 
The reverse method transposes the elements of the calling array object in place, mutating the array, and returning a reference to the array.

reverse() 會改變數組本身,並返回原數組的引用。

slice 的用法請參考:slice

15.下面的代碼會輸出什麼?爲什麼?

console.log(1 +  "2" + "2");
console.log(1 +  +"2" + "2");
console.log(1 +  -"1" + "2");
console.log(+"1" +  "1" + "2");
console.log( "A" - "B" + "2");
console.log( "A" - "B" + 2);

輸出什麼,自己去運行吧,需要注意三個點:

  • 多個數字和數字字符串混合運算時,跟操作數的位置有關

console.log(2 + 1 + '3'); / /‘33’
console.log('3' + 2 + 1); //'321'
  • 數字字符串之前存在數字中的正負號(+/-)時,會被轉換成數字

console.log(typeof '3');   // string
console.log(typeof +'3');  //number

同樣,可以在數字前添加 ”,將數字轉爲字符串

console.log(typeof 3);   // number
console.log(typeof (''+3));  //string
  • 對於運算結果不能轉換成數字的,將返回 NaN

console.log('a' * 'sd');   //NaN
console.log('A' - 'B');  // NaN

這張圖是運算轉換的規則

16.如果 list 很大,下面的這段遞歸代碼會造成堆棧溢出。如果在不改變遞歸模式的前提下修善這段代碼?

var list = readHugeList();
 
var nextListItem = function() {
    var item = list.pop();
 
    if (item) {
        // process the list item...
        nextListItem();
    }
};

原文上的解決方式是加個定時器:

var list = readHugeList();
 
var nextListItem = function() {
    var item = list.pop();
 
    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

解決方式的原理請參考第10題。

掃描二維碼,長白山土特產

wKioL1is2sWT_zy1AAH4lkqQ0cE920.png

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