# JS 中常见的双生子
# splice vs slice
Array.prototype.splice();
Array.prototype.slice();
# splice()
splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。
此方法会改变原数组。
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
# slice()
slice()
方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括 end)。原始数组不会被改变。
array.slice([begin[, end]])
注意
如果数组元素是个对象引用,slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的数组和原来的数组中的这个元素也会发生改变。
# sort vs toSorted
Array.prototype.sort();
Array.prototype.toSorted();
# sort()
sort()
方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的。
array.sort([compareFunction])
# toSorted()
toSorted()
方法对数组的元素进行排序,并返回一个新数组,而不是修改原数组。
array.toSorted([compareFunction])
特点:
- 不会修改原数组
- 可以链式调用
- 可以使用 compareFunction 自定义排序方式
- 可以使用 toReversed() 反转排序结果
# assign vs create
Object.prototype.assign();
Object.prototype.create();
# Object.assign()
用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,并返回目标对象。
const target = { a: 1 };
const source = { b: 2 };
const result = Object.assign(target, source);
// target: { a: 1, b: 2 }
// result === target
特点:
- 浅拷贝(只复制属性引用)
- 会修改目标对象
- 可以合并多个对象
- 继承属性和不可枚举属性不能拷贝
# Object.create()
创建一个新对象,使用现有的对象作为新创建对象的原型。
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"
特点:
- 创建的对象继承原型对象的属性
- 可以添加属性描述符
- 不会调用构造函数
- 适合实现原型继承
# Promise.race vs Promise.any
Promise.race();
Promise.any();
在Promise并发执行的方法中, Promise.any() 和 Promise.race() 确实容易混淆,但它们的功能是不同的:
Promise.race()
- 返回第一个完成的Promise(无论成功还是失败)
- 只要有一个Promise完成(无论fulfilled或rejected),就立即返回结果
Promise.race([
Promise.resolve('fast'),
new Promise((_, reject) => setTimeout(() => reject('slow'),
100))
]).then(console.log); // "fast"
Promise.any() :
- 返回第一个成功的Promise
- 只有所有Promise都失败时才会reject
Promise.any([
Promise.reject('error1'),
Promise.resolve('success'),
Promise.reject('error2')
]).then(console.log); // "success"
关键区别:
- race 关注第一个完成(无论成功失败)
- any 关注第一个成功(忽略所有reject直到全部失败)