每日3题

28 以下代码执行后,控制台中的输出内容为?

function showCase(value){
    switch(value){
        case 'A':
            console.log('case A');
            break;
        case 'B':
            console.log('case B');
            break;
        case undefined:
            console.log('undefined');
            break;
        default:
            console.log('Do not know');
            
    }
}
 
showCase(new String('A'));

29 以下代码执行后,控制台中的输出内容为?

function f(){}
const a = f.prototype,
      b = Object.getPrototypeOf(f);
 
console.log(a===b);

30 以下代码执行后,控制台中的输出内容为?

console.log(typeof null)
console.log(null instanceof Object)

公众号【今天也要写bug】更多前端面试题

答案与解析

28

// 答案:Do not know
// 考察基本字符串、字符串对象和 switch
// 字符串字面量是 string 类型
// 字符串对象是 object 类型
// switch 使用严格运算符(===)来进行比较
// 在下面 switch case 没有匹配的 case,因此走的是 default
function showCase(value) {
  switch (value) {
    case "A":
      console.log("case A");
      break;
    case "B":
      console.log("case B");
      break;
    case undefined:
      console.log("undefined");
      break;
    default:
      console.log("Do not know");
  }
}

showCase(new String("A"));

29

// 答案:false
// 考察原型链
// 函数本身也是对象
// 函数作为对象,是new Function 构造函数产生的,所以 f.__proto__ => Function.prototype
// 函数的 f.prototype 则默认是一个空对象,和 f.__proto__ 没有关系
function f() {}
const a = f.prototype,
  b = Object.getPrototypeOf(f);

console.log(a === b);
// Object.getPrototypeOf 方法返回对象的原型对象即 f.__proto__
// f.prototype 不等于 f.__proto__
// 最终输出 false

30

// 答案:object false
// 考察 typeof、instanceof、原型链
console.log(typeof null); // 记住就好了 typeof null 为 object
console.log(null instanceof Object);
// instanceof运算符用于检测构造函数(右边)的 prototype 属性是否出现在实例对象(左边)的原型链上
// null 是原型链的终点,Object.prototype 当然不会出现在 null 的原型链上