【前端开发】四. JS内置函数
JavaScript 内置函数全面指南
一、全局函数
1. 类型转换函数
// 转换为数字
console.log(Number("42")); // 42
console.log(parseInt("100px")); // 100
console.log(parseFloat("3.14")); // 3.14// 转换为字符串
console.log(String(123)); // "123"
console.log((42).toString()); // "42"// 转换为布尔值
console.log(Boolean(1)); // true
console.log(Boolean(0)); // false
2. 编码解码函数
// URI 编码
const uri = "https://example.com/测试页面";
console.log(encodeURI(uri)); // "https://example.com/%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A2"
console.log(encodeURIComponent(uri)); // "https%3A%2F%2Fexample.com%2F%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A2"// URI 解码
const encoded = "https%3A%2F%2Fexample.com%2Fpage%3Fq%3D%E6%B5%8B%E8%AF%95";
console.log(decodeURI(encoded)); // "https://example.com/page?q=测试"
console.log(decodeURIComponent(encoded)); // "https://example.com/page?q=测试"
3. 数值处理函数
// 检查有限数
console.log(isFinite(123)); // true
console.log(isFinite(Infinity)); // false// 检查 NaN
console.log(isNaN(123)); // fal
console.log(isNaN("abc")); // true// 浮点数解析
console.log(parseFloat("3.14abc")); // 3.14
console.log(parseInt("1010", 2)); // 10 (二进制解析)
二、数组方法
1. 基本操作方法
const fruits = ["Apple", "Banana"];// 添加/删除元素
fruits.push("Orange"); // 末尾添加
fruits.pop(); // 末尾删除
fruits.unshift("Mango"); // 开头添加
fruits.shift(); // 开头删除// 修改数组
fruits.splice(1, 0, "Kiwi"); // 在索引1处插入"Kiwi"
fruits.splice(1, 1); // 删除索引1的元素// 合并数组
const moreFruits = ["Grape", "Pineapple"];
const allFruits = fruits.concat(moreFruits);
2. 遍历方法
const numbers = [1, 2, 3, 4, 5];// forEach - 遍历元素
numbers.forEach((num, index) => {console.log(`Index ${index}: ${num}`);
});// map - 转换数组
const squared = numbers.map(num => num * num); // [1, 4, 9, 16, 25]// filter - 过滤元素
const evenNumbers = numbers.filter(num => num % 2 === 0); // [2, 4]// reduce - 累积计算
const sum = numbers.reduce((acc, num) => acc + num, 0); // 15// find/findIndex - 查找元素
const firstEven = numbers.find(num => num % 2 === 0); // 2
const firstEvenIndex = numbers.findIndex(num => num % 2 === 0); // 1
3. 排序和搜索
const scores = [95, 78, 85, 60, 92];// 排序
scores.sort((a, b) => a - b); // [60, 78, 85, 92, 95]// 反转
scores.reverse(); // [95, 92, 85, 78, 60]// 搜索
console.log(scores.includes(85)); // true
console.log(scores.indexOf(92)); // 1
console.log(scores.lastIndexOf(95)); // 0// 检查条件
console.log(scores.every(score => score > 50)); // true
console.log(scores.some(score => score > 90)); // true
三、字符串方法
1. 基本操作方法
const text = "JavaScript is awesome!";// 获取长度
console.log(text.length); // 23// 获取字符
console.log(text.charAt(4)); // 'S'
console.log(text[4]); // 'S' (类似数组访问)
console.log(text.charCodeAt(0)); // 74 (J的Unicode)// 提取子串
console.log(text.substring(0, 10)); // "JavaScript"
console.log(text.slice(-9)); // "awesome!"
console.log(text.substr(11, 2)); // "is"// 大小写转换
console.log(text.toUpperCase()); // "JAVASCRIPT IS AWESOME!"
console.log(text.toLowerCase()); // "javascript is awesome!"
2. 搜索和替换
const message = "Hello, world! Welcome to JavaScript world.";// 搜索
console.log(message.indexOf("world")); // 7
console.log(message.lastIndexOf("world")); // 32
console.log(message.includes("JavaScript")); // true
console.log(message.startsWith("Hello")); // true
console.log(message.endsWith("world.")); // true// 替换
console.log(message.replace("world", "Earth"));
// "Hello, Earth! Welcome to JavaScript world."// 全局替换
console.log(message.replace(/world/g, "Earth"));
// "Hello, Earth! Welcome to JavaScript Earth."// 正则表达式匹配
const matches = message.match(/[A-Z]\w+/g);
console.log(matches); // ["Hello", "Welcome", "JavaScript"]
3. 字符串分割和清理
const csv = "apple,banana,orange,grape";// 分割字符串
const fruits = csv.split(",");
// ["apple", "banana", "orange", "grape"]// 连接字符串
const newText = fruits.join("; ");
// "apple; banana; orange; grape"// 清理字符串
const dirtyText = " Some text with spaces ";
console.log(dirtyText.trim()); // "Some text with spaces"
console.log(dirtyText.trimStart()); // "Some text with spaces "
console.log(dirtyText.trimEnd()); // " Some text with spaces"
四、对象方法
1. 对象属性操作
const person = {name: "Alice",age: 30,job: "Developer"
};// 获取键/值/条目
console.log(Object.keys(person)); // ["name", "age", "job"]
console.log(Object.values(person)); // ["Alice", 30, "Developer"]
console.log(Object.entries(person));
// [["name", "Alice"], ["age", 30], ["job", "Developer"]]// 合并对象
const details = { city: "New York", country: "USA" };
const fullPerson = Object.assign({}, person, details);// 冻结对象
Object.freeze(fullPerson); // 防止修改
fullPerson.age = 31; // 无效(严格模式下报错)
2. 原型和属性描述
// 创建对象
const car = Object.create({ start() { console.log("Engine started!"); }
});// 添加属性
Object.defineProperty(car, "brand", {value: "Toyota",writable: false, // 不可修改enumerable: true // 可枚举
});// 获取属性描述符
console.log(Object.getOwnPropertyDescriptor(car, "brand"));// 设置原型
const electricCar = { battery: "100kWh" };
Object.setPrototypeOf(electricCar, car);
electricCar.start(); // "Engine started!"
五、数学函数 (Math 对象)
1. 基本数学运算
// 常用常数
console.log(Math.PI); // 3.141592653589793
console.log(Math.E); // 2.718281828459045// 取整方法
console.log(Math.round(3.6)); // 4
console.log(Math.floor(3.6)); // 3
console.log(Math.ceil(3.2)); // 4
console.log(Math.trunc(3.9)); // 3 (移除小数部分)// 绝对值
console.log(Math.abs(-5)); // 5// 幂和根
console.log(Math.pow(2, 8)); // 256
console.log(Math.sqrt(64)); // 8
console.log(Math.cbrt(27)); // 3 (立方根)
2. 随机数和最值
// 随机数
console.log(Math.random()); // 0~1之间的随机数// 生成范围随机整数
function getRandomInt(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(10, 20)); // 10~20之间的整数// 最值
console.log(Math.max(10, 20, 5, 30)); // 30
console.log(Math.min(10, 20, 5, 30)); // 5// 数组中的最值
const nums = [4, 2, 9, 5];
console.log(Math.max(...nums)); // 9
六、日期函数 (Date 对象)
1. 创建和获取日期
// 创建日期
const now = new Date();
const specificDate = new Date(2023, 5, 15, 10, 30); // 月份0-11
const isoDate = new Date("2023-06-15T10:30:00Z");// 获取日期组件
console.log(now.getFullYear()); // 当前年份
console.log(now.getMonth()); // 当前月份 (0-11)
console.log(now.getDate()); // 当前日 (1-31)
console.log(now.getDay()); // 星期几 (0-6, 0=周日)
console.log(now.getHours()); // 小时 (0-23)
console.log(now.getMinutes()); // 分钟 (0-59)
console.log(now.getSeconds()); // 秒 (0-59)
console.log(now.getMilliseconds());// 毫秒 (0-999)
console.log(now.getTime()); // 时间戳 (毫秒数)// UTC 方法
console.log(now.getUTCHours()); // UTC小时
2. 设置和格式化日期
const date = new Date();// 设置日期
date.setFullYear(2024);
date.setMonth(11); // 12月
date.setDate(25);
date.setHours(15);
date.setMinutes(45);// 日期计算
date.setDate(date.getDate() + 7); // 加7天// 格式化
console.log(date.toISOString()); // "2024-12-25T15:45:00.000Z"
console.log(date.toLocaleDateString()); // 本地格式日期
console.log(date.toLocaleTimeString()); // 本地格式时间// 自定义格式化
function formatDate(date) {return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
}
console.log(formatDate(date)); // "2024-12-25"
七、JSON 方法
1. JSON 序列化和解析
const person = {name: "Bob",age: 35,hobbies: ["reading", "hiking"],isAdmin: true,birthDate: new Date()
};// 序列化为 JSON 字符串
const jsonString = JSON.stringify(person);
console.log(jsonString);
// {"name":"Bob","age":35,"hobbies":["reading","hiking"],"isAdmin":true,"birthDate":"2023-07-25T12:00:00.000Z"}// 解析 JSON 字符串
const parsedPerson = JSON.parse(jsonString);
console.log(parsedPerson.name); // "Bob"// 使用 reviver 函数
const revivedPerson = JSON.parse(jsonString, (key, value) => {if (key === "birthDate") return new Date(value);return value;
});
console.log(revivedPerson.birthDate.getFullYear()); // 2023
2. 高级序列化选项
// 过滤属性
console.log(JSON.stringify(person, ["name", "age"]));
// {"name":"Bob","age":35}// 自定义序列化
console.log(JSON.stringify(person, (key, value) => {if (typeof value === "string") return value.toUpperCase();return value;
}));
// {"name":"BOB","age":35,"hobbies":["READING","HIKING"],"isAdmin":true,"birthDate":"2023-07-25T12:00:00.000Z"}// 格式化输出
console.log(JSON.stringify(person, null, 2));
/*
{"name": "Bob","age": 35,"hobbies": ["reading","hiking"],"isAdmin": true,"birthDate": "2023-07-25T12:00:00.000Z"
}
*/
八、其他实用内置函数
1. 定时器函数
// 延迟执行
setTimeout(() => {console.log("This runs after 2 seconds");
}, 2000);// 定期执行
let counter = 0;
const intervalId = setInterval(() => {console.log(`Counter: ${++counter}`);if (counter >= 5) clearInterval(intervalId);
}, 1000);// 立即执行(当前事件循环结束后)
setImmediate(() => {console.log("This runs immediately after the current operation");
});// 下一帧执行
requestAnimationFrame(() => {console.log("Runs before the next repaint");
});
2. 错误处理函数
// 抛出错误
function divide(a, b) {if (b === 0) throw new Error("Division by zero");return a / b;
}// 捕获错误
try {const result = divide(10, 0);console.log(result);
} catch (error) {console.error("Error occurred:", error.message);
} finally {console.log("This always runs");
}// 创建错误对象
const customError = new Error("Custom error");
customError.code = 500;
console.log(customError.stack); // 错误堆栈
3. Promise 相关函数
// 创建 Promise
const fetchData = () => new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve("Data received") : reject(new Error("Request failed"));}, 1000);
});// 使用 Promise
fetchData().then(data => console.log(data)).catch(err => console.error(err));// Promise 工具方法
const promises = [Promise.resolve(1),Promise.resolve(2),Promise.reject(new Error("Failed"))
];Promise.all(promises) // 全部成功.catch(err => console.log("All failed:", err));Promise.allSettled(promises) // 全部完成.then(results => console.log(results));Promise.race(promises) // 第一个完成.then(result => console.log("First:", result));Promise.any(promises) // 第一个成功.then(result => console.log("First success:", result));
九、最佳实践与性能技巧
1. 函数选择指南
场景 | 推荐函数 | 原因 |
数组遍历 | forEach/map | 简洁、函数式编程 |
数组过滤 | filter | 可读性强 |
数组搜索 | find/findIndex | 优于循环+break |
对象复制 | Object.assign/展开运算符 | 避免引用问题 |
深度复制 | JSON.parse(JSON.stringify()) | 简单有效 |
异步操作 | async/await | 优于回调/Promise链 |
2. 性能优化技巧
// 1. 避免在循环中创建函数
// 差
for (let i = 0; i < 1000; i++) {element.addEventListener('click', () => doSomething(i));
}// 优
function createHandler(i) {return () => doSomething(i);
}
for (let i = 0; i < 1000; i++) {element.addEventListener('click', createHandler(i));
}// 2. 使用 Map 替代对象存储键值对(大量数据时)
const largeDataMap = new Map();
for (let i = 0; i < 100000; i++) {largeDataMap.set(`key${i}`, i);
}// 3. 使用 DocumentFragment 进行批量 DOM 操作
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const div = document.createElement('div');div.textContent = `Item ${i}`;fragment.appendChild(div);
}
document.body.appendChild(fragment);// 4. 使用 Web Workers 处理 CPU 密集型任务
const worker = new Worker('worker.js');
worker.postMessage({ data: largeArray });
worker.onmessage = (event) => {console.log('Result:', event.data);
};
十、实战应用示例
1. 数据格式转换
// API 响应数据转换
const apiResponse = {data: {users: [{ id: 1, name: "Alice", age: 30 },{ id: 2, name: "Bob", age: 25 }],meta: {page: 1,totalPages: 5}}
};// 转换为更简洁格式
const normalizedData = {users: apiResponse.data.users.map(user => ({...user,fullName: `${user.name} (ID: ${user.id})`})),pagination: apiResponse.data.meta
};console.log(normalizedData);
2. 用户输入验证
function validateForm(formData) {const errors = {};// 验证用户名if (!formData.username) {errors.username = "用户名不能为空";} else if (formData.username.length < 3) {errors.username = "用户名至少3个字符";}// 验证邮箱const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;if (!emailRegex.test(formData.email)) {errors.email = "邮箱格式不正确";}// 验证密码if (formData.password.length < 8) {errors.password = "密码至少8个字符";} else if (formData.password !== formData.confirmPassword) {errors.confirmPassword = "两次密码输入不一致";}return Object.keys(errors).length === 0 ? null : errors;
}const formData = {username: "al",email: "invalid-email",password: "1234567",confirmPassword: "12345678"
};console.log(validateForm(formData));
/*
{username: "用户名至少3个字符",email: "邮箱格式不正确",password: "密码至少8个字符",confirmPassword: "两次密码输入不一致"
}
*/
3. 日期处理工具
class DateUtils {static format(date, format = "YYYY-MM-DD") {const pad = num => num.toString().padStart(2, '0');return format.replace(/YYYY/g, date.getFullYear()).replace(/MM/g, pad(date.getMonth() + 1)).replace(/DD/g, pad(date.getDate())).replace(/HH/g, pad(date.getHours())).replace(/mm/g, pad(date.getMinutes())).replace(/ss/g, pad(date.getSeconds()));}static addDays(date, days) {const result = new Date(date);result.setDate(result.getDate() + days);return result;}static differenceInDays(date1, date2) {const diffTime = Math.abs(date2 - date1);return Math.floor(diffTime / (1000 * 60 * 60 * 24));}
}const today = new Date();
console.log(DateUtils.format(today)); // "2023-07-25"
console.log(DateUtils.format(today, "YYYY/MM/DD HH:mm:ss")); // "2023/07/25 12:30:45"const nextWeek = DateUtils.addDays(today, 7);
console.log(DateUtils.differenceInDays(today, nextWeek)); // 7