Деструктурирование массива в функциональных параметрах

Были ли потоки, которые всегда были «завершены» внутри того же выражения, в котором они были созданы?

Вот как они используются в большинстве примеров.

Примечание: возврат потока не отличается от возвращаемого Итератора (допускается с гораздо большей выразительностью)

IMHO лучшим решением является инкапсуляция, почему вы это делаете, а не возвратите коллекцию.

, например

public int playerCount();
public Player player(int n);

, или если вы намерены считать их

public int countPlayersWho(Predicate<? super Player> test);
7
задан leonardofed 13 July 2018 в 13:34
поделиться

5 ответов

Деструктурирование с использованием шаблона массива использует итерацию в фоновом режиме, то есть разрушаемое значение должно быть итерируемым.

На самом деле, в Firefox сообщение об ошибке кажется более показательным:

TypeError: (destructured parameter) не является итерируемым

Это то, где сравнение, которое вы делаете при оценке 1[0], 1[1], 1[2], идет не так: для этого не требуется 1.

Более правильным сравнением было бы это сделать:

console.log([...1]);
// or:
const [a, b, c] = 1;

... и этот код не сработает.

3
ответ дан trincot 17 August 2018 в 12:42
поделиться

Функция foo() полностью отличается от bar() из-за того, что 1 является допустимым числом в javascript, и попытка доступа к 1[0] равна undefined, поскольку она ищет индекс 0 of значение 1, которое, безусловно, undefined. Вот почему вы получаете три undefined для 1[0], 1[1], 1[2]

Теперь одиночный undefined из foo() не из console.log(), а из ошибки

Uncaught TypeError: undefined не является функцией

Поскольку ваша сигнатура функции неверна. Чтобы использовать его надлежащим образом, вы можете использовать синтаксис распространения:

function foo(...arg) {
    console.log(arg[0], arg[1], arg[2]);
}

foo( 1, 2, 3 );

0
ответ дан Ankit Agarwal 17 August 2018 в 12:42
поделиться
  • 1
    Вы не ответили на мой вопрос. Вопрос не в том, почему bar () выводит undefined, но почему foo () выдает исключение. Пожалуйста, внимательно прочитайте. – leonardofed 13 July 2018 в 13:39

Это происходит потому, что функция foo() может принимать только iterables. См. Приведенный ниже пример:

function foo( [a, b, c] ) {
    console.log(a, b, c)
}

foo( [4, 5, 6] );  // works okay

foo( 3,4,5 ); // undefined is not a function

IMHO, spread operator используется в качестве сборщика в этих типах таких как:

function foo( ...[a, b, c] ) {
    console.log(a, b, c)
}

foo( ...[4, 5, 'v'] );  //works fine

foo(1,3,4); // also works fine

Почему foo () генерирует исключение?

Это из-за несовместимых параметров (b / w caller & amp; calee), который не имеет ничего общего с тем фактом, что в JavaScript 1[0] есть undefined.

0
ответ дан BlackBeard 17 August 2018 в 12:42
поделиться
  • 1
    & quot; Это происходит потому, что функция foo () может принимать только массив или деструктурированный массив & quot; Это на самом деле не так. – leonardofed 13 July 2018 в 14:15
  • 2
    @leonardofed может принимать другие значения, чем array? (Обновлен мой ответ) – BlackBeard 13 July 2018 в 14:16
  • 3
    – leonardofed 13 July 2018 в 14:18
  • 4
    @leonardofed мой плохой. Он принимает все повторяющиеся. – BlackBeard 13 July 2018 в 14:19
  • 5
    yep - правильно. – leonardofed 13 July 2018 в 14:20

Это потому, что функция foo ожидает массив / строку, чтобы он мог ее уничтожить.

Поскольку вы ничего не пропускаете, это приводит к сбою разрушения, это похоже на выполнение

var arrayVariable = undefined
var [a, b, c] = arrayVariable // this will throw an error
var d = arrayVariable['a'] // this will throw an error

Итак, чтобы избежать ошибки, укажите аргумент массива

foo('') // undefined, undefined, undefined
foo('123') // 1, 2, 3
foo([]); // undefined, undefined, undefined
foo([1, 2, 3]) // 1, 2, 3
0
ответ дан I am L 17 August 2018 в 12:42
поделиться
  • 1
    & Quot; функция foo ожидает массив " Неа. Попробуйте foo('abc') – Yury Tarabanko 13 July 2018 в 14:04
  • 2
    «Это потому, что функция foo ожидает массив / строку (что-то, к чему вы можете получить доступ с помощью prop [value]) & quot; опять же нет. Попробуйте foo({}) – Yury Tarabanko 13 July 2018 в 14:09
  • 3
    Да, мое плохое. Я имел в виду то, к чему вы можете получить доступ с помощью property[value] – I am L 13 July 2018 в 14:09
  • 4
    foo({}) вызывает ошибку – I am L 13 July 2018 в 14:09
  • 5
    Да, но вы, очевидно, не можете получить доступ к реквизитам пустых объектов. :) – Yury Tarabanko 13 July 2018 в 14:11

Деструктурирование массива на самом деле является Истребитель разрушения , который работает с чем-либо, реализующим метод Symbol.iterator.

Например

function foo([a, b, c]) {
  console.log([a, b, c])
}

foo({
  * [Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
})

Number не реализует протокол итератора

console.log(1[Symbol.iterator])

Вот почему вы получаете ошибку.

Но если вы его реализуете (НЕ РЕКОМЕНДУЕТСЯ)

Number.prototype[Symbol.iterator] = function*() {
  yield * this.toString(2); // just an example
}

function foo([a, b,c]) {
  console.log(a, b, c);
}

foo(6)

1
ответ дан Yury Tarabanko 17 August 2018 в 12:42
поделиться
  • 1
    Я думаю, вы как-то разрушили второе слово в своем ответе: -P – trincot 13 July 2018 в 14:17
  • 2
    @trincot LOL :) – Yury Tarabanko 13 July 2018 в 14:20
  • 3
    Спасибо, @YuryTarabanko. (Сейчас) Совершенно понятно. :) – leonardofed 13 July 2018 в 14:25
Другие вопросы по тегам:

Похожие вопросы: