助力春招:解析15个大厂代码题!

Hello,大家好,我是 Sunday。

最近跟 1v1私教 的很多同学沟通了春招的问题,总结了 15 个中大厂中比较常见的代码题(看代码说结果),今天在这里分享给大家。助(祝)大家可以春招上岸,入职大厂!

01:变量提升和函数作用域

js 复制代码
var x = 1;
function foo() {
  x = 10;
  return;
  function x() {}
}
foo();
console.log(x); // Output: 1;

这个问题测试你对变量提升和函数作用域的理解。

在JavaScript中,变量和函数声明会被提升到它们各自作用域的顶部。函数x被提升到foo函数作用域的顶部,并且它变成了一个局部变量。foo函数内部的赋值x = 10 修改的是这个局部变量x,而不是全局变量。

因此,输出结果将是1。

02:函数内部变量提升

js 复制代码
var name = "Lokesh Prajapati";
(function() {
  console.log(name);
  var name = "Lokesh Prajapati";
})(); // Output: undefined;

这个问题测试你对函数内部变量提升的理解。

即使name变量在函数外部声明,函数内部的var name声明会被提升到函数作用域的顶部。然而,在console.log调用的时候,name的值是未定义的,因为赋值var name = "Jane Doe"; 还没有被执行。

输出将是undefined。

03:函数表达式和typeof运算符

js 复制代码
var x = 1;
if (function test() {}) {
  x += typeof test;
}
console.log(x); // Output: 1undefined;

这个问题检验了你对函数表达式和typeof运算符的理解。

if语句中有一个函数表达式,它的值为true,并且进入了代码块。然而,在外部作用域中f并未定义,因为它是一个函数表达式而不是一个函数声明。

因此,typeof f 的结果将是 'undefined',输出将是 1undefined。

04:函数提升、函数声明、变量声明顺序

js 复制代码
function sayHelloWorld() {
  return sayGoodbyWorld();
  var sayGoodbyWorld = function() {
    return "Hello, World!";
  };
  function sayGoodbyWorld() {
    return "Goodbye, World!";
  }
}
console.log(sayHelloWorld());

这个问题测试你对函数提升和函数声明以及变量声明顺序的理解。

函数sayGoodbyWorld被提升到sayHelloWorld函数作用域的顶部,而sayGoodbyWorld变量声明也被提升,但它的赋值没有被提升。

因此,第一个sayGoodbyWorld函数被使用,输出将是"Goodbye, World!"。

05:原型和继承

js 复制代码
function Parent() {}
function Child() {}
Child.prototype = new Parent();
var obj = new Child();
console.log(obj instanceof Parent); // Output: true;

这个问题考察了你对JavaScript中原型和继承的知识。

这段代码创建了一个Parent和一个Child构造函数。Child的原型被设置为一个Parent的实例,从而创建了一个原型链。当使用Child构造函数创建obj时,它会继承自Parent。

输出为 true。

06:函数内变量提升

js 复制代码
var x = 10;
function testValue() {
  console.log(x);
  var x = 20;
}
testValue(); // Output: undefined;

这个问题检验了你对函数内变量提升的理解。

testValue函数内的var x声明会被提升到函数作用域的顶部,但它的赋值不会被提升。

因此,在console.log时,x是未定义的,输出将是undefined。

07:基于原型的继承和函数引用相等性

js 复制代码
function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  return "Hello, my name is " + this.name;
};

var person1 = new Person("张三");
var person2 = new Person("李四");

console.log(person1.greet === person2.greet); // Output: true;

这个问题测试你对基于原型的继承和函数引用相等性的了解。

person1和person2都是Person构造函数的实例,并且它们通过原型链共享相同的greet方法。

因此,输出将是true,因为对于两个实例来说,greet函数的引用是相同的。

08:类型转换、真值和假值

js 复制代码
console.log([] == ![]); // Output: true;

这个问题检验了你对 JavaScript 中类型转换、真值和假值的理解。

数组 \[\] 是真值,而 ! 运算符对其取反,使其变为假值。当使用抽象相等 ( == ) 运算符比较假值和真值时,两个操作数都会被转换为数字。假值会被转换为 0 。

因此,表达式变为 0 == 0 ,输出结果为 true 。

09:变量提升和函数返回值

js 复制代码
function sayHi() {
  return hi;
  var hi = "Hello, World!";
}
console.log(sayHi()); // Output: undefined.

这个问题检查了你对变量提升和函数返回值的理解。

变量 hi 的声明被提升到 sayHi 函数作用域的顶部,但它的赋值没有被提升。在 return 语句执行时,hi 是未定义的,这就是返回的值。

输出将是 undefined

10:闭包

js 复制代码
var x = 5;
function outer() {
  var x = 10;
  function inner() {
    console.log(x);
  }
  return inner;
}
var finalResult = outer();
finalResult();

这个问题测试你对闭包的理解。

外部函数创建了对变量 x 的闭包,内部函数可以访问它。当内部函数被调用时,它会记录来自闭包的变量 x 的值,即 10。

输出将是 10。

11:函数返回值

js 复制代码
function userData() {
  return userData;
}
console.log(typeof userData()); // Output: function;

这个问题测试你对函数返回值的理解。

userData函数返回它自己(函数引用)。

因此,调用typeof userData()的结果将是'function'。

12:变量提升和函数内部变量作用域

js 复制代码
var x = 10;
function testNum() {
  console.log(x);
  if (true) {
    var x = 20;
  }
  console.log(x);
}
testNum();

这个问题检查你对变量提升和函数内部变量作用域的理解。

在testNum函数内部,if块内的var x声明会被提升到函数作用域的顶部,但它的赋值不会被提升。因此,在第一个console.log中,x是未定义的。然后,在if块内给x赋值为20,在第二个console.log中,x将会是20。

输出将是:20。

13:数组比较

js 复制代码
var a = [1, 2, 3];
var b = [1, 2, 3];
console.log(a == b); // Output: false;

这个问题测试你对JavaScript中数组比较的理解。

虽然a和b包含相同的值,但在JavaScript中数组是引用类型。当使用抽象相等运算符(==)比较两个数组时,比较会检查两个操作数是否引用内存中的同一个数组对象,而在这里并非如此。

因此,输出结果将是false。

14:函数内变量提升

js 复制代码
var x = 5;
(function() {
  console.log(x);
  var x = 10;
})(); // Output: undefined;

这个问题考察了你对函数内变量提升的理解。

在立即调用的函数表达式(IIFE)内部声明的变量 x 会被提升到函数作用域的顶部,但它的赋值不会被提升。

因此,在 console.log 的时候,x 是未定义的,输出将是 undefined。

15:this 指向

js 复制代码
function a() {
  console.log(this);
}
var b = {
  foo: a
};
b.foo(); // Output: { foo: a };

这个问题测试你对JavaScript函数中this值的理解。

在这种情况下,函数a被作为对象b的方法调用,所以a内部的this值将指向对象b。

输出将是对象b本身。

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~

相关推荐
掘金者阿豪1 小时前
把业务数据变成共享仪表盘:Metabase可视化与远程访问实践
前端·后端
kyriewen1 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端2 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员2 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为2 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid2 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger3 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang4533 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
自由路飞4 小时前
RAG 混合检索深挖:BM25 和向量分数为什么不能直接相加?
面试
lichenyang4534 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端