# 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直到全部失败)