数组方法
修改原数组的方法
push()
pop()
shift()
unshift()
splice(从第几位开始截取, 截取的长度, 在切口处添加的新元素, ...)
sort()
reverse()
fill()
copyWithin()
不修改原数组的方法
concat(arr)
slice(start, end)
join()
toString()
toLocaleString()
forEach()
map()
filter()
reduce()
reduceRight()
some()
every()
find()
findIndex()
findLast()
findLastIndex()
flat()
flatMap()
includes()
keys()
values()
entries()
toReversed()
toSorted()
toSpliced()
with()
🏷️ 字符串方法
获取/查询
charAt(index)
charCodeAt(index)
codePointAt(index)
indexOf(search)
lastIndexOf(search)
search(regexp)
match(regexp)
matchAll(regexp)
includes(search)
startsWith(search)
endsWith(search)
修改/操作
concat(str1, str2, ...)
slice(start, end)
substring(start, end)
substr(start, length)
replace(search, replace)
replaceAll(search, replace)
toUpperCase()
toLowerCase()
toLocaleUpperCase()
toLocaleLowerCase()
trim()
trimStart() / trimLeft()
trimEnd() / trimRight()
padStart(length, pad)
padEnd(length, pad)
repeat(count)
normalize(form)
分割/转换
split(separator, limit)
toString()
valueOf()
🔢 数字方法
Number 实例方法
toFixed(digits)
toExponential(digits)
toPrecision(precision)
toLocaleString([locales[, options]])
toString([radix])
valueOf()
Number 静态方法
Number.isNaN(value)
Number.isFinite(value)
Number.isInteger(value)
Number.isSafeInteger(value)
Number.parseFloat(string)
Number.parseInt(string, radix)
Math 对象方法
Math.abs(x)
Math.sqrt(x)
Math.cbrt(x)
Math.pow(x, y)
Math.round(x)
Math.floor(x)
Math.ceil(x)
Math.trunc(x)
Math.fround(x)
Math.max(...values)
Math.min(...values)
Math.random()
Math.sin(x), Math.cos(x), Math.tan(x)
Math.asin(x), Math.acos(x), Math.atan(x)
Math.atan2(y, x)
Math.sign(x)
Math.exp(x)
Math.log(x)
Math.log10(x)
Math.log2(x)
Math.hypot(...values)
Math.clz32(x)
🗂️ 对象方法
Object 静态方法
Object.create(proto)
Object.assign(target, ...sources)
Object.fromEntries(iterable)
Object.defineProperty(obj, prop, descriptor)
Object.defineProperties(obj, props)
Object.getOwnPropertyDescriptor(obj, prop)
Object.getOwnPropertyDescriptors(obj)
Object.keys(obj)
Object.values(obj)
Object.entries(obj)
Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj)
Object.getPrototypeOf(obj)
Object.setPrototypeOf(obj, proto)
Object.is(value1, value2)
Object.isExtensible(obj)
Object.isSealed(obj)
Object.isFrozen(obj)
Object.preventExtensions(obj)
Object.seal(obj)
Object.freeze(obj)
Object.hasOwn(obj, prop)
对象实例方法(通过原型继承)
toString()
valueOf()
hasOwnProperty(prop)
isPrototypeOf(object)
propertyIsEnumerable(prop)
toLocaleString()
📚 JavaScript 常用方法详解(带示例)
📦 数组方法
修改原数组的方法
let arr1 = [1, 2];
let length = arr1.push(3, 4);
console.log(arr1);
console.log(length);
let last = arr1.pop();
console.log(arr1);
console.log(last);
let first = arr1.shift();
console.log(arr1);
console.log(first);
arr1.unshift(0, 1);
console.log(arr1);
let fruits = ['apple', 'banana', 'cherry'];
let removed = fruits.splice(1, 1);
console.log(fruits);
console.log(removed);
fruits.splice(1, 0, 'blueberry');
console.log(fruits);
fruits.splice(1, 1, 'banana');
console.log(fruits);
let numbers = [3, 1, 4, 1, 5];
numbers.sort();
console.log(numbers);
numbers.sort((a, b) => a - b);
console.log(numbers);
let users = [ { name: 'Alice', age: 30 }, { name: 'Bob', age: 25 }];
users.sort((a, b) => a.age - b.age);
console.log(users);
let arr2 = [1, 2, 3, 4];
arr2.reverse();
console.log(arr2);
let arr3 = new Array(5).fill(0);
console.log(arr3);
arr3.fill(1, 2, 4);
console.log(arr3);
let arr4 = [1, 2, 3, 4, 5];
arr4.copyWithin(0, 3, 5);
console.log(arr4);
不修改原数组的方法
// concat() - 合并数组
let arr1 = [1, 2]
let arr2 = [3, 4]
let arr3 = [5, 6]
let merged = arr1.concat(arr2, arr3)
console.log(merged)
// slice() - 提取部分数组
let arr = [1, 2, 3, 4, 5]
console.log(arr.slice(1, 3))
console.log(arr.slice(2))
console.log(arr.slice(-2))
// join() - 数组元素连接成字符串
let words = ['Hello', 'World']
console.log(words.join(' '))
console.log(words.join('-'))
// toString() - 数组转字符串
console.log([1, 2, 3].toString())
// forEach() - 遍历数组
let arr = [1, 2, 3]
arr.forEach((item, index) => {
console.log(`索引 ${index}: 值 ${item}`)
})
// map() - 映射新数组
let doubled = arr.map(item => item * 2)
console.log(doubled)
// filter() - 过滤数组
let evens = arr.filter(item => item % 2 === 0)
console.log(evens)
// find() - 查找第一个满足条件的元素
let users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' }
]
let user = users.find(u => u.id === 2)
console.log(user)
// findIndex() - 查找第一个满足条件的索引
let index = users.findIndex(u => u.name === 'Bob')
console.log(index)
// reduce() - 累积计算
let sum = [1, 2, 3, 4, 5].reduce((total, current) => total + current, 0)
console.log(sum)
// 计算对象数组的总和
let cart = [
{ name: 'Apple', price: 10 },
{ name: 'Banana', price: 20 }
]
let total = cart.reduce((sum, item) => sum + item.price, 0)
console.log(total)
// some() - 是否有元素通过测试
let hasEven = [1, 3, 5, 7].some(num => num % 2 === 0)
console.log(hasEven)
// every() - 是否所有元素通过测试
let allPositive = [1, 2, 3].every(num => num > 0)
console.log(allPositive)
// includes() - 是否包含某个值
let arr5 = [1, 2, 3]
console.log(arr5.includes(2))
console.log(arr5.includes(4))
// flat() - 扁平化数组
let nested = [1, [2, [3, [4]]]]
console.log(nested.flat())
console.log(nested.flat(2))
console.log(nested.flat(Infinity))
// flatMap() - 先映射后扁平化
let arr6 = [1, 2, 3]
let result = arr6.flatMap(x => [x, x * 2])
console.log(result)
// ES2023 新增方法
let arr7 = [3, 1, 4, 1, 5]
// toReversed() - 返回反转副本
let reversed = arr7.toReversed()
console.log(arr7)
console.log(reversed)
// toSorted() - 返回排序副本
let sorted = arr7.toSorted()
console.log(sorted)
// with() - 返回修改单个元素的副本
let modified = arr7.with(2, 99)
console.log(modified)
🏷️ 字符串方法
let str = "Hello World! Hello JavaScript!";
console.log(str.charAt(0));
console.log(str.charAt(100));
console.log(str.charCodeAt(0));
console.log(str.includes("World"));
console.log(str.includes("world"));
console.log(str.startsWith("Hello"));
console.log(str.startsWith("World"));
console.log(str.endsWith("!"));
console.log(str.indexOf("Hello"));
console.log(str.indexOf("Hello", 1));
console.log(str.lastIndexOf("Hello"));
console.log(str.slice(0, 5));
console.log(str.slice(6));
console.log(str.slice(-10));
console.log(str.substring(0, 5));
console.log(str.substring(6, 11));
console.log(str.split(" "));
console.log(str.split(" ", 2));
console.log(str.replace("Hello", "Hi"));
console.log(str.replace(/Hello/g, "Hi"));
console.log(str.replaceAll("Hello", "Hi"));
console.log("hello".toUpperCase());
console.log("HELLO".toLowerCase());
console.log(" hello world ".trim());
console.log("5".padStart(3, "0"));
console.log("5".padEnd(3, "*"));
console.log("ha".repeat(3));
let email = "test@example.com";
let match = email.match(/^(.+)@(.+)$/);
console.log(match);
let text = "test1@example.com, test2@example.com";
let matches = [...text.matchAll(/\b\w+@\w+.\w+\b/g)];
matches.forEach(m => console.log(m[0]));
console.log(str.search("World"));
console.log(str.search(/[A-Z]/));
console.log("Hello".concat(" ", "World"));
let strObj = new String("Hello");
console.log(strObj.valueOf());
🔢 数字方法
let num = 123.456789;
console.log(num.toFixed(2));
console.log(num.toFixed(0));
console.log(num.toExponential(2));
console.log(num.toPrecision(4));
console.log(num.toLocaleString('zh-CN'));
console.log(num.toLocaleString('en-US', {
style: 'currency',
currency: 'USD'
}));
console.log(num.toString());
console.log((10).toString(2));
console.log((255).toString(16));
console.log(Number.isNaN(NaN));
console.log(Number.isNaN("NaN"));
console.log(Number.isFinite(Infinity));
console.log(Number.isFinite(123));
console.log(Number.isInteger(123));
console.log(Number.isInteger(123.456));
console.log(Number.isSafeInteger(9007199254740991));
console.log(Number.isSafeInteger(9007199254740992));
console.log(Number.parseFloat("123.45px"));
console.log(Number.parseInt("1010", 2));
console.log(Math.abs(-5));
console.log(Math.sqrt(16));
console.log(Math.pow(2, 3));
console.log(Math.round(4.5));
console.log(Math.floor(4.9));
console.log(Math.ceil(4.1));
console.log(Math.trunc(4.9));
console.log(Math.max(1, 3, 2, 5));
console.log(Math.min(1, 3, 2, 5));
console.log(Math.random());
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(1, 10));
console.log(Math.sign(-5));
console.log(Math.sign(0));
console.log(Math.sign(5));
console.log(Math.sin(Math.PI / 2));
console.log(Math.cos(Math.PI));
console.log(Math.tan(Math.PI / 4));
console.log(Math.log(Math.E));
console.log(Math.log10(100));
console.log(Math.log2(8));
console.log(Math.hypot(3, 4));
console.log(Math.clz32(1));
🗂️ 对象方法
let person = {
name: 'Alice',
age: 30,
city: 'New York'
}
// Object.keys() - 获取所有键名
console.log(Object.keys(person))
// Object.values() - 获取所有值
console.log(Object.values(person))
// Object.entries() - 获取所有键值对
console.log(Object.entries(person))
// [['name', 'Alice'], ['age', 30], ['city', 'New York']]
// Object.assign() - 合并对象
let obj1 = { a: 1 }
let obj2 = { b: 2 }
let obj3 = { c: 3 }
let merged = Object.assign({}, obj1, obj2, obj3)
console.log(merged)
// 对象浅拷贝
let original = { a: 1, b: { c: 2 } }
let copy = Object.assign({}, original)
original.b.c = 99
console.log(copy.b.c)
// Object.create() - 创建对象
let animal = {
eat() {
console.log('Eating...')
}
}
let dog = Object.create(animal)
dog.name = 'Buddy'
dog.eat()
// Object.defineProperty() - 定义属性
let obj = {}
Object.defineProperty(obj, 'readOnly', {
value: 42,
writable: false, // 不可写
enumerable: true, // 可枚举
configurable: false // 不可配置
})
console.log(obj.readOnly)
// obj.readOnly = 99
// Object.getOwnPropertyDescriptor() - 获取属性描述符
let descriptor = Object.getOwnPropertyDescriptor(obj, 'readOnly')
console.log(descriptor)
// Object.freeze() - 冻结对象
let frozen = { name: 'Alice' }
Object.freeze(frozen)
// frozen.name = 'Bob'
// frozen.age = 30
console.log(Object.isFrozen(frozen))
// Object.seal() - 密封对象
let sealed = { name: 'Alice' }
Object.seal(sealed)
sealed.name = 'Bob'
// sealed.age = 30
console.log(Object.isSealed(sealed))
// Object.fromEntries() - 键值对数组转对象
let entries = [['name', 'Alice'], ['age', 30]]
let newObj = Object.fromEntries(entries)
console.log(newObj)
// Object.hasOwn() - 检查自有属性 (ES2022)
console.log(Object.hasOwn(person, 'name'))
console.log(Object.hasOwn(person, 'toString'))
// 替代以前的 hasOwnProperty()
console.log(person.hasOwnProperty('name'))
// Object.getPrototypeOf() - 获取原型
let arr = []
console.log(Object.getPrototypeOf(arr) === Array.prototype)
// Object.setPrototypeOf() - 设置原型
let proto = { greet() { console.log('Hello!')
let obj = {}
Object.setPrototypeOf(obj, proto)
obj.greet()
// Object.is() - 严格相等比较
console.log(Object.is(NaN, NaN))
console.log(Object.is(0, -0))
console.log(Object.is({}, {}))
🎯 实用示例
1. 数组去重
let arr = [1, 2, 2, 3, 3, 4];
let unique1 = [...new Set(arr)];
console.log(unique1);
let unique2 = arr.filter((item, index) => arr.indexOf(item) === index);
console.log(unique2);
let unique3 = arr.reduce((acc, cur) => {
if (!acc.includes(cur)) acc.push(cur);
return acc;
}, []);
2. 对象深拷贝
function deepCloneSimple(obj) {
return JSON.parse(JSON.stringify(obj));
}
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) {
return obj.map(item => deepClone(item));
}
let cloned = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
let obj = { a: 1, b: { c: 2 } };
let cloned = structuredClone(obj);
3. 数组分组
let users = [
{ name: 'Alice', age: 20 },
{ name: 'Bob', age: 25 },
{ name: 'Charlie', age: 20 }
]
// 按年龄分组
let grouped = users.reduce((acc, user) => {
let key = user.age
if (!acc[key]) acc[key] = []
acc[key].push(user)
return acc
}, {})
console.log(grouped)
// {
// 20: [{name: 'Alice', age: 20}, {name: 'Charlie', age: 20}],
// 25: [{name: 'Bob', age: 25}]
// }
4. 防抖节流函数
function debounce(fn, delay) {
let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
function throttle(fn, delay) {
let lastTime = 0;
return function(...args) {
let now = Date.now();
if (now - lastTime >= delay) {
fn.apply(this, args);
lastTime = now;
}
};
}
5. 数据格式化
function formatNumber(num) {
return num.toLocaleString('en-US');
}
console.log(formatNumber(1234567.89));
function formatCurrency(amount, currency = 'USD') {
return amount.toLocaleString('en-US', {
style: 'currency',
currency: currency
});
}
console.log(formatCurrency(1234.56));
let date = new Date();
console.log(date.toLocaleDateString('zh-CN'));
console