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
。欢迎来撩~~~~~~~~