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