本文详细介绍了JavaScript基础知识及其在大厂面试中的应用,涵盖了变量、运算符、流程控制、函数、对象、数组等核心概念。此外,文章还提供了关于事件循环、this关键字、原型链、高阶函数等高级主题的深入解析,并通过实战真题和常见面试问题帮助读者准备面试。
JavaScript 中,变量是用来存储数据的容器。JavaScript 支持多种数据类型,包括基本数据类型和引用数据类型。
基本数据类型:
boolean
:布尔值,表示 true 或 false。number
:数字类型,可以是整数或浮点数。string
:字符串类型,用于表示文本。undefined
:表示未定义的值。null
:表示空值。symbol
(ES6 引入):表示独一无二的值。引用数据类型:
object
:表示复杂的数据结构(如数组、对象等)。function
:表示函数。示例代码:
let booleanValue = true; let numberValue = 3.14; let stringValue = "Hello, World!"; let undefinedValue = undefined; let nullValue = null; let symbolValue = Symbol("unique"); let objectValue = { name: "Alice" }; let arrayValue = [1, 2, 3]; let functionValue = function() { return "Hello"; }; console.log(booleanValue, numberValue, stringValue, undefinedValue, nullValue, symbolValue, objectValue, arrayValue, functionValue);
JavaScript 支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等。
算术运算符:
+
:加法-
:减法*
:乘法/
:除法%
:取模(取余)比较运算符:
==
:等于,进行类型转换后再比较===
:严格等于,不进行类型转换!=
:不等于,进行类型转换后再比较!==
:严格不等于,不进行类型转换<
:小于<=
:小于等于>
:大于>=
:大于等于逻辑运算符:
&&
:逻辑与||
:逻辑或!
:逻辑非示例代码:
let a = 5; let b = 10; console.log(a + b); // 15 console.log(a - b); // -5 console.log(a * b); // 50 console.log(a / b); // 0.5 console.log(a % b); // 5 console.log(a == b); // false console.log(a === b); // false console.log(a != b); // true console.log(a !== b); // true console.log(a < b); // true console.log(a <= b); // true console.log(a > b); // false console.log(a >= b); // false let condition = true; console.log(condition && false); // false console.log(condition || false); // true console.log(!condition); // false
流程控制语句用于控制程序的执行流程,包括条件语句和循环语句。
条件语句:
if-else
:
let age = 20; if (age >= 18) { console.log("成年人"); } else { console.log("未成年人"); }
switch
:
let direction = "right"; switch (direction) { case "up": console.log("向上"); break; case "down": console.log("向下"); break; case "left": console.log("向左"); break; case "right": console.log("向右"); break; default: console.log("未知方向"); }
循环语句:
for
:
for (let i = 0; i < 5; i++) { console.log("第", i, "次循环"); }
while
:
let count = 0; while (count < 5) { console.log("第", count, "次循环"); count++; }
do-while
:
let count = 0; do { console.log("第", count, "次循环"); count++; } while (count < 5);
多重条件判断和嵌套循环:
let age = 25; let job = "student"; if (age >= 18 && job === "student") { console.log("成年人学生"); } else if (age >= 18 && job === "employee") { console.log("成年人员工"); } else { console.log("未成年人"); } let numbers = [1, 2, 3, 4, 5]; for (let i = 0; i < numbers.length; i++) { for (let j = 0; j < numbers.length; j++) { if (numbers[i] + numbers[j] === 5) { console.log(numbers[i], numbers[j]); } } }
函数是可重复使用的代码块,用于执行特定任务。JavaScript 中的函数可以有参数和返回值。
函数定义:
function
关键字定义函数:
function greet(name) { return "Hello, " + name; } console.log(greet("Alice")); // 输出 "Hello, Alice"
let greet = (name) => { return "Hello, " + name; }; console.log(greet("Alice")); // 输出 "Hello, Alice"
作用域:
{}
定义的块内部声明的变量。示例代码:
let globalVar = "全局变量"; function outerFunction() { let outerVar = "外部变量"; function innerFunction() { let innerVar = "内部变量"; console.log(innerVar); // 内部变量 console.log(outerVar); // 外部变量 } innerFunction(); console.log(globalVar); // 全局变量 } outerFunction(); console.log(globalVar); // 全局变量 // console.log(outerVar); // ReferenceError: outerVar is not defined
作用域的具体应用:
function testScope() { let localVar = "局部变量"; console.log(localVar); // 局部变量 } testScope(); console.log(localVar); // ReferenceError: localVar is not defined
对象:
对象是键值对的集合,用大括号 {}
定义。键可以是任何数据类型,但通常使用字符串。
示例代码:
let person = { name: "Alice", age: 25, greet: function() { return "Hello, " + this.name; } }; console.log(person.name); // Alice console.log(person.age); // 25 console.log(person.greet()); // Hello, Alice
数组:
数组是有序数据项的集合,用方括号 []
定义。数组中的元素可以是任何类型。
示例代码:
let numbers = [1, 2, 3, 4, 5]; console.log(numbers[0]); // 1 console.log(numbers[4]); // 5 let mixedArray = ["apple", 10, true, { key: "value" }]; console.log(mixedArray[0]); // apple console.log(mixedArray[2]); // true console.log(mixedArray[3].key); // value
嵌套对象和数组的处理:
let complexArray = [ { name: "Alice", age: 25 }, { name: "Bob", age: 30 } ]; console.log(complexArray[0].name); // Alice console.log(complexArray[1].age); // 30 for (let i = 0; i < complexArray.length; i++) { console.log(complexArray[i].name); }
JavaScript 采用单线程模型,这意味着一个时间点内只能执行一个任务。事件循环(Event Loop)是 JavaScript 处理异步编程的核心机制。
事件循环的基本流程:
常见任务类型:
setTimeout
和 setInterval
这类异步任务通常会被放入任务队列。Promise
的回调函数和 process.nextTick
这类微任务通常会被放入微任务队列。示例代码:
console.log("开始执行"); setTimeout(() => { console.log("setTimeout"); }, 0); Promise.resolve() .then(() => console.log("Promise1")) .then(() => console.log("Promise2")); console.log("执行完毕");
输出结果:
开始执行 执行完毕 Promise1 Promise2 setTimeout
this
关键字在 JavaScript 中表示函数当前的执行上下文。其值取决于函数如何被调用。
不同的上下文:
this
指向全局对象(浏览器中为 window
)。this
可能指向全局对象或 undefined
(严格模式下)。this
指向对象实例。this
指向新创建的对象实例。this
,它会继承外部的 this
。示例代码:
function sayHello() { console.log("Hello, " + this.name); } let obj = { name: "Alice", sayHello: sayHello }; obj.sayHello(); // Hello, Alice sayHello(); // undefined 或 "undefined",取决于是否在严格模式下运行 let arrowFunction = () => { console.log("Hello, " + this.name); let sayHello = sayHello; sayHello(); // undefined 或 "undefined" }; arrowFunction(); // Hello, undefined
在 JavaScript 中,原型(Prototype)和原型链(Prototype Chain)是理解和操作对象继承的重要概念。
原型对象:
prototype
),该属性是一个对象,包含该函数实例的共享属性。原型链:
Object.prototype
,这是原型链的终点。示例代码:
function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log("Hello, " + this.name); }; let alice = new Person("Alice"); alice.sayHello(); // Hello, Alice console.log(alice.__proto__ === Person.prototype); // true console.log(Person.prototype.constructor === Person); // true console.log(Object.getPrototypeOf(alice) === Person.prototype); // true
高阶函数是指可以接受一个或多个函数作为参数,或者返回一个函数作为结果的函数。JavaScript 中有很多内置的高阶函数,如 Array.prototype.map
、Array.prototype.filter
、Array.prototype.reduce
等。
示例代码:
let numbers = [1, 2, 3, 4, 5]; let squared = numbers.map(num => num * num); console.log(squared); // [1, 4, 9, 16, 25] let even = numbers.filter(num => num % 2 === 0); console.log(even); // [2, 4] let sum = numbers.reduce((acc, num) => acc + num, 0); console.log(sum); // 15
复合高阶函数的应用:
let numbers = [1, 2, 3, 4, 5]; let sumOfSquares = numbers.map(num => num * num).reduce((acc, num) => acc + num, 0); console.log(sumOfSquares); // 55
JavaScript 中有许多方式实现异步编程,包括回调函数、Promise、async/await 等。
回调函数:
function sayHello(name, callback) { setTimeout(() => { console.log("Hello, " + name); callback(); }, 1000); } sayHello("Alice", () => { console.log("回调函数运行结束"); });
Promise:
function sayHello(name) { return new Promise((resolve) => { setTimeout(() => { console.log("Hello, " + name); resolve("完成"); }, 1000); }); } sayHello("Alice").then(message => { console.log("Promise 解析完成", message); });
async/await:
function sayHello(name) { return new Promise((resolve) => { setTimeout(() => { console.log("Hello, " + name); resolve("完成"); }, 1000); }); } async function main() { let result = await sayHello("Alice"); console.log("Async/Await 解析完成", result); } main();
结合实际项目的需求进行异步编程:
function fetchUser(id) { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ id: id, name: "Alice" }); }, 1000); }); } async function getUser() { let user = await fetchUser(1); console.log(user); } getUser();
ES6 引入了许多新特性,包括 let
和 const
、箭头函数、模板字符串、解构赋值等。
let 和 const:
let name = "Alice"; name = "Bob"; console.log(name); // Bob const age = 25; // age = 26; // 会报错,因为 const 变量不能重新赋值
箭头函数:
let sayHello = (name) => { console.log("Hello, " + name); }; sayHello("Alice"); // Hello, Alice
模板字符串:
let name = "Alice"; let age = 25; let message = `Hello, ${name}, you are ${age} years old.`; console.log(message); // Hello, Alice, you are 25 years old.
解构赋值:
let person = { name: "Alice", age: 25 }; let { name: newName, age: newAge } = person; console.log(newName, newAge); // Alice 25
更多应用场景的示例代码:
let [x, y, z] = [1, 2, 3]; console.log(x, y, z); // 1 2 3 let { a, b, ...rest } = { a: 1, b: 2, c: 3, d: 4 }; console.log(a, b, rest); // 1 2 { c: 3, d: 4 }
DOM(Document Object Model)是浏览器解析 HTML 生成的文档对象模型。DOM 操作是前端开发中常见的任务之一。
获取和操作元素:
let element = document.getElementById("myElement"); element.innerHTML = "新内容";
CSS 样式操作:
let element = document.getElementById("myElement"); element.style.color = "red"; element.style.fontSize = "20px";
事件处理:
let button = document.getElementById("myButton"); button.addEventListener("click", function() { console.log("按钮被点击了"); });
更多复杂场景的示例代码:
let elements = document.getElementsByClassName("item"); for (let i = 0; i < elements.length; i++) { elements[i].addEventListener("click", function() { console.log("元素被点击了"); }); } let element = document.createElement("div"); element.innerHTML = "新元素"; document.body.appendChild(element);
JavaScript 中有很多常见的陷阱和错误,了解这些陷阱和如何调试它们对于提高代码质量很重要。
常见陷阱:
this
的值取决于函数如何被调用。==
与 ===
的区别:==
会进行类型转换,===
不会。push
、pop
等会修改原数组,而 slice
和 concat
不会。let
和 const
声明的变量提升与 var
不同。NaN
与 null
的区别。undefined
与 null
的区别。示例代码:
function getZero() { return null; } let value = getZero() || 0; console.log(value); // 0 value = getZero() ?? 0; console.log(value); // 0
错误调试:
使用 console.log
输出变量值、堆栈跟踪等信息,或者使用调试工具如 Chrome DevTools 进行调试。
function divide(a, b) { console.log("a:", a, "b:", b); if (b === 0) { console.error("除数不能为0"); throw new Error("除数不能为0"); } return a / b; } try { let result = divide(10, 0); console.log(result); } catch (error) { console.error(error.message); }
复习基础知识:
做面试题:
熟悉面试流程:
自我介绍:
谈论项目经验:
谈论技术问题:
编写简洁高效的代码:
使用代码示例:
大厂面试流程通常包括以下几个阶段:
简历筛选:
技术面试:
HR 面试:
业务面试:
为何离开当前公司?
介绍一下自己:
解决技术问题:
充分准备:
保持冷静:
积极沟通:
书籍:
在线课程:
参加开源项目的实战演练是提高技能的有效方式。可以参与 GitHub 上的开源项目,如:
加入技术社区和论坛可以帮助你学习和解决问题,了解最新的技术趋势。推荐以下社区: