有价值的Javascript面试题

不定期更新,整理那些比较有价值的Javascript面试题,但也仅此而已。

ES6模板解析器

在这里

构造函数、类、原型、变量声明、函数基础

              
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
function Foo() { getName = function () { console.log(1) } return this } Foo.getName = function () { console.log(2) } Foo.prototype.getName = function () { console.log(3) } var getName = function () { console.log(4) } function getName() { console.log(5) } // 求输出结果 Foo.getName() getName() Foo().getName() getName() new Foo.getName() new Foo().getName() new new Foo().getName() // 分割线 --------------------------------------------- // 上面代码基本等同于 function getName() { console.log(5) } function Foo() { getName = function () { console.log(1) } return this } Foo.getName = function () { console.log(2) } Foo.prototype.getName = function () { console.log(3) } getName = function () { console.log(4) } // 执行过程 // Foo的静态属性 Foo.getName() // 全局getName函数 getName() // 未实例化,this指向window,window中的getName,即全局getName Foo().getName() // 全局getName,但由于Foo执行后全局的getName被重新赋值 getName() // 只是实例了一个子函数,没什么异样 new Foo.getName() // 实例化类,并执行原型上的方法 new Foo().getName() // 将原型上的方法再实例一次 new new Foo().getName()

闭包和单线程

              
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
for(var i = 0; i < 5; i++) { console.log(i) } // 0 1 2 3 4 for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i) }, 1000 * i) } // 立即打印一个5,每隔一秒一个5 for(var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i) }, i * 1000) })(i) } // 0,+1s 1 +1s 2 +1s 3 +1s 4 for(var i = 0; i < 5; i++) { (function() { setTimeout(function() { console.log(i) }, i * 1000) })(i) } // 立即打印一个5,每隔一秒一个5(实际上闭包内没有形参,有的话就正常了) for(var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i) })(i), i * 1000) } // 0,1,2,3,4 同时定时器失效,因为函数体没return有效函数 setTimeout(function() { console.log(1) }, 0) new Promise(function executor(resolve) { console.log(2) for( var i = 0; i < 10000; i++ ) { i == 9999 && resolve() } console.log(3) }).then(function() { console.log(4) }) console.log(5) // 输出,执行顺序:同步 => 同步 => 同步 => 异步队列(Promise) => 异步队列(定时器) // 2 3 5 4 1

函数的隐式转换

              
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
function fn() { return 20 } console.log(fn + 10) function fn() { return 20 } fn.toString = function() { return 10 } console.log(fn + 10) function fn() { return 20 } fn.toString = function() { return 10 } fn.valueOf = function() { return 5 } console.log(fn + 10)

函数防抖和节流

              
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
//函数节流 const throttle = (fun, delay) => { let last = null return () => { const now = + new Date() if (now - last > delay) { fun() last = now } } } //实例 const throttleExample = throttle(() => console.log(1), 1000) //调用 throttleExample() throttleExample() throttleExample() //函数防抖 cosnt debouce = (fun, delay) => { let timer = null return () => { clearTimeout(timer) timer = setTimeout(() => { fun() }, delay) } } //实例 const debouceExample = debouce(() => console.log(1), 1000) //调用 debouceExample() debouceExample() debouceExample()

未完待续

本文于 2017/4/18 下午 发布在 Code 分类下,当前已被围观 1210 次

相关标签:Web开发工作互联网nodejsJavascript

永久地址:https://surmon.me/article/43

版权声明:自由转载-署名-非商业性使用  |  Creative Commons BY-NC 3.0 CN