本文详细解析了JavaScript基础知识和常见面试题型,并提供了JS大厂面试真题的实战案例和解答技巧,帮助读者系统地复习和准备面试。文中涵盖了数据类型、变量、运算符、流程控制语句等基础内容,以及原型链、异步编程、DOM操作和常用算法等高阶概念。
数据类型
JavaScript中的数据类型主要分为两种:基本数据类型(Primitive Types)和引用数据类型(Reference Types)。
基本数据类型(Primitive Types)
number
:用于整数和浮点数。string
:用于文本。boolean
:用于真假值。undefined
:表示未定义的值。null
:表示空值。symbol
:表示唯一值。bigint
:用于表示整数,可以比 Number
更大的整数。object
:包括数组(Array)、对象(Object)、函数(Function)、日期(Date)、正则表达式(RegExp)等。变量声明与赋值
在JavaScript中,可以使用var
、let
和const
来声明变量。
使用 var
声明变量
var name = "Alice"; var age = 25; console.log(name); // 输出 "Alice" console.log(age); // 输出 25
使用 let
声明变量
let name = "Alice"; let age = 25; console.log(name); // 输出 "Alice" console.log(age); // 输出 25
const
声明变量
const PI = 3.14; console.log(PI); // 输出 3.14 // PI = 3.14159; // 错误:常量不能重新赋值
基本类型与引用类型的区别
基本类型
算术运算符
+
:加法-
:减法*
:乘法/
:除法%
:取模++
:递增--
:递减示例:
let x = 10; let y = 5; let sum = x + y; // sum = 15 let diff = x - y; // diff = 5 let product = x * y; // product = 50 let quotient = x / y; // quotient = 2 let remainder = x % y; // remainder = 0 x++; // x = 11 y--; // y = 4
逻辑运算符
&&
:逻辑与||
:逻辑或!
:逻辑非示例:
let a = true; let b = false; console.log(a && b); // 输出 false console.log(a || b); // 输出 true console.log(!a); // 输出 false
比较运算符
==
:相等,忽略类型===
:严格相等,同时比较值和类型>
:大于<
:小于>=
:大于等于<=
:小于等于示例:
let num1 = 5; let num2 = "5"; console.log(num1 == num2); // 输出 true console.log(num1 === num2); // 输出 false console.log(num1 > num2); // 输出 false console.log(num1 >= num2); // 输出 true
位运算符
&
:按位与|
:按位或^
:按位异或~
:按位非<<
:左移>>
:右移>>>
:无符号右移示例:
let x = 10; // 二进制:1010 let y = 6; // 二进制:0110 console.log(x & y); // 输出 2 (二进制:0010) console.log(x | y); // 输出 14 (二进制:1110) console.log(x ^ y); // 输出 12 (二进制:1100) console.log(~x); // 输出 -11 (二进制:1011) console.log(x << 1); // 输出 20 (二进制:10100) console.log(x >> 1); // 输出 5 (二进制:101) console.log(x >>> 1); // 输出 5 (二进制:0101)
赋值运算符
=
:普通赋值+=
:加并赋值-=
:减并赋值*=
:乘并赋值/=
:除并赋值%=
:取模并赋值示例:
let num = 10; num += 5; // num = 15 num -= 2; // num = 13 num *= 2; // num = 26 num /= 2; // num = 13 num %= 3; // num = 1
条件语句
if...else
let age = 18; if (age >= 18) { console.log("成年人"); } else { console.log("未成年人"); }
let grade = "A"; switch (grade) { case "A": console.log("优秀"); break; case "B": console.log("良好"); break; default: console.log("一般"); }
循环语句
for
for (let i = 0; i < 5; i++) { console.log(i); }
while
let i = 0; while (i < 5) { console.log(i); i++; }
let i = 0; do { console.log(i); i++; } while (i < 5);
跳转语句
break
for (let i = 0; i < 10; i++) { if (i === 5) { break; } console.log(i); }
for (let i = 0; i < 10; i++) { if (i % 2 === 0) { continue; } console.log(i); }
常见的JS面试题类型包括但不限于:
基础语法和概念理解
null
和 undefined
的区别。var
let
const
的区别。原型和继承
例如:
function Animal(name) { this.name = name; }
Animal.prototype.sayName = function() {
console.log(this.name);
};
function Dog(name) {
Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const dog = new Dog("汪汪");
dog.sayName(); // 输出 "汪汪"
异步编程
例如:
Promise
实现异步操作?async
和 await
的使用。const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("成功"); }, 1000); });
promise.then((result) => {
console.log(result); // 输出 "成功"
});
async function testAsync() {
try {
const result = await promise;
console.log(result); // 输出 "成功"
} catch (error) {
console.error(error);
}
}
testAsync();
DOM 操作
let element = document.getElementById("example"); console.log(element); element.setAttribute("class", "new-class"); element.addEventListener("click", () => { console.log("元素被点击了"); });
常用算法和数据结构
例如:
function bubbleSort(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; }
console.log(bubbleSort([5, 3, 8, 1, 2])); // 输出 [1, 2, 3, 5, 8]
理解原型链
[[Prototype]]
属性,该属性指向它的原型对象。原型链是从一个对象开始,依次通过 [[Prototype]]
属性连接到下一个对象,直到连接到 null
为止。示例代码:
function Person(name) { this.name = name; } Person.prototype.sayName = function() { console.log(this.name); }; const person = new Person("Alice"); person.sayName(); // 输出 "Alice"
Promise
then
方法进行链式操作。示例代码:
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("成功"); }, 1000); }); promise.then((result) => { console.log(result); // 输出 "成功" });
async/await
示例代码:
async function testAsync() { try { const result = await new Promise((resolve) => { setTimeout(() => { resolve("成功"); }, 1000); }); console.log(result); // 输出 "成功" } catch (error) { console.error(error); } } testAsync();
原型链
[[Prototype]]
。示例代码:
function Person(name) { this.name = name; } Person.prototype.sayName = function() { console.log(this.name); }; const person = new Person("Alice"); person.sayName(); // 输出 "Alice"
异步编程
Promise
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("成功"); }, 1000); }); promise.then((result) => { console.log(result); // 输出 "成功" });
async/await
async function testAsync() { try { const result = await new Promise((resolve) => { setTimeout(() => { resolve("成功"); }, 1000); }); console.log(result); // 输出 "成功" } catch (error) { console.error(error); } } testAsync();
DOM操作
获取元素
let element = document.getElementById("example"); console.log(element);
修改属性
element.setAttribute("class", "new-class");
element.addEventListener("click", () => { console.log("元素被点击了"); });
常用算法与数据结构
冒泡排序
function bubbleSort(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } console.log(bubbleSort([5, 3, 8, 1, 2])); // 输出 [1, 2, 3, 5, 8]
基础知识复习
深入理解高阶概念
编写高质量代码
准备模拟面试
function add(a, b) { return a + b; } console.log(add(1, 2)); // 输出 3
准备自我介绍
解释 JavaScript 中的原型链
[[Prototype]]
属性,该属性指向它的原型对象。原型链是从一个对象开始,依次通过 [[Prototype]]
属性连接到下一个对象,直到连接到 null
为止。示例代码:
function Person(name) { this.name = name; } Person.prototype.sayName = function() { console.log(this.name); }; const person = new Person("Alice"); person.sayName(); // 输出 "Alice"
解释 Promise
和 async/await
Promise
是一种表示异步操作状态的对象,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。Promise
可以通过 then
方法进行链式操作。
async/await
是一种更简洁的异步操作语法,它们基于 Promise
实现。async
函数返回一个 Promise
,await
关键字可以等待一个 Promise
的完成,然后继续执行后续的代码。示例代码:
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("成功"); }, 1000); }); promise.then((result) => { console.log(result); // 输出 "成功" }); async function testAsync() { try { const result = await promise; console.log(result); // 输出 "成功" } catch (error) { console.error(error); } } testAsync();
解释 this
的指向
this
关键字在 JavaScript 中表示当前对象的上下文。this
的指向取决于调用函数的方式:
this
指向全局对象(window
)。this
指向该对象。this
指向新创建的对象。call
、apply
和 bind
等方法可以手动改变 this
的指向。示例代码:
function sayName() { console.log(this.name); } const person = { name: "Alice", sayName: sayName }; person.sayName(); // 输出 "Alice" sayName.call(person); // 输出 "Alice"
解释 let
与 var
的区别
var
声明的变量具有全局作用域或函数作用域,会进行变量提升。
let
声明的变量具有块级作用域,不会进行变量提升。const
声明的变量同样具有块级作用域,且一旦赋值后不可更改。示例代码:
var x = 10; console.log(x); // 输出 10 var x = 20; console.log(x); // 输出 20 let y = 10; console.log(y); // 输出 undefined,let 不会进行变量提升 let y = 20; console.log(y); // 输出 SyntaxError: Identifier 'y' has already been declared
解释闭包
示例代码:
function outer() { let outerVar = "外层变量"; function inner() { console.log(outerVar); } return inner; } const innerFunc = outer(); innerFunc(); // 输出 "外层变量"
函数定义
函数声明
function add(a, b) { return a + b; } console.log(add(1, 2)); // 输出 3
const add = function(a, b) { return a + b; }; console.log(add(1, 2)); // 输出 3
闭包
示例代码:
function outer() { let outerVar = "外层变量"; function inner() { console.log(outerVar); } return inner; } const innerFunc = outer(); innerFunc(); // 输出 "外层变量"
箭头函数
const add = (a, b) => a + b; console.log(add(1, 2)); // 输出 3
模板字符串
const name = "Alice"; const age = 25; console.log(`姓名:${name},年龄:${age}`); // 输出 "姓名:Alice,年龄:25"
解构赋值
const person = { name: "Alice", age: 25 }; const { name, age } = person; console.log(name, age); // 输出 "Alice 25"
箭头函数与 this
this
是根据函数调用时的执行上下文决定的。示例代码:
const obj = { name: "Alice", sayName: () => console.log(this.name) }; const sayName = obj.sayName; sayName.call(obj); // 输出 "Alice"
Promise
示例代码:
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("成功"); }, 1000); }); promise.then((result) => { console.log(result); // 输出 "成功" });
async/await
Promise
实现,使异步代码看起来更像同步代码。示例代码:
const fetchUser = async () => { const response = await fetch("https://api.example.com/user"); const data = await response.json(); return data; }; fetchUser().then((user) => { console.log(user); });
全面复习
function add(a, b) { return a + b; } console.log(add(1, 2)); // 输出 3
模拟面试
调整心态
持续学习
项目经验
社区交流
编写高质量代码
反思与总结