色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

javascript 面試題 詳解

吳朝志1年前7瀏覽0評論
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)); //輸出10
2.通過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永遠都少不了面試題。