javascript 面試題 詳解
面試中,javascript題常常被提及。非常熱門。但是,越熱門,越容易被人們忽略。這里,我們將詳細地講解javascript面試題。本文將著重探討javascript的高級特性。讓我們快速進入主題。
首先,我們來看一道經典面試題——“NaN === NaN”是 true嗎?
console.log(NaN === NaN); // 輸出false很多人可能都不相信,某個變量明明是NaN,但是比較的時候不等于自身。這是為什么呢? quite simple! NaN !== NaN是由于NaN是一個特殊的數字類型。它代表的是“不是數字”。“不是一個數字”的意思是:此數字也不等于它自己。所以NaN不等于NaN。
接下來,我們可以嘗試利用閉包讓一個數字的序號從0開始依次增加輸出:
for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i) }, 1000) }你會發現結果并未像預期一樣輸出0~4,而是輸出了5個5。為什么呢? 原因是setTimeout機制是異步的,for循環會在1000 milliseconds后整個結束,并依次把i的值賦給setTimeout的參數變量,輸出的結果自然與預期不符。 但是我們可以利用閉包來改變回調函數的定義方式:
for (var i = 0; i < 5; i++) { (function (j) { setTimeout(function () { console.log(j) }, j * 1000) })(i) }使用閉包保存變量,在外層函數中執行異步操作,這樣,我們就成功的讓它從0到4按照一秒間隔輸出了。
接下來講講函數柯里化
其實柯里化是函數式編程的基礎。柯里化,顧名思義就是Curry化,是指將接受多個參數的函數,轉換成接受一個參數,返回一個函數的形式,讓函數的調用更加靈活。 柯里化的方式主要有兩種: 1.通過閉包返回嵌套函數。function currying(fn) { var g = function() { var innerArgs = [].slice.call(arguments); if (innerArgs.length === fn.length) { return fn.apply(null, innerArgs); } return function() { var newArgs = [].slice.call(arguments); return g.apply(null, innerArgs.concat(newArgs)); }; }; return g; } var a = currying(function(a, b, c, d) { return a + b + c + d; }); console.log(a(1)(2)(3)(4)); //輸出102.通過apply/some
function curriedFun() { var args = [].slice.call(arguments); var len = args.length; var fn = args[0]; if (typeof fn !== 'function' || len < 2) { throw new TypeError('It\'s not a curry function!'); } return function() { var innerArgs = [].slice.call(arguments); var totalArgs = args.concat(innerArgs); var totalLen = totalArgs.length; if (totalLen >= fn.length) { return fn.apply(this, totalArgs); } return curriedFun.apply(this, totalArgs); }; } var a = curriedFun(function(a, b, c, d) { return a + b + c + d; }); console.log(a(1)(2)(3)(4)); //輸出10這樣就完成了javascript面試題的詳解,希望這篇文章能對你有所幫助,學好javascript永遠都少不了面試題。