5个典型的JavaScript面试题

原文在这里。我写下来只是为了作个人笔记。


  • 一、考虑以下代码的输出:
(function(){
var a = b = 5;
})()
console.log(b);

结果:5
代码有两个陷阱:
一,看上去是闭包空间内声明两个变量 a、b, 但事实是:a是匿名函数内用 var 声明的一个变量,而 b 不是。
b 被看做是一个全局变量,并在这个匿名函数内被赋值5,所以在函数外尝试对 b 取值是可行的, 但 a 不行。
二,并没有使用严格模式 'use strict',在严格模式下,会报错,因为严格模式要求显示调用全局变量:

(function(){
var a = window.b = 5;
})()
console.log(b);

  • 二、创建内置方法: 给String对象创建一个repeatify方法,该方法接收一个参数作为字符串的重复次数,最后返回指定重复次数的字符串, 例如:
    console.log(‘Hello’.repeatify(3));
    输出 HelloHelloHello。
String.prototype.repeatify = String.prototype.repeatify || String.prototype.repeatify = function(num){
  var str = '';
  for (var i = 0; i < num; i++){
    str += str;
  }
  return str;
}

这题检测我们原型方面的知识,也检测我们能否扩展内置数据类型方法。


  • 三、考虑以下代码的输出:
function test(){
  console.log(a);
  console.log(foo());
  var a = 1;
  function foo(){
    return 2;
  }
}
test();

结果:undefined,2。
变量 a 和函数 foo 的声明都能被提升至外部函数 test 的顶部。
但此时的变量 a 并没有被赋值,也就是变量声明被提升,但赋值不会被提升。也就相当于 var a 声明在 console.log(a) 之前,但 a = 1赋值在 console.log(a) 之后。上面代码相当于:

function test(){
  var a;
  function foo(){
    return 2;
  }
  console.log(a);
  console.log(foo());
  a = 1;
}
test();

  • 四、考虑以下代码的输出:
var name = 'Tom';
var obj = {
  name: 'Jerry',
  prop: {
    name: 'Kitty',
    getName: function(){
      return this.name;
    }
  }
}
console.log(obj.prop.getName);
var test = obj.prop.getName;
console.log(test());

结果:Kitty,Tom
JavaScript 中 this 所指代的函数上下文,取决于调用的方式,而不是被定义的方式。
第一个 console.log() 中,getName 被 obj.prop 对象调用,于是返回obj.prop 的 name 属性值。
当 obj.prop.getName 赋值给全局变量 test 时,当前上下文指代全局对象(因为 test 被隐式看作是全局对象的属性),基于此,getName 返回 window 的 name。


  • 五、修复前一个问题,是第二个 console.log() 输出 Kitty。
    通过使用 apply() / call() 强制转换上下文:
    console.log(test.apply(obj.prop));
    console.log(test.call(obj.prop));

[完]

你可能感兴趣的:(5个典型的JavaScript面试题)