返回

JS面试题连载之七题开篇篇(秋招面试冲刺利器)

前端

在秋招的硝烟弥漫中,想要在激烈的竞争中脱颖而出,扎实的技术功底是必不可少的。对于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;
}