引言

JavaScript(JS)作为前端开发的核心技术之一,其面试是许多求职者面临的挑战。为了帮助大家更好地准备JS面试,本文将提供一个详细的题库,涵盖常见的JS面试题目,并提供解题思路和示例代码。通过学习这些题目,你可以提升自己的JS技能,增加面试通关的概率。

第一章:基础语法

1.1 数据类型

主题句:JavaScript有几种基本的数据类型?

解答:JavaScript有7种基本数据类型:String、Number、Boolean、Undefined、Null、Symbol和BigInt。

示例代码

let str = "Hello, World!"; // String
let num = 42; // Number
let bool = true; // Boolean
let und = undefined; // Undefined
let nul = null; // Null
let sym = Symbol("unique"); // Symbol
let bigInt = 1234567890123456789012345678901234567890n; // BigInt

1.2 变量声明

主题句:JavaScript中有哪些变量声明方式?

解答:JavaScript中有三种变量声明方式:var、let和const。

示例代码

var a = 1;
let b = 2;
const c = 3;

1.3 基本操作符

主题句:JavaScript中有哪些基本操作符?

解答:JavaScript中的基本操作符包括算术操作符、比较操作符、逻辑操作符、赋值操作符等。

示例代码

let x = 5;
let y = 3;

// 算术操作符
let sum = x + y; // 8
let diff = x - y; // 2
let prod = x * y; // 15
let quot = x / y; // 1.666...

// 比较操作符
let isEq = x === y; // false
let isNeq = x !== y; // true

// 逻辑操作符
let and = (x > 0) && (y > 0); // true
let or = (x > 0) || (y > 0); // true
let not = !(x > 0); // false

第二章:函数与作用域

2.1 函数定义

主题句:如何定义JavaScript函数?

解答:JavaScript中有两种定义函数的方式:函数声明和函数表达式。

示例代码

// 函数声明
function sayHello() {
  console.log("Hello!");
}

// 函数表达式
let sayHi = function() {
  console.log("Hi!");
};

2.2 作用域

主题句:JavaScript中的作用域有哪些?

解答:JavaScript中的作用域分为全局作用域和局部作用域。

示例代码

var globalVar = "I'm global"; // 全局作用域

function func() {
  var localVar = "I'm local"; // 局部作用域
  console.log(localVar); // I'm local
}

console.log(globalVar); // I'm global
console.log(localVar); // ReferenceError: localVar is not defined

第三章:对象与原型

3.1 对象创建

主题句:如何创建JavaScript对象?

解答:JavaScript中有多种创建对象的方式,包括对象字面量、构造函数和类。

示例代码

// 对象字面量
let person = {
  name: "Alice",
  age: 25
};

// 构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

let bob = new Person("Bob", 30);

// 类
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

let carol = new Person("Carol", 28);

3.2 原型链

主题句:什么是原型链?

解答:原型链是JavaScript中实现继承的一种机制,它允许一个对象通过其原型链访问另一个对象的方法和属性。

示例代码

function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log(this.name);
};

function Dog(name) {
  Animal.call(this, name);
}

Dog.prototype = new Animal();

let myDog = new Dog("Buddy");
myDog.sayName(); // Buddy

第四章:异步编程

4.1 回调函数

主题句:什么是回调函数?

解答:回调函数是一种函数,它作为参数传递给另一个函数,并在适当的时候被调用。

示例代码

function fetchData(callback) {
  // 模拟异步操作
  setTimeout(() => {
    let data = "Fetched data";
    callback(data);
  }, 1000);
}

function processData(data) {
  console.log(data);
}

fetchData(processData); // 1秒后输出 "Fetched data"

4.2 Promise

主题句:什么是Promise?

解答:Promise是一个对象,它表示一个异步操作的结果,这个结果可以是成功(resolved)或失败(rejected)。

示例代码

let promise = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    let success = true;
    if (success) {
      resolve("Success!");
    } else {
      reject("Error!");
    }
  }, 1000);
});

promise.then(result => {
  console.log(result); // Success!
}).catch(error => {
  console.log(error); // Error!
});

4.3 async/await

主题句:什么是async/await?

解答:async/await是JavaScript中用于处理异步操作的语法糖,它使得异步代码的编写和阅读更加直观。

示例代码

async function fetchData() {
  let data = await fetch("https://api.example.com/data");
  return data.json();
}

fetchData().then(json => {
  console.log(json); // 解析后的JSON数据
});

第五章:ES6+新特性

5.1 模板字符串

主题句:什么是模板字符串?

解答:模板字符串是ES6中引入的一种新的字符串表示方法,它可以包含变量和表达式。

示例代码

let name = "Alice";
let age = 25;

let msg = `My name is ${name}, and I am ${age} years old.`;
console.log(msg); // My name is Alice, and I am 25 years old.

5.2 箭头函数

主题句:什么是箭头函数?

解答:箭头函数是ES6中引入的一种更简洁的函数声明方式。

示例代码

let numbers = [1, 2, 3, 4, 5];
let squares = numbers.map(x => x * x);
console.log(squares); // [1, 4, 9, 16, 25]

5.3 解构赋值

主题句:什么是解构赋值?

解答:解构赋值是ES6中引入的一种新的赋值语法,它允许你同时从多个源中提取多个值。

示例代码

let person = {
  name: "Alice",
  age: 25
};

let { name, age } = person;
console.log(name); // Alice
console.log(age); // 25

结语

通过以上对JavaScript面试必备题库的详细解析,相信你已经对JS面试有了更深入的了解。不断练习这些题目,提升自己的JS技能,祝你在面试中取得好成绩!