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永远都少不了面试题。