前端面试之代码输出结果(三)

202 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

立即执行函数和作用域

var a = 123;
(function a () {
    a = 'abc';
    console.log(a);
})();

答案:

ƒ a () {
    a = 'abc';
    console.log(a);
}

说明

  • 立即执行函数 IIFE,可以模拟块级作用域,即在一个函数表达式内部声明变量,然后立即调用这个函数。这 样位于函数体作用域的变量就像是在块级作用域中一样。
  • 如果立即执行函数名称跟内部变量名称重名,函数名称优先
  • 在严格模式 'use strict'; 下该代码会报错

String和switch

var str = new String(123);
switch (str) {
  case '123': {
    console.log('string 123');
    break;
  } 
  case 123: {
    console.log(`number 123`);
    break;
  } 
  case undefined: {
    console.log(`undefined value`);
    break;
  } 
  default: {
    console.log('unknown value');
    break;
  } 
}

答案:会输出 unknown value

说明

    1. var str = new String(123); 时候 str 是类 String的示例,类型是Object
    1. switch 是严格比较,所以 str === '123' 为 false
    1. str 与上面的 value 值都不匹配,执行default输出 unknown value
    1. MDN上有提到一个 switch 语句首先会计算其 expression 。然后,它将从第一个 case 子句开始直到寻找到一个其表达式值与所输入的 expression 的值所相等的子句(使用 严格运算符 (en-US)===)并将控制权转给该子句,执行相关语句。

Object.getPrototypeOf原型

function A() {};
var a0 = new A();
var a1= {};
a1.__proto__ = A.prototype;
var a2 = {};
a2.__proto__ = Object.getPrototypeOf(new A());
var a3 = {};
a3.__proto__ = Object.getPrototypeOf(A);

console.log(a0 instanceof A);
console.log(a1 instanceof A);
console.log(a2 instanceof A);
console.log(a3 instanceof A);

答案:true, true, true, false

说明

Object.getPrototypeOf()  方法返回指定对象的原型(内部[[Prototype]]属性的值)

var a0 = new A();
// a0 原型 __proto__ 会自动指向 A.prototype
// 所以 a0 instanceof A 为 true;


var a1= {};
a1.__proto__ = A.prototype;
// a1 原型 __proto__ 直接指向 A.prototype
// 所以 a0 instanceof A 为 true;


var a2 = {};
a2.__proto__ = Object.getPrototypeOf(new A());
// Object.getPrototypeOf(new A()) 是指向 new A() 对象的原型.
// 所以 a2.__proto__ 指向 A.prototype
// 所以 a2 instanceof A 为 true;


var a3 = {};
a3.__proto__ = Object.getPrototypeOf(A);
// Object.getPrototypeOf(A) 是指向 A 函数的原型.
// 所以 a2.__proto__ 指向 Function.prototype
// 所以 a2 instanceof A 为 false;