返回
JS面试题连载之七题开篇篇(秋招面试冲刺利器)
前端
2024-02-25 10:48:58
在秋招的硝烟弥漫中,想要在激烈的竞争中脱颖而出,扎实的技术功底是必不可少的。对于javascript开发工程师来说,掌握各种面试题型,对类型判断、变量提升、作用域等知识点的灵活运用是面试成功的重要因素。本文将开启JS面试题连载之旅,每期7题,涵盖基础语法、数据结构、算法等多个维度,助力各位在面试中斩获佳绩!
本期关键词:
Q1:typeof 和 instanceof 原理是什么?
typeof :用于判断一个变量的原始数据类型(基本类型,如字符串、数字、布尔值、undefined、null)。对于null,typeof返回 "object" 而不是 "null",这是它的一个特殊性。
instanceof :用于判断一个变量是否是某个构造函数的实例。它会检查变量的原型链,看是否能找到该构造函数的原型对象。
Q2:判断基本数据类型可以使用哪些方法?
除了typeof,还可以使用以下方法:
- Object.prototype.toString.call() :返回对象的类型字符串,如 "[object String]"
- isArray() :判断是否为数组
- isBoolean() :判断是否为布尔值
- isFunction() :判断是否为函数
- isNumber() :判断是否为数字
- isObject() :判断是否为对象(注意它也返回true,包括null)
- isSymbol() :判断是否为Symbol(ES6新增)
Q3:变量提升是什么?它对代码有什么影响?
变量提升是一种编译机制,会将所有变量声明提升到代码块(函数、模块)的顶部。
影响 :
- 提前声明 :可以在声明之前使用变量,但值是undefined
- 重复声明 :同一作用域内重复声明同一个变量,后面的声明会覆盖前面的声明
- 无法声明相同名称的函数和变量 :提升后,函数名和变量名将冲突,导致变量不可访问
Q4:作用域是什么?它如何影响变量的访问?
作用域是指代码中变量、函数等标识符的有效范围。有两种主要作用域:
- 全局作用域 :变量在整个脚本中都可以访问
- 局部作用域 :变量仅在函数内部或特定块中可以访问
Q5:闭包是如何工作的?举例说明。
闭包是一个函数,它可以访问其定义作用域中的变量,即使该作用域已经被销毁。
例子 :
function outer() {
let count = 0;
return function inner() {
return count++;
};
}
在这里,inner函数是一个闭包,它可以访问outer函数中的count变量,即使outer函数已经执行完毕。
Q6:解释事件冒泡和事件捕获的概念。
- 事件冒泡 :当一个元素上的事件触发时,它会向上冒泡到父元素,直到文档根元素。
- 事件捕获 :与冒泡相反,事件捕获从文档根元素开始向内传播,直到到达目标元素。
Q7:如何实现对象的深拷贝?
有两种方法:
- 使用JSON序列化和反序列化 :
JSON.parse(JSON.stringify(obj))
- 递归遍历对象并创建新对象 :
function deepCopy(obj) {
if (typeof obj !== "object" || obj === null) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(deepCopy);
}
const newObj = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}