Контекст Array () в этой функции - PullRequest
3 голосов
/ 04 марта 2020
  it("should know properties that are functions act like methods", function() {
    var meglomaniac = { 
      mastermind : "Brain", 
      henchman: "Pinky",
      battleCry: function(noOfBrains) {
        return "They are " + this.henchman + " and the" +
          Array(noOfBrains + 1).join(" " + this.mastermind);
      }
    };

    var battleCry = meglomaniac.battleCry(4);
    expect('They are Pinky and the Brain Brain Brain Brain').toMatch(battleCry);
  });

Каково определение массива в этом коде (строка 7)? Я посмотрел его, и похоже, что это команда Array.of (), которая генерирует пустой массив длины n, который в этом случае будет 5? Так почему же в итоге получается только 4 входа в мозг, если предположить, что это правильное предположение? Или этот массив () делает что-то еще?

Ответы [ 2 ]

5 голосов
/ 04 марта 2020

battleCry(4) означает, что Array(noOfBrains + 1) действительно будет иметь длину 5:

[empty, empty empty, empty, empty]

Но когда вы .join эти 5 элементов, вы только вставляете что-то в пробелы между их, и есть только 4 пробела:

[empty, empty empty, empty, empty]
//     ^     ^      ^      ^

Таким образом, вы получите 4 вхождения this.mastermind в результирующей строке.

Этот код довольно запутанный. Я бы предпочел вместо этого что-то вроде .repeat:

var meglomaniac = { 
  mastermind : " Brain", 
  henchman: "Pinky",
  battleCry: function(noOfBrains) {
    return `They are ${this.henchman} and the${this.mastermind.repeat(noOfBrains)}`
  }
};

var battleCry = meglomaniac.battleCry(4);
console.log(battleCry === 'They are Pinky and the Brain Brain Brain Brain');

Array - это просто конструктор массива. На самом деле это не что-то особенное, просто создается массив, который имеет length параметра (при передаче числа).

0 голосов
/ 04 марта 2020

Вы можете избежать необходимости вручную добавлять 1 к числу элементов в массиве, чтобы преодолеть проблему, используя Array.fill().

Array(4).fill("Brain").join(" ");   // have an array of 4 elements,
                                    // fill each vacant spot with "Brain"
                                    // and flatten it by separating elements
                                    // by a space
//Brain Brain Brain Brain

Таким образом, ваш код может быть упрощен как:

Array(noOfBrains).fill(this.mastermind).join(" ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...