[译] 送你 43 道 JavaScript 面试题,oppo前端面试流程

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

12. 下面代码的输出是什么?

function Person(firstName, lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

const lydia = new Person(“Lydia”, “Hallie”);

const sarah = Person(“Sarah”, “Smith”);

console.log(lydia);

console.log(sarah);

复制代码

  • A: Person {firstName: "Lydia", lastName: "Hallie"} and undefined

  • B: Person {firstName: "Lydia", lastName: "Hallie"} and Person {firstName: "Sarah", lastName: "Smith"}

  • C: Person {firstName: "Lydia", lastName: "Hallie"} and {}

  • D:Person {firstName: "Lydia", lastName: "Hallie"} and ReferenceError

答案

答案: A

对于sarah,我们没有使用new关键字。 使用new时,它指的是我们创建的新空对象。 但是,如果你不添加new它指的是全局对象!

我们指定了this.firstName等于'Sarahthis.lastName等于Smith。 我们实际做的是定义global.firstName ='Sarah'global.lastName ='Smithsarah本身的返回值是undefined


12. 事件传播的三个阶段是什么??

  • A: 目标 > 捕获 > 冒泡

  • B: 冒泡 > 目标 > 捕获

  • C: 目标 > 冒泡 > 捕获

  • D: 捕获 > 目标 > 冒泡

答案

答案: D

在捕获阶段,事件通过父元素向下传递到目标元素。 然后它到达目标元素,冒泡开始。


13. 所有对象都有原型.

  • A: 对

  • B: 错误

答案

答案: B

基础对象外,所有对象都有原型。 基础对象可以访问某些方法和属性,例如.toString。 这就是您可以使用内置JavaScript方法的原因! 所有这些方法都可以在原型上找到。 虽然JavaScript无法直接在您的对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这使您可以访问它。

译者注:基础对象指原型链终点的对象。基础对象的原型是null


14. 下面代码的输出是什么?

function sum(a, b) {

return a + b;

}

sum(1, “2”);

复制代码

  • A: NaN

  • B: TypeError

  • C: "12"

  • D: 3

答案

答案: C

JavaScript是一种动态类型语言:我们没有指定某些变量的类型。 在您不知情的情况下,值可以自动转换为另一种类型,称为隐式类型转换。 强制从一种类型转换为另一种类型。

在此示例中,JavaScript将数字1转换为字符串,以使函数有意义并返回值。 在让数字类型(1)和字符串类型('2')相加时,该数字被视为字符串。 我们可以连接像“Hello”+“World”这样的字符串,所以这里发生的是“1”+“2”返回“12”


15. 下面代码的输出是什么?

let number = 0;

console.log(number++);

console.log(++number);

console.log(number);

复制代码

  • A: 1 1 2

  • B: 1 2 2

  • C: 0 2 2

  • D: 0 1 2

答案

答案: C

后缀一元运算符++

  1. 返回值(返回0

  2. 增加值(数字现在是1

前缀一元运算符++

  1. 增加值(数字现在是2

  2. 返回值(返回2

所以返回0 2 2


16. 下面代码的输出是什么?

function getPersonInfo(one, two, three) {

console.log(one);

console.log(two);

console.log(three);

}

const person = “Lydia”;

const age = 21;

getPersonInfo${person} is ${age} years old;

复制代码

  • A: Lydia 21 ["", "is", "years old"]

  • B: ["", "is", "years old"] Lydia 21

  • C: Lydia ["", "is", "years old"] 21

答案

答案: B

如果使用标记的模板字符串,则第一个参数的值始终是字符串值的数组。 其余参数获取传递到模板字符串中的表达式的值!


17. 下面代码的输出是什么?

function checkAge(data) {

if (data === { age: 18 }) {

console.log(“You are an adult!”);

} else if (data == { age: 18 }) {

console.log(“You are still an adult.”);

} else {

console.log(Hmm.. You don't have an age I guess);

}

}

checkAge({ age: 18 });

复制代码

  • A: You are an adult!

  • B: You are still an adult.

  • C: Hmm.. You don't have an age I guess

答案

答案: C

在比较相等性,原始类型通过它们的值进行比较,而对象通过它们的引用进行比较。JavaScript检查对象是否具有对内存中相同位置的引用。

我们作为参数传递的对象和我们用于检查相等性的对象在内存中位于不同位置,所以它们的引用是不同的。

这就是为什么{ age: 18 } === { age: 18 }{ age: 18 } == { age: 18 } 返回 false的原因。


18. 下面代码的输出是什么?

function getAge(…args) {

console.log(typeof args);

}

getAge(21);

复制代码

  • A: "number"

  • B: "array"

  • C: "object"

  • D: "NaN"

答案

答案: C

扩展运算符(... args)返回一个带参数的数组。 数组是一个对象,因此typeof args返回object


20. 下面代码的输出是什么?

function getAge() {

“use strict”;

age = 21;

console.log(age);

}

getAge();

复制代码

  • A: 21

  • B: undefined

  • C: ReferenceError

  • D: TypeError

答案

答案: C

使用“use strict”,可以确保不会意外地声明全局变量。 我们从未声明变量age,因为我们使用``use strict’,它会引发一个ReferenceError。 如果我们不使用“use strict”,它就会起作用,因为属性age`会被添加到全局对象中。


21. 下面代码的输出是什么?

const sum = eval(“10*10+5”);

复制代码

  • A: 105

  • B: "105"

  • C: TypeError

  • D: "10*10+5"

答案

答案: A

eval会为字符串传递的代码求值。 如果它是一个表达式,就像在这种情况下一样,它会计算表达式。 表达式为10 * 10 + 5计算得到105


22. cool_secret可以访问多长时间?

sessionStorage.setItem(“cool_secret”, 123);

复制代码

  • A:永远,数据不会丢失。

  • B:用户关闭选项卡时。

  • C:当用户关闭整个浏览器时,不仅是选项卡。

  • D:用户关闭计算机时。

答案

答案: B

关闭选项卡后,将删除存储在sessionStorage中的数据。

如果使用localStorage,数据将永远存在,除非例如调用localStorage.clear()


23. 下面代码的输出是什么?

var num = 8;

var num = 10;

console.log(num);

复制代码

  • A: 8

  • B: 10

  • C: SyntaxError

  • D: ReferenceError

答案

答案: B

使用var关键字,您可以用相同的名称声明多个变量。然后变量将保存最新的值。

您不能使用letconst来实现这一点,因为它们是块作用域的。


24. 下面代码的输出是什么?

const obj = { 1: “a”, 2: “b”, 3: “c” };

const set = new Set([1, 2, 3, 4, 5]);

obj.hasOwnProperty(“1”);

obj.hasOwnProperty(1);

set.has(“1”);

set.has(1);

复制代码

  • A: false true false true

  • B: false true true true

  • C: true true false true

  • D: true true true true

答案

答案: C

所有对象键(不包括Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。 这就是为什么obj.hasOwnProperty('1')也返回true

上面的说法不适用于Set。 在我们的Set中没有“1”set.has('1')返回false。 它有数字类型1set.has(1)返回true


25. 下面代码的输出是什么?

const obj = { a: “one”, b: “two”, a: “three” };

console.log(obj);

复制代码

  • A: { a: "one", b: "two" }

  • B: { b: "two", a: "three" }

  • C: { a: "three", b: "two" }

  • D: SyntaxError

答案

答案: C

如果对象有两个具有相同名称的键,则将替前面的键。它仍将处于第一个位置,但具有最后指定的值。


26. JavaScript全局执行上下文为你创建了两个东西:全局对象和this关键字.

  • A: 对

  • B: 错误

  • C: 视情况而定

答案

答案: A

基本执行上下文是全局执行上下文:它是代码中随处可访问的内容。


27. 下面代码的输出是什么?

for (let i = 1; i < 5; i++) {

if (i === 3) continue;

console.log(i);

}

复制代码

  • A: 1 2

  • B: 1 2 3

  • C: 1 2 4

  • D: 1 3 4

答案

答案: C

如果某个条件返回true,则continue语句跳过迭代。


28. 下面代码的输出是什么?

String.prototype.giveLydiaPizza = () => {

return “Just give Lydia pizza already!”;

};

const name = “Lydia”;

name.giveLydiaPizza();

复制代码

  • A: "Just give Lydia pizza already!"

  • B: TypeError: not a function

  • C: SyntaxError

  • D: undefined

答案

答案: A

String是一个内置的构造函数,我们可以为它添加属性。 我刚给它的原型添加了一个方法。 原始类型的字符串自动转换为字符串对象,由字符串原型函数生成。 因此,所有字符串(字符串对象)都可以访问该方法!

译者注:

当使用基本类型的字符串调用giveLydiaPizza时,实际上发生了下面的过程:

  • 创建一个String的包装类型实例

  • 在实例上调用substring方法

  • 销毁实例


29. 下面代码的输出是什么?

const a = {};

const b = { key: “b” };

const c = { key: “c” };

a[b] = 123;

a[c] = 456;

console.log(a[b]);

复制代码

  • A: 123

  • B: 456

  • C: undefined

  • D: ReferenceError

答案

答案: B

对象键自动转换为字符串。我们试图将一个对象设置为对象a的键,其值为123

但是,当对象自动转换为字符串化时,它变成了[Object object]。 所以我们在这里说的是a["Object object"] = 123。 然后,我们可以尝试再次做同样的事情。 c对象同样会发生隐式类型转换。那么,a["Object object"] = 456

然后,我们打印a[b],它实际上是a["Object object"]。 我们将其设置为456,因此返回456


30. 下面代码的输出是什么?

const foo = () => console.log(“First”);

const bar = () => setTimeout(() => console.log(“Second”));

const baz = () => console.log(“Third”);

bar();

foo();

baz();

复制代码

  • A: First Second Third

  • B: First Third Second

  • C: Second First Third

  • D: Second Third First

答案

答案: B

我们有一个setTimeout函数并首先调用它。 然而却最后打印了它。

这是因为在浏览器中,我们不只有运行时引擎,我们还有一个叫做WebAPI的东西。WebAPI为我们提供了setTimeout函数,例如DOM

callback推送到WebAPI后,setTimeout函数本身(但不是回调!)从堆栈中弹出。

现在,调用foo,并打印First

foo从堆栈弹出,baz被调用,并打印Third

WebAPI不能只是在准备就绪时将内容添加到堆栈中。 相反,它将回调函数推送到一个称为任务队列的东西。

这是事件循环开始工作的地方。 事件循环查看堆栈和任务队列。 如果堆栈为空,则会占用队列中的第一个内容并将其推送到堆栈中。

bar被调用,Second被打印,它从栈中弹出。


31. 单击按钮时event.target是什么?

Click!

复制代码

  • A: div外部

  • B: div内部

  • C: button

  • D: 所有嵌套元素的数组.

答案

答案: C

导致事件的最深嵌套元素是事件的目标。 你可以通过event.stopPropagation停止冒泡


32. 单击下面的html片段打印的内容是什么?

Click here!

复制代码

  • A: p div

  • B: div p

  • C: p

  • D: div

答案

答案: A

如果我们单击p,我们会看到两个日志:pdiv。在事件传播期间,有三个阶段:捕获,目标和冒泡。 默认情况下,事件处理程序在冒泡阶段执行(除非您将useCapture设置为true)。 它从最深的嵌套元素向外延伸。


33. 下面代码的输出是什么?

const person = { name: “Lydia” };

function sayHi(age) {

console.log(${this.name} is ${age});

}

sayHi.call(person, 21);

sayHi.bind(person, 21);

复制代码

  • A: undefined is 21 Lydia is 21

  • B: function function

  • C: Lydia is 21 Lydia is 21

  • D: Lydia is 21 function

答案

答案: D

使用两者,我们可以传递我们想要this关键字引用的对象。 但是,.call方法会立即执行!

.bind方法会返回函数的拷贝值,但带有绑定的上下文! 它不会立即执行。


34. 下面代码的输出是什么?

function sayHi() {

return (() => 0)();

}

typeof sayHi();

复制代码

  • A: "object"

  • B: "number"

  • C: "function"

  • D: "undefined"

答案

答案: B

sayHi函数返回立即调用的函数(IIFE)的返回值。 该函数返回0,类型为数字

仅供参考:只有7种内置类型:nullundefinedbooleannumberstringobjectsymbolfunction不是一个类型,因为函数是对象,它的类型是object


35. 下面这些值哪些是假值?

0;

new Number(0);

(“”);

(" ");

new Boolean(false);

undefined;

复制代码

  • A: 0, '', undefined

  • B: 0, new Number(0), '', new Boolean(false), undefined

  • C: 0, '', new Boolean(false), undefined

  • D: 所有都是假值

答案

答案: A

JavaScript中只有6个假值:

  • undefined

  • null

  • NaN

  • 0

  • '' (empty string)

  • false

函数构造函数,如new Numbernew Boolean都是真值。


36. 下面代码的输出是什么?

console.log(typeof typeof 1);

复制代码

  • A: "number"

  • B: "string"

  • C: "object"

  • D: "undefined"

答案

答案: B

typeof 1 返回 "number". typeof "number" 返回 "string"


37. 下面代码的输出是什么?

const numbers = [1, 2, 3];

numbers[10] = 11;

console.log(numbers);

复制代码

  • A: [1, 2, 3, 7 x null, 11]

  • B: [1, 2, 3, 11]

  • C: [1, 2, 3, 7 x empty, 11]

  • D: SyntaxError

答案

答案: C

当你为数组中的元素设置一个超过数组长度的值时,JavaScript会创建一个名为“空插槽”的东西。 这些位置的值实际上是undefined,但你会看到类似的东西:

[1, 2, 3, 7 x empty, 11]

这取决于你运行它的位置(每个浏览器有可能不同)。


38. 下面代码的输出是什么?

(() => {

let x, y;

try {

throw new Error();

} catch (x) {

(x = 1), (y = 2);

console.log(x);

}

console.log(x);

console.log(y);

})();

复制代码

最后

最后写上我自己一直喜欢的一句名言:世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
of 1);

复制代码

  • A: "number"

  • B: "string"

  • C: "object"

  • D: "undefined"

答案

答案: B

typeof 1 返回 "number". typeof "number" 返回 "string"


37. 下面代码的输出是什么?

const numbers = [1, 2, 3];

numbers[10] = 11;

console.log(numbers);

复制代码

  • A: [1, 2, 3, 7 x null, 11]

  • B: [1, 2, 3, 11]

  • C: [1, 2, 3, 7 x empty, 11]

  • D: SyntaxError

答案

答案: C

当你为数组中的元素设置一个超过数组长度的值时,JavaScript会创建一个名为“空插槽”的东西。 这些位置的值实际上是undefined,但你会看到类似的东西:

[1, 2, 3, 7 x empty, 11]

这取决于你运行它的位置(每个浏览器有可能不同)。


38. 下面代码的输出是什么?

(() => {

let x, y;

try {

throw new Error();

} catch (x) {

(x = 1), (y = 2);

console.log(x);

}

console.log(x);

console.log(y);

})();

复制代码

最后

最后写上我自己一直喜欢的一句名言:世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-6cG23nOr-1713418386927)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值