优先级队列中的比较器:Javascript

优先级队列中的比较器:Javascript,javascript,ecmascript-6,heap,priority-queue,Javascript,Ecmascript 6,Heap,Priority Queue,我不熟悉Javascript,因此这个问题, 我理解箭头的功能。然而,这种语法完全把我弄糊涂了。 这是PriorityQueue的一个实现,它将函数比较器作为回调函数,这是语法 class PriorityQueue { constructor({ comparator = (a, b) => a - b, initialValues = [] } = {}) { this.comparator = comparator; this.data = initialValu

我不熟悉Javascript,因此这个问题, 我理解箭头的功能。然而,这种语法完全把我弄糊涂了。 这是PriorityQueue的一个实现,它将函数比较器作为回调函数,这是语法

class PriorityQueue {
  constructor({ comparator = (a, b) => a - b, initialValues = [] } = {}) {
    this.comparator = comparator;
    this.data = initialValues;
    this.heapify();
  }
我不明白这句话的意思

{ comparator = (a, b) => a - b, initialValues = [] } = {}
完整的代码在这里,如果您需要,


但是有人能帮我理解这行代码吗。感谢您的期待。

构造函数需要零个或一个参数,如果提供,则应为对象。。如果未提供参数,则默认为空对象。然后,它检查(可能为空)对象的属性
比较器
初始值
。如果对象上存在这些属性,则将它们提取到这些变量名(
comparator
initialValues
)中。否则,将为这些变量名分配默认值,
(a,b)=>a-b
用于
comparator
initialValues
用于
initialValues

乙二醇

使用
(a,b)=>a-b的
比较器
[]
初始值
生成
优先队列
,而

new PriorityQueue({ comparator: (a, b) => a.localeCompare(b) })
使用
比较器
(a,b)=>a.localeCompare(b)
[]
初始值生成
优先队列

如果传递的参数中不包含
比较器
初始值
以外的属性,则忽略它们

详细编写,无默认参数:

class PriorityQueue {
  constructor(obj) {
    if (obj === undefined) {
      obj = {};
    }
    if (obj.comparator === undefined) {
      obj.comparator = (a, b) => a - b;
    }
    if (!obj.initialValues === undefined) {
      obj.initialValues = [];
    }

    // main constructor body starts here
    this.comparator = obj.comparator;
    this.data = obj.initialValues;
    this.heapify();
  }

该语法表示“如果未提供
比较器
,请使用此默认函数
(a,b)=>a-b
,如果未提供
初始值
,请使用空数组”@DacreDenny您可以通过一些示例将其作为更仔细的回答吗。我是JS新手。对此我很抱歉,看起来某些性能已经得到了这个答案。仅供参考,
(a,b)=>-(ab)
可以替代
(a,b)=>a-b
(a,b)=>a.localeCompare(b)
,除非字符串比较实际上需要Intl支持。后面的
={}是什么
mean,对不起,我知道这可能是个幼稚的问题。@Melisastewart这是答案的第二句话-如果没有提供参数,它默认为空对象。@CertainPerformance写这个有很长的路要走,如果是的话,你能用它更新你的答案吗,我真的在努力学习这门语言,事实证明这并不容易。这叫做“解构赋值”,这个特殊的例子是关于对象解构的@梅利萨斯特瓦特,看一看
class PriorityQueue {
  constructor(obj) {
    if (obj === undefined) {
      obj = {};
    }
    if (obj.comparator === undefined) {
      obj.comparator = (a, b) => a - b;
    }
    if (!obj.initialValues === undefined) {
      obj.initialValues = [];
    }

    // main constructor body starts here
    this.comparator = obj.comparator;
    this.data = obj.initialValues;
    this.heapify();
  }