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題。
掃描二維碼,長白山土特產