你有必要知道的25个JavaScript面试题

下面是详细讲解“你有必要知道的25个JavaScript面试题”的完整攻略。

介绍

在面试过程中,JavaScript是一个非常重要的方面,掌握常见的JavaScript面试题可以帮助我们更好地准备面试。这里整理了25个常见的JavaScript面试题供大家参考。

问题列表

1. typeof null 返回什么?

typeof null 返回 "object"。请注意,这是JavaScript中一个已知的错误。

2. 如何将变量从一个文件导出并在另一个文件中使用?

一个常见的方式是使用 export 关键字将变量或函数导出,并使用 import 关键字在另一个文件中导入并使用它们。例如:

// 导出变量
export const name = "Jenny";
// 导出函数
export function add(a, b) {
  return a + b;
}

在另一个文件中使用导入:

// 导入变量和函数
import { name, add } from "./example.js";
console.log(name); // 输出 Jenny
console.log(add(2, 5)); // 输出 7

3. 什么是闭包?

闭包是指一个函数能够访问并操作其外部函数的变量。这是由于JavaScript的词法作用域和函数可以在其定义的作用域之外执行的特性所导致的。

function greet(name) {
  let message = `Hello, ${name}!`;

  function getMessage() {
    return message;
  }

  return getMessage;
}

const greeting = greet("Jenny");
console.log(greeting()); // 输出 Hello, Jenny!

这里,函数 greet 返回了 getMessage 函数,它可以访问外部函数 greet 中的变量 message

4. undefinednull 的区别是什么?

undefined 表示一个变量未赋值或未定义。null 表示一个变量的值为 null,即空对象引用。在布尔上下文中,它们都被认为是假值。

5. JavaScript 中有哪些类型?

JavaScript 中有六种类型:undefinednullstringnumberbooleanobject。ES6 中新增了一种类型,Symbol

6. 如何检查一个变量的类型?

可以使用 typeof 操作符来检查一个变量的类型:

const x = "Hello, world!";
console.log(typeof x); // 输出 string

7. 如何判断一个变量是否是数组?

可以使用 Array.isArray() 方法来判断一个变量是否是数组:

const arr = [1, 2, 3];
console.log(Array.isArray(arr)); // 输出 true

8. 什么是作用域?

作用域是指变量、函数和对象在代码中可访问的范围。JavaScript 有三种类型的作用域——全局作用域、函数作用域和块级作用域。

9. 什么是变量提升?

变量提升是指在 JavaScript 中,变量和函数声明的声明部分会被提升到当前作用域的顶部。这意味着在变量或函数被声明之前访问它们时,它们已经被初始化为 undefined

console.log(name); // 输出 undefined
var name = "Jenny";

10. 什么是事件冒泡?

事件冒泡是指在事件被触发后,它的父元素将依次接收该事件。

<div class="box">
  <button>Click me!</button>
</div>
const button = document.querySelector("button");
const box = document.querySelector(".box");

button.addEventListener("click", () => {
  console.log("Button clicked");
});

box.addEventListener("click", () => {
  console.log("Box clicked");
});

在上面的代码中,当点击按钮时,将会依次触发 button 元素和 box 元素上的单击事件,因此控制台将输出以下两行内容:

Button clicked
Box clicked

11. 什么是事件委托?

事件委托是指将事件处理程序添加到父元素,而不是将它们添加到子元素中,以避免在子元素数目很多的情况下产生垃圾代码。

<ul>
  <li>Apple</li>
  <li>Banana</li>
  <li>Orange</li>
</ul>
const list = document.querySelector("ul");

list.addEventListener("click", event => {
  if (event.target.tagName === "LI") {
    console.log(event.target.textContent);
  }
});

在上面的代码中,单击每个 <li> 元素时,将输出相应元素的文本内容。

12. 什么是深拷贝和浅拷贝?

浅拷贝是指将一个对象的引用复制到另一个对象中,而不是复制对象本身。因此,如果一个对象被更改,另一个对象也将被更改。

深拷贝是指将一个对象的副本复制到另一个对象中,而不是复制对象本身。因此,即使一个对象被更改,另一个对象也不会受到影响。

// 浅拷贝实例
const obj1 = { name: "Jenny", age: 23 };
const obj2 = obj1;

obj2.name = "Lily";
console.log(obj1.name); // 输出 Lily

// 深拷贝实例
const obj3 = { name: "Jenny", age: 23 };
const obj4 = JSON.parse(JSON.stringify(obj3));

obj4.name = "Lily";
console.log(obj3.name); // 输出 Jenny

13. 什么是回调函数?

回调函数是指一个函数作为另一个函数的参数,并在该函数执行完毕后被调用。

function greet(callback) {
  console.log("Hello, world!");
  callback();
}

greet(() => console.log("Nice to meet you!"));

在上面的代码中,greet 函数接受一个回调函数作为参数,并在输出 Hello, world! 后调用该回调函数。

14. 什么是 Promise?

Promise 是一种异步编程模式,它允许我们在代码执行完毕前处理异步操作的结果。

const promise = new Promise((resolve, reject) => {
  const request = new XMLHttpRequest();

  request.onreadystatechange = () => {
    if (request.readyState === 4 && request.status === 200) {
      resolve(request.responseText);
    } else if (request.readyState === 4) {
      reject("An error occurred");
    }
  };

  request.open("GET", "https://jsonplaceholder.typicode.com/todos/1");
  request.send();
});

promise.then(response => console.log(response)).catch(error => console.log(error));

在上面的代码中,Promise 的构造函数接受一个函数,该函数将使用异步操作并为异步操作提供一个 resolve 和一个 reject 参数。我们可以使用 thencatch 方法分别处理异步操作的结果。

15. 什么是闭包?

闭包是指一个函数能够访问并操作其外部函数的变量。这是由于JavaScript的词法作用域和函数可以在其定义的作用域之外执行的特性所导致的。

function greet(name) {
  let message = `Hello, ${name}!`;

  function getMessage() {
    return message;
  }

  return getMessage;
}

const greeting = greet("Jenny");
console.log(greeting()); // 输出 Hello, Jenny!

16. 什么是 JavaScript 中的 this 关键字?

this 关键字是指当前正在执行的函数所属的对象。如果函数被作为对象的方法调用,则 this 指向该对象。否则,它指向全局对象。

const person = {
  name: "Jenny",
  greet() {
    console.log(`Hello, my name is ${this.name}!`);
  }
};

person.greet(); // 输出 Hello, my name is Jenny!

在上面的代码中,当 greet 方法被调用时,this 指向 person 对象。

17. 如何取消 Promise?

可以使用 Promise.race() 方法创建一个新的 Promise,该 Promise 将与原始 Promise 竞争,并在其中一个 Promise 解决或拒绝时解决或拒绝。

const promise1 = new Promise(resolve => setTimeout(resolve, 3000));
const promise2 = new Promise((resolve, reject) =>
  setTimeout(() => reject("Timed out"), 5000)
);

Promise.race([promise1, promise2])
  .then(() => console.log("Promise resolved"))
  .catch(error => console.log(error)); // 输出 Timed out

在上面的代码中,两个 Promise 将竞争,并在 promise2 超时时拒绝。Promise.race() 将处理第一个解决或拒绝的 Promise。

18. JavaScript 中的防抖和节流是什么?

防抖和节流都是一些处理 JavaScript 事件性能问题的技术。

防抖是指在触发事件后等待一段时间再执行处理程序,如果在等待时间内再次触发该事件,则重新开始计时。这是为了避免处理程序被过度调用的问题。

function debounce(func, delay) {
  let timeout;

  return function() {
    clearTimeout(timeout);

    timeout = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

const handleInput = debounce(() => console.log("Input event occurred"), 1000);

document.addEventListener("input", handleInput);

在上面的代码中,debounce 函数将返一个新函数,该函数使用 setTimeout 延迟执行处理程序。如果在 delay 时间内再次触发该事件,则 setTimeout 将被取消并重新启动。

节流是指在一段时间内只允许一个事件被触发。如果更多事件触发,则将被忽略,这是为了避免处理程序被多次调用的问题。

function throttle(func, delay) {
  let timeout;
  let lastRun = 0;

  return function() {
    const context = this;
    const args = arguments;

    if (Date.now() - lastRun >= delay) {
      func.apply(context, args);
      lastRun = Date.now();
    } else {
      clearTimeout(timeout);

      timeout = setTimeout(() => {
        func.apply(context, args);
        lastRun = Date.now();
      }, delay - (Date.now() - lastRun));
    }
  };
}

const handleScroll = throttle(() => console.log("Scroll event occurred"), 1000);

document.addEventListener("scroll", handleScroll);

在上面的代码中,throttle 函数将返一个新函数,该函数在 delay 时间内只允许一个事件被触发。如果更多事件被触发,则将被忽略。

19. 什么是 JavaScript 的事件循环?

事件循环是指在 JavaScript 中处理异步事件的方式,它是由浏览器提供的。

事件循环是单个线程的。它持续监听待处理的事件队列,并在队列中发现可用事件时处理它们。

console.log("Start");

setTimeout(() => console.log("Timeout"), 0);

Promise.resolve().then(() => console.log("Promise"));

console.log("End");

在上面的代码中,setTimeoutPromise 都是异步的。setTimeout 的延迟时间是0,这意味着它将在当前事件循环的末尾处理。Promise 的 resolve 函数显式调用,将它添加到当前事件循环的末尾。因此,控制台将输出以下内容:

Start
End
Promise
Timeout

20. 什么是 JavaScript 中的事件捕获?

事件捕获是指从根元素开始向下指定元素的过程,直到达到正在监听事件的元素。这允许在事件到达指定元素之前对其进行处理。

<div class="box">
  <button>Click me!</button>
</div>
const button = document.querySelector("button");
const box = document.querySelector(".box");

button.addEventListener(
  "click",
  () => console.log("Button clicked"),
  { capture: true }
);

box.addEventListener("click", () => console.log("Box clicked"));

// 输出顺序:
// Box clicked
// Button clicked

在上面的代码中,单击按钮时,首先处理的是 box 元素的单击事件,因为它将从根元素向下处理事件。即使按钮的事件被声明为在捕获阶段处理 ({ capture: true }),该事件仍在冒泡阶段处理。

21. 什么是 JavaScript 中的事件监听?

事件监听是指使用 addEventListener() 方法将处理程序添加到事件的元素中。该方法允许我们指定要监听的事件类型、处理程序函数和是否使用事件捕获。

<button>Click me!</button>
const button = document.querySelector("button");

button.addEventListener("click", () => console.log("Button clicked"));

在上面的代码中,单击按钮时将触发 click 事件,并将处理程序添加到事件的按钮元素中。

22. 什么是闭包?

闭包是指一个函数能够访问并操作其外部函数的变量。这是由于JavaScript的词法作用域和函数可以在其定义的作用域之外执行的特性所导致的。

function greet(name) {
  let message = `Hello, ${name}!`;

  function getMessage() {
    return message;
  }

  return getMessage;
}

const greeting = greet("Jenny");
console.log(greeting()); // 输出 Hello, Jenny!

在上面的代码中,函数 greet 返回了 getMessage 函数,它可以访问外部函数 greet 中的变量 message

23. 什么是 Web Workers?

Web Workers 是一种浏览器 API,它允许我们在后台线程中运行 JavaScript 代码。这可以提高应用程序的性能并避免阻塞UI线程。

可以使用 new Worker() 构造函数创建 Web Worker,并且可以使用 postMessage() 方法将消息发送到 Worker 中,并使用 onmessage 事件处理程序接收来自 Worker 的消息。

// 声明一个新的 Worker
const worker = new Worker("worker.js");

// 向 Worker 发送一条消息
worker.postMessage("Hello, worker!");

// 处理来自 Worker 的消息
worker.onmessage = event => console.log(event.data);

在上面的代码中,worker.js 是一个包含 Worker 代码的文件。 Worker 将在后台线程中运行,因此可以发送和接收消息而不会对UI阻塞。

24. JavaScript 中的值和引用有什么区别?

JavaScript 中的值是指所有基本类型(如字符串、数字、布尔值和空值),它们的值是直接存储在变量中的。

JavaScript 中的引用是指所有复杂数据类型(如对象、数组和函数),它们的值是存储在内存中的地址,而不是存储在变量中的值。因此,当引用一个对象或其他复杂

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:你有必要知道的25个JavaScript面试题 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • js实现炫酷光感效果

    实现炫酷光感效果的攻略: 利用CSS3的linear-gradient实现光感渐变效果 CSS3的linear-gradient是产生线性渐变效果的方法,我们可以利用它来制作光感渐变效果。具体实现方法如下: .light{ background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0) 2…

    JavaScript 2023年6月10日
    00
  • JavaScript String.replace函数参数实例说明

    JavaScript中的String.replace()函数通常用于替换文本内容,其参数包括要替换的内容、替换的新内容和可选的标志属性。 下面是一个示例代码,说明replace()函数的基本用法: let str = "Hello World!"; let newStr = str.replace("World", &…

    JavaScript 2023年5月28日
    00
  • Javascript数组的 splice 方法详细介绍

    Javascript数组的 splice 方法详细介绍 splice() 是 Javascript 数组对象的一个方法,用于在数组中增加或删除元素。该方法会直接修改原始数组。 语法 array.splice(start[, deleteCount[, item1[, item2[, …]]]]) 参数解释 start: 修改的起始位置,必传参数。 del…

    JavaScript 2023年5月27日
    00
  • JavaScript格式化数字的函数代码

    下面是详细讲解“JavaScript格式化数字的函数代码”的完整攻略。 什么是JavaScript格式化数字? JavaScript格式化数字的作用在于将数字按照一定的规则格式化为易于识别的格式。比如添加千位分隔符,设定小数点位数,设定前缀或后缀等等。 代码实现 下面通过个人的经验,总结了三种实现方式。 方式一:使用正则表达式 JavaScript格式化数字…

    JavaScript 2023年5月27日
    00
  • js判断是否有中文的脚本_js判断中文方法集合 原创

    标题:JS判断是否有中文的脚本 JS代码: /** * 判断字符串中是否存在中文字符 * @param {string} str – 待判断的字符串 * @returns {boolean} – 如果存在中文字符则返回true,否则返回false */ function hasChineseCharacter(str) { // 使用正则表达式进行匹配 va…

    JavaScript 2023年5月19日
    00
  • js中传递特殊字符(+,&)的方法

    当需要在JavaScript中传递特殊字符(+,&)时,可以使用URL编码方式来避免出现意外的错误。 URL编码指的是将字符串中的某些特殊字符,转换成%xx的形式。其中xx是字符对应的ASCII码的十六进制表示。使用encodeURI()方法可以对整个URL进行编码,而使用encodeURIComponent()方法则可以编码特定的参数。值得注意的是…

    JavaScript 2023年5月19日
    00
  • webpack打包js文件及部署的实现方法

    接下来我会详细讲解“webpack打包js文件及部署的实现方法”的完整攻略,包含以下内容: 准备工作 安装webpack 配置webpack 打包js文件 部署实现方法 示例说明 1. 准备工作 在开始使用Webpack打包JS文件之前,我们需要先准备一些基本的工具和环境。首先需要确保已经安装了Node.js和npm(Node.js的包管理器)。 2. 安装…

    JavaScript 2023年5月27日
    00
  • JavaScript中如何判断对象是否为空的方法

    JavaScript中判断对象是否为空可以通过以下方法: 使用Object.keys()方法判断对象是否为空 Object.keys()方法可以返回一个由指定对象的所有可枚举属性组成的数组,如果对象没有任何可枚举的属性,则返回空数组,因此可以通过判断Object.keys()方法返回的数组长度是否为0来判断对象是否为空。 示例代码: const emptyO…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部