1. JavaScript中的基本数据类型有哪些?
JavaScript中的基本数据类型包括:
- Number:数字类型,包括整数和小数。
- String:字符串类型,由一系列字符组成。
- Boolean:布尔类型,表示真(true)或假(false)。
- Null:空值类型,表示一个空对象引用。
- Undefined:未定义类型,表示一个未初始化的变量。
- Symbol:符号类型,表示独一无二的值。
let num = 5; // Number
let str = 'Hello'; // String
let bool = true; // Boolean
let nullVar = null; // Null
let undefinedVar; // Undefined
let sym = Symbol('sym'); // Symbol
2. 如何理解JavaScript中的严格模式?
JavaScript的严格模式(strict mode)是一种为了消除JavaScript中一些不合理、不安全或不可预测的行为而设定的模式。它通过一系列的规则来限制这些行为,提高代码的可读性和健壮性。
function test() {
'use strict';
this = null; // 严格模式下,this默认为undefined
}
test();
3. 介绍JavaScript中的闭包。
闭包是JavaScript中的一个高级特性,指的是那些能够访问自由变量的函数。即使这些变量已经离开了作用域,闭包依然可以访问它们。
function createCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = createCounter();
console.log(counter()); // 0
console.log(counter()); // 1
4. 如何判断一个对象是否是数组?
可以使用Array.isArray()方法来判断一个对象是否为数组。
let array = [1, 2, 3];
console.log(Array.isArray(array)); // true
let obj = {a: 1, b: 2};
console.log(Array.isArray(obj)); // false
5. 什么是原型链?
原型链是JavaScript中对象继承的机制。每个对象都有一个原型(prototype),原型是一个对象,它具有一个指向另一个原型的链接,最终指向Object.prototype。
function Animal(name) {
this.name = name;
}
Animal.prototype.sayName = function() {
console.log(this.name);
};
let dog = new Animal('Dog');
dog.sayName(); // Dog
console.log(dog.__proto__ === Animal.prototype); // true
console.log(dog.__proto__.__proto__ === Object.prototype); // true
6. 什么是异步编程?介绍常见的异步编程方法。
异步编程是一种让代码在等待某些操作(如网络请求、文件读写等)完成时,不会阻塞主线程,从而提高程序执行效率的编程方式。常见的异步编程方法有:
- 回调函数:将异步操作的回调函数作为参数传递给需要执行的操作。
- Promise:代表一个可能异步完成的操作的结果。
- Generator:生成器函数,可以暂停函数的执行,并在适当的时候恢复。
// 回调函数
function fetchData(callback) {
setTimeout(() => {
callback('Data fetched');
}, 1000);
}
fetchData((data) => {
console.log(data); // Data fetched
});
// Promise
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise resolved');
}, 1000);
});
promise.then((data) => {
console.log(data); // Promise resolved
});
// Generator
function* generator() {
yield 'Generator 1';
yield 'Generator 2';
}
let gen = generator();
console.log(gen.next().value); // Generator 1
console.log(gen.next().value); // Generator 2
7. 介绍事件循环(Event Loop)。
事件循环(Event Loop)是JavaScript执行异步代码的核心机制。它负责执行异步操作、处理回调函数、处理定时器等任务。事件循环可以分为以下几个阶段:
- 检查阶段:检查是否有正在执行的同步代码。
- 执行回调:执行所有微任务(如Promise的回调)。
- 检查阶段:再次检查是否有正在执行的同步代码。
- 执行宏任务:执行所有宏任务(如定时器、异步网络请求等)。
- 检查阶段:重复以上步骤。
console.log('1');
setTimeout(() => {
console.log('2');
});
new Promise((resolve) => {
console.log('3');
resolve();
}).then(() => {
console.log('4');
});
console.log('5');
// 输出顺序:1 3 5 4 2
8. 介绍ES6中的模块化。
ES6引入了模块化(module)的概念,使得JavaScript代码的模块化管理更加方便。模块化主要有以下几种方式:
- CommonJS:Node.js使用的一种模块化方式,通过
require和module.exports实现模块的导入和导出。 - AMD:异步模块定义,通过
define和require实现模块的导入和导出。 - ES6模块:使用
import和export关键字实现模块的导入和导出。
// CommonJS
// a.js
let a = 1;
module.exports = a;
// b.js
let a = require('./a');
console.log(a);
// ES6模块
// a.js
export let a = 1;
// b.js
import { a } from './a';
console.log(a);
9. 如何解决跨域问题?
跨域问题是指由于浏览器的同源策略(Same-Origin Policy)导致不同源(域名、协议、端口)之间的JavaScript代码无法直接通信。常见的解决跨域问题的方法有:
- CORS:服务器设置
Access-Control-Allow-Origin响应头,允许来自不同源的请求。 - JSONP:利用
<script>标签的跨域能力,通过动态创建<script>标签来请求跨域数据。 - 代理:通过代理服务器转发请求,绕过同源策略的限制。
// CORS
// 服务端设置
res.header('Access-Control-Allow-Origin', '*');
// JSONP
// 客户端
function jsonp(url, callback) {
let script = document.createElement('script');
script.src = `${url}?callback=${callback}`;
document.body.appendChild(script);
}
jsonp('https://example.com/data', (data) => {
console.log(data);
});
// 代理
// 客户端
fetch('/proxy?url=https://example.com/data')
.then((response) => response.json())
.then((data) => {
console.log(data);
});
10. 介绍前端性能优化。
前端性能优化主要从以下几个方面进行:
- 代码优化:减少代码体积、避免不必要的DOM操作、使用高效的算法等。
- 资源优化:使用CDN加速、压缩图片和CSS/JS文件、使用懒加载等技术。
- 浏览器缓存:利用浏览器缓存机制,减少重复请求。
- 网络优化:使用HTTP/2、减少请求次数等。
// 代码优化
function optimizedFunction() {
let a = 1;
let b = 2;
return a + b;
}
// 资源优化
// 使用CDN
// <link rel="stylesheet" href="https://cdn.example.com/css/style.css">
// 压缩图片
// <img src="compressed-image.jpg" alt="">
// 浏览器缓存
// <link rel="cache-control" href="max-age=3600">
// 网络优化
// 使用HTTP/2
// <link rel="http2-only" href="https://example.com">
总结
以上就是JavaScript入门必备的常见面试题详解与实战答案。希望这篇文章能帮助大家更好地掌握JavaScript,提高面试成功率。在实际开发中,还需要不断学习和积累,才能成为一名优秀的JavaScript开发者。
