JavaScript 的基本数据类型有哪些?
-
说明:JavaScript 中有七种基本数据类型:
undefined
、null
、boolean
、number
、string
、symbol
(ES6 引入)和bigint
(ES11 引入)。 -
示例:
let num = 10; // number let str = "Hello"; // string let isTrue = true; // boolean let nothing = null; // null let notDefined; // undefined let sym = Symbol(); // symbol let bigInt = BigInt(123); // bigint
什么是闭包?
- 说明:闭包是指一个函数能够访问其外部作用域的变量,即使外部函数已经返回。闭包可以用来创建私有变量。
-
示例:
function outer() { let count = 0; return function inner() { count++; console.log(count); }; } const increment = outer(); increment(); // 1 increment(); // 2
解释原型链的概念。
-
说明:JavaScript 中的对象通过原型链继承属性和方法。每个对象都有一个
__proto__
属性,指向其构造函数的原型。 -
示例:
function Person(name) { this.name = name; } Person.prototype.greet = function() { console.log(`Hello, my name is ${this.name}`); }; const john = new Person('John'); john.greet(); // Hello, my name is John
JavaScript 中的 this
是什么?
-
说明:
this
是一个动态绑定的关键字,指向函数执行时的上下文。它的值取决于调用函数的方式。 -
示例:
const obj = { name: 'Alice', greet() { console.log(`Hello, ${this.name}`); } }; obj.greet(); // Hello, Alice const greetFunc = obj.greet; greetFunc(); // Hello, undefined (在非严格模式下)
解释 ==
和 ===
的区别。
-
说明:
==
是宽松比较,会进行类型转换;===
是严格比较,不会进行类型转换。 -
示例:
console.log(0 == '0'); // true console.log(0 === '0'); // false
什么是 Promise?如何使用?
-
说明:Promise 是用于处理异步操作的对象,表示一个可能在将来某个时间点完成的操作。它有三种状态:
pending
(进行中)、fulfilled
(已完成)、rejected
(已失败)。 -
示例:
const fetchData = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Data fetched!'); }, 1000); }); }; fetchData().then(data => console.log(data)); // 1秒后输出 "Data fetched!"
什么是 async/await?
-
说明:
async/await
是基于 Promise 的语法糖,使异步代码看起来更像同步代码。async
声明一个异步函数,await
用于等待 Promise 完成。 -
示例:
const fetchData = () => { return new Promise((resolve) => { setTimeout(() => { resolve('Data fetched!'); }, 1000); }); }; const fetchAsyncData = async () => { const data = await fetchData(); console.log(data); }; fetchAsyncData(); // 1秒后输出 "Data fetched!"
解释事件冒泡和事件捕获。
-
说明:事件冒泡是指事件从目标元素向上冒泡到父元素的过程;事件捕获是指事件从父元素向下传播到目标元素的过程。可以通过
addEventListener
的第三个参数控制。 -
示例:
<div id="parent"> <button id="child">Click me</button> </div> <script> const parent = document.getElementById('parent'); const child = document.getElementById('child'); parent.addEventListener('click', () => { console.log('Parent clicked'); }, false); // false 为冒泡,true 为捕获 child.addEventListener('click', () => { console.log('Child clicked'); }, false); </script>
什么是节流(throttling)和防抖(debouncing)?
-
说明:节流是指限制某个函数在一定时间内只能执行一次;防抖是指在事件触发后等待一段时间,如果在这段时间内又触发了事件,则重新计时。
-
示例(节流):
function throttle(fn, delay) { let lastTime = 0; return function(...args) { const now = Date.now(); if (now - lastTime > delay) { lastTime = now; fn.apply(this, args); } }; }
-
示例(防抖):
function debounce(fn, delay) { let timer; return function(...args) { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, delay); }; }
解释浅拷贝和深拷贝的区别。
-
说明:浅拷贝只复制对象的第一层属性,若属性是引用类型,复制的是地址;深拷贝则递归复制所有层级的属性。
-
示例(浅拷贝):
const original = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, original); shallowCopy.b.c = 3; console.log(original.b.c); // 3 (原对象也受到影响)
-
示例(深拷贝):
const original = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.b.c = 3; console.log(original.b.c); // 2 (原对象没有受到影响)