### 常见的数组方法
1. **`push()`**
- 在数组末尾添加一个或多个元素,并返回新数组的长度。
- 例子:`arr.push(1, 2, 3);`
2. **`pop()`**
- 删除数组的最后一个元素,并返回该元素。
- 例子:`arr.pop();`
3. **`shift()`**
- 删除数组的第一个元素,并返回该元素。
- 例子:`arr.shift();`
4. **`unshift()`**
- 在数组开头添加一个或多个元素,并返回新数组的长度。
- 例子:`arr.unshift(1, 2);`
5. **`concat()`**
- 合并两个或多个数组,不改变现有数组,返回一个新数组。
- 例子:`let newArr = arr.concat([4, 5, 6]);`
6. **`slice()`**
- 返回数组的一个子集,不改变原数组。
- 例子:`let newArr = arr.slice(1, 3);`
7. **`splice()`**
- 添加、删除或替换数组中的元素。此方法会改变原数组。
- 例子:`arr.splice(1, 2, 'a', 'b');`
8. **`indexOf()`**
- 返回指定元素在数组中的第一个索引,如果不存在则返回 -1。
- 例子:`let index = arr.indexOf(2);`
9. **`lastIndexOf()`**
- 返回指定元素在数组中的最后一个索引,如果不存在则返回 -1。
- 例子:`let index = arr.lastIndexOf(2);`
10. **`forEach()`**
- 对数组中的每个元素执行一次提供的函数。
- 例子:`arr.forEach(item => console.log(item));`
11. **`map()`**
- 创建一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
- 例子:`let newArr = arr.map(item => item * 2);`
12. **`filter()`**
- 创建一个新数组,包含通过所提供函数测试的所有元素。
- 例子:`let newArr = arr.filter(item => item > 2);`
13. **`reduce()`**
- 对数组中的每个元素执行一个由您提供的 reducer 函数,将其结果汇总为单个值。
- 例子:`let sum = arr.reduce((acc, item) => acc + item, 0);`
14. **`reduceRight()`**
- 从右到左执行 reduce 操作。
- 例子:`let sum = arr.reduceRight((acc, item) => acc + item, 0);`
15. **`some()`**
- 检查数组中是否至少有一个元素通过所提供的函数测试。返回布尔值。
- 例子:`let hasPositive = arr.some(item => item > 0);`
16. **`every()`**
- 检查数组中的所有元素是否都通过所提供的函数测试。返回布尔值。
- 例子:`let allPositive = arr.every(item => item > 0);`
17. **`find()`**
- 返回数组中满足提供的测试函数的第一个元素的值。
- 例子:`let found = arr.find(item => item > 2);`
18. **`findIndex()`**
- 返回数组中满足提供的测试函数的第一个元素的索引。
- 例子:`let index = arr.findIndex(item => item > 2);`
19. **`sort()`**
- 对数组中的元素进行排序并返回数组。
- 例子:`arr.sort((a, b) => a - b);`
20. **`reverse()`**
- 颠倒数组中元素的顺序,并返回该数组。
- 例子:`arr.reverse();`
21. **`join()`**
- 将数组的所有元素连接成一个字符串。
- 例子:`let str = arr.join(', ');`
22. **`includes()`**
- 判断一个数组是否包含一个指定的值,根据情况返回 true 或 false。
- 例子:`let hasItem = arr.includes(2);`
23. **`flat()`**
- 按指定深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组。
- 例子:`let newArr = arr.flat(2);`
24. **`flatMap()`**
- 首先使用 map 函数映射每个元素,然后将结果压缩成一个新数组。
- 例子:`let newArr = arr.flatMap(item => [item, item * 2]);`
25. **`fill()`**
- 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
- 例子:`arr.fill(0, 2, 4);`
26. **`copyWithin()`**
- 从数组的一部分浅复制到同一数组中的另一个位置,并返回它,不会改变数组的长度。
- 例子:`arr.copyWithin(0, 3, 5);`
这些方法都是原生 JavaScript 的数组操作方法,可以在 Vue 3 中直接使用。
### 创建和操作对象的方法
1. **`Object.create(proto, [propertiesObject])`**
- 使用指定的原型对象和可选的属性描述符来创建一个新的对象。
- 例子:`let newObj = Object.create(proto);`
2. **`Object.assign(target, ...sources)`**
- 将一个或多个源对象的所有可枚举属性复制到目标对象,返回修改后的目标对象。
- 例子:`let newObj = Object.assign({}, obj1, obj2);`
3. **`Object.defineProperty(obj, prop, descriptor)`**
- 为对象添加一个属性,并为该属性设置描述符(如可枚举性、可配置性等)。
- 例子:`Object.defineProperty(obj, 'key', { value: 42, writable: false });`
4. **`Object.defineProperties(obj, props)`**
- 为对象定义多个属性,每个属性都有自己的描述符。
- 例子:`Object.defineProperties(obj, { key1: { value: 42 }, key2: { value: 'foo' } });`
### 获取对象信息的方法
5. **`Object.keys(obj)`**
- 返回一个包含对象自身可枚举属性名称的数组。
- 例子:`let keys = Object.keys(obj);`
6. **`Object.values(obj)`**
- 返回一个包含对象自身可枚举属性值的数组。
- 例子:`let values = Object.values(obj);`
7. **`Object.entries(obj)`**
- 返回一个包含对象自身可枚举属性的键值对数组。
- 例子:`let entries = Object.entries(obj);`
8. **`Object.getOwnPropertyNames(obj)`**
- 返回一个包含对象自身所有属性名称(包括不可枚举属性)的数组。
- 例子:`let propNames = Object.getOwnPropertyNames(obj);`
9. **`Object.getOwnPropertyDescriptor(obj, prop)`**
- 返回指定对象属性的属性描述符。
- 例子:`let descriptor = Object.getOwnPropertyDescriptor(obj, 'key');`
10. **`Object.getOwnPropertyDescriptors(obj)`**
- 返回指定对象所有自身属性的属性描述符对象。
- 例子:`let descriptors = Object.getOwnPropertyDescriptors(obj);`
11. **`Object.getPrototypeOf(obj)`**
- 返回指定对象的原型(即内部的 `[[Prototype]]`)。
- 例子:`let proto = Object.getPrototypeOf(obj);`
12. **`Object.is(obj1, obj2)`**
- 判断两个值是否是同一个值。
- 例子:`let isEqual = Object.is(0, -0); // false`
13. **`Object.hasOwn(obj, prop)`**
- 判断对象是否具有指定的自身属性,区别于 `in` 操作符的是它不检查原型链。
- 例子:`let hasOwn = Object.hasOwn(obj, 'key');`
### 设置和删除对象属性的方法
14. **`Object.setPrototypeOf(obj, proto)`**
- 设置对象的原型(`[[Prototype]]`),并返回该对象。
- 例子:`Object.setPrototypeOf(obj, proto);`
15. **`Object.freeze(obj)`**
- 冻结对象:阻止对象的新属性添加,并将所有现有属性标记为不可配置和不可写的(不可变对象)。
- 例子:`Object.freeze(obj);`
16. **`Object.seal(obj)`**
- 封闭对象:阻止添加新属性,并将所有现有属性标记为不可配置,但可以修改现有属性的值。
- 例子:`Object.seal(obj);`
17. **`Object.preventExtensions(obj)`**
- 阻止对象扩展:禁止向对象添加新属性。
- 例子:`Object.preventExtensions(obj);`
18. **`Object.isFrozen(obj)`**
- 判断对象是否被冻结。
- 例子:`let isFrozen = Object.isFrozen(obj);`
19. **`Object.isSealed(obj)`**
- 判断对象是否被封闭。
- 例子:`let isSealed = Object.isSealed(obj);`
20. **`Object.isExtensible(obj)`**
- 判断对象是否可扩展。
- 例子:`let isExtensible = Object.isExtensible(obj);`
### 遍历和比较对象的方法
21. **`Object.fromEntries(iterable)`**
- 将键值对列表(如 `Map` 对象或二维数组)转换为对象。
- 例子:`let obj = Object.fromEntries([['a', 1], ['b', 2]]);`
22. **`Object.prototype.hasOwnProperty(prop)`**
- 判断对象是否具有指定的自身属性。
- 例子:`let hasProp = obj.hasOwnProperty('key');`
23. **`Object.prototype.propertyIsEnumerable(prop)`**
- 判断对象的某个属性是否可枚举。
- 例子:`let isEnumerable = obj.propertyIsEnumerable('key');`
24. **`Object.prototype.isPrototypeOf(obj)`**
- 判断一个对象是否存在于另一个对象的原型链上。
- 例子:`let isProto = proto.isPrototypeOf(obj);`
25. **`Object.prototype.toString()`**
- 返回对象的字符串表示,通常用于调试。
- 例子:`let str = obj.toString();`
26. **`Object.prototype.valueOf()`**
- 返回指定对象的原始值。
- 例子:`let value = obj.valueOf();`
这些方法帮助您在 JavaScript 中创建、操作、遍历和比较对象,适用于各种对象处理需求。