1. 程式人生 > >常見的關於JavaScript 面試題(中)

常見的關於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{

returnfunction(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(typeof3);// 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題。