來源 :https://github.com/kennymkchan/interview-questions-in-javascript
闡述下 JavaScript 中的變量提升
所謂提升,顧名思義即是 JavaScript 會將所有的聲明提升到當前作用域的頂部。
這也就意味著我們可以在某個變量聲明前就使用該變量,不過雖然 JavaScript 會將聲明提升到頂部,但是並不會執行真的初始化過程。
闡述下 use strict; 的作用
use strict; 顧名思義也就是 JavaScript 會在所謂嚴格模式下執行,其一個主要的優勢在於能夠強制開發者避免使用未聲明的變量。
對於老版本的瀏覽器或者執行引擎則會自動忽略該指令。
"use strict";
catchThemAll();function catchThemAll() { x = 3.14; return x * x;}
什麼是 Event Bubbling 及如何避免
Event Bubbling 即指某個事件不僅會觸發當前元素,還會以嵌套順序傳遞到父元素中。直觀而言就是對於某個子元素的點擊事件同樣會被父元素的點擊事件處理器捕獲。
避免 Event Bubbling 的方式可以使用event.stopPropagation() 或者 IE 9 以下使用event.cancelBubble。
== 與 === 的區別
=== 也就是所謂的嚴格比較,關鍵的區別在於=== 會同時比較類型與值,而不是僅比較值。
0 == false; 0 === false;
2 == '2'; 2 === '2';
null 與 undefined 的區別
JavaScript 中,null 是一個可以被分配的值,設置為 null 的變量意味著其無值。
而 undefined 則代表著某個變量雖然聲明了但是尚未進行過任何賦值。
Prototypal Inheritance 與 Classical Inheritance 的區別
在類繼承中,類是不可變的,不同的語言中對於多繼承的支持也不一樣,有些語言中還支持接口、final、abstract 的概念。而原型繼承則更為靈活,原型本身是可以可變的,並且對象可能繼承自多個原型。
找出整型數組中乘積最大的三個數
給定一個包含整數的無序數組,要求找出乘積最大的三個數。
var unsorted_array = [-10, 7, 29, 30, 5, -10, -70];
computeProduct(unsorted_array);
function sortIntegers(a, b) { return a - b;}
function computeProduct(unsorted) { var sorted_array = unsorted.sort(sortIntegers), product1 = 1, product2 = 1, array_n_element = sorted_array.length - 1;
for (var x = array_n_element; x > array_n_element - 3; x--) { product1 = product1 * sorted_array[x]; } product2 = sorted_array[0] * sorted_array[1] * sorted_array[array_n_element];
if (product1 > product2) return product1;
return product2};
尋找連續數組中的缺失數
給定某無序數組,其包含了 n 個連續數字中的 n - 1 個,已知上下邊界,要求以O(n)的複雜度找出缺失的數字。
var array_of_integers = [2, 5, 1, 4, 9, 6, 3, 7];var upper_bound = 9;var lower_bound = 1;
findMissingNumber(array_of_integers, upper_bound, lower_bound);
function findMissingNumber(array_of_integers, upper_bound, lower_bound) {
var sum_of_integers = 0; for (var i = 0; i < array_of_integers.length; i++) { sum_of_integers += array_of_integers[i]; }
upper_limit_sum = (upper_bound * (upper_bound + 1)) / 2; lower_limit_sum = (lower_bound * (lower_bound - 1)) / 2;
theoretical_sum = upper_limit_sum - lower_limit_sum;
return (theoretical_sum - sum_of_integers)}
數組去重
給定某無序數組,要求去除數組中的重複數字並且返回新的無重複數組。
var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
Array.from(new Set(array));
var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
uniqueArray(array);
function uniqueArray(array) { var hashmap = {}; var unique = []; for(var i = 0; i < array.length; i++) { if(!hashmap.hasOwnProperty([array[i]])) { hashmap[array[i]] = 1; unique.push(array[i]); } } return unique;}
數組中元素最大差值計算
給定某無序數組,求取任意兩個元素之間的最大差值,注意,這裡要求差值計算中較小的元素下標必須小於較大元素的下標。
譬如[7, 8, 4, 9, 9, 15, 3, 1, 10]這個數組的計算值是 11( 15 - 4 ) 而不是 14(15 - 1),因為 15 的下標小於 1。
var array = [7, 8, 4, 9, 9, 15, 3, 1, 10];
findLargestDifference(array);
function findLargestDifference(array) {
if (array.length <= 1) return -1;
var current_min = array[0]; var current_max_difference = 0;
for (var i = 1; i < array.length; i++) { if (array[i] > current_min && (array[i] - current_min > current_max_difference)) { current_max_difference = array[i] - current_min; } else if (array[i] <= current_min) { current_min = array[i]; } }
if (current_max_difference <= 0) return -1;
return current_max_difference;}
數組中元素乘積
給定某無序數組,要求返回新數組 output ,其中 output[i] 為原數組中除了下標為 i 的元素之外的元素乘積,要求以 O(n) 複雜度實現:
var firstArray = [2, 2, 4, 1];var secondArray = [0, 0, 0, 2];var thirdArray = [-2, -2, -3, 2];
productExceptSelf(firstArray); productExceptSelf(secondArray); productExceptSelf(thirdArray);
function productExceptSelf(numArray) { var product = 1; var size = numArray.length; var output = [];
for (var x = 0; x < size; x++) { output.push(product); product = product * numArray[x]; }
var product = 1; for (var i = size - 1; i > -1; i--) { output[i] = output[i] * product; product = product * numArray[i]; }
return output;}
數組交集
給定兩個數組,要求求出兩個數組的交集,注意,交集中的元素應該是唯一的。
var firstArray = [2, 2, 4, 1];var secondArray = [1, 2, 0, 2];
intersection(firstArray, secondArray);
function intersection(firstArray, secondArray) {
var hashmap = {}; var intersectionArray = [];
firstArray.forEach(function(element) { hashmap[element] = 1; });
secondArray.forEach(function(element) { if (hashmap[element] === 1) { intersectionArray.push(element); hashmap[element]++; } });
return intersectionArray;
}
字 符 串
顛倒字符串
給定某個字符串,要求將其中單詞倒轉之後然後輸出,譬如"Welcome to this Javascript Guide!" 應該輸出為 "emocleW ot siht tpircsavaJ !ediuG"。
var string = "Welcome to this Javascript Guide!";
var reverseEntireSentence = reverseBySeparator(string, "");
var reverseEachWord = reverseBySeparator(reverseEntireSentence, " ");
function reverseBySeparator(string, separator) { return string.split(separator).reverse().join(separator);}
亂序同字母字符串
給定兩個字符串,判斷是否顛倒字母而成的字符串,譬如Mary與Army就是同字母而順序顛倒:
var firstWord = "Mary";var secondWord = "Army";
isAnagram(firstWord, secondWord);
function isAnagram(first, second) { var a = first.toLowerCase(); var b = second.toLowerCase();
a = a.split("").sort().join(""); b = b.split("").sort().join("");
return a === b;}
會問字符串
判斷某個字符串是否為回文字符串,譬如racecar與race car都是回文字符串:
isPalindrome("racecar"); isPalindrome("race Car");
function isPalindrome(word) { var lettersOnly = word.toLowerCase().replace(/\s/g, "");
return lettersOnly === lettersOnly.split("").reverse().join("");}
棧與隊列
使用兩個棧實現入隊與出隊
var inputStack = []; var outputStack = [];
function enqueue(stackInput, item) { return stackInput.push(item);}
function dequeue(stackInput, stackOutput) { if (stackOutput.length <= 0) { while(stackInput.length > 0) { var elementToOutput = stackInput.pop(); stackOutput.push(elementToOutput); } }
return stackOutput.pop();}
判斷大括號是否閉合
創建一個函數來判斷給定的表達式中的大括號是否閉合:
var expression = "{{}}{}{}"var expressionFalse = "{}{{}";
isBalanced(expression); isBalanced(expressionFalse); isBalanced("");
function isBalanced(expression) { var checkString = expression; var stack = [];
if (checkString.length <= 0) return true;
for (var i = 0; i < checkString.length; i++) { if(checkString[i] === '{') { stack.push(checkString[i]); } else if (checkString[i] === '}') { if (stack.length > 0) { stack.pop(); } else { return false; } } }
if (stack.pop()) return false; return true;}
遞 歸
二進位轉換
通過某個遞歸函數將輸入的數字轉化為二進位字符串:
decimalToBinary(3); decimalToBinary(8); decimalToBinary(1000);
function decimalToBinary(digit) { if(digit >= 1) { if (digit % 2) { return decimalToBinary((digit - 1) / 2) + 1; } else { return decimalToBinary(digit / 2) + 0; } } else { return ''; }}二分搜索
function recursiveBinarySearch(array, value, leftPosition, rightPosition) { if (leftPosition > rightPosition) return -1;
var middlePivot = Math.floor((leftPosition + rightPosition) / 2); if (array[middlePivot] === value) { return middlePivot; } else if (array[middlePivot] > value) { return recursiveBinarySearch(array, value, leftPosition, middlePivot - 1); } else { return recursiveBinarySearch(array, value, middlePivot + 1, rightPosition); }}數 字
判斷是否為 2 的指數值
isPowerOfTwo(4); isPowerOfTwo(64); isPowerOfTwo(1); isPowerOfTwo(0); isPowerOfTwo(-1);
function isPowerOfTwo(number) {
return number & (number - 1) === 0;}
function isPowerOfTwoZeroCase(number) { return (number !== 0) && ((number & (number - 1)) === 0);}《web移動端交互開發實戰秘笈》
46節錄播視頻形式
限時拼團價1.68,快來薅羊毛!