Были ли потоки, которые всегда были «завершены» внутри того же выражения, в котором они были созданы?
blockquote>Вот как они используются в большинстве примеров.
Примечание: возврат потока не отличается от возвращаемого Итератора (допускается с гораздо большей выразительностью)
IMHO лучшим решением является инкапсуляция, почему вы это делаете, а не возвратите коллекцию.
, например
public int playerCount(); public Player player(int n);
, или если вы намерены считать их
public int countPlayersWho(Predicate<? super Player> test);
Деструктурирование с использованием шаблона массива использует итерацию в фоновом режиме, то есть разрушаемое значение должно быть итерируемым.
На самом деле, в Firefox сообщение об ошибке кажется более показательным:
TypeError: (destructured parameter) не является итерируемым
blockquote>Это то, где сравнение, которое вы делаете при оценке
1[0], 1[1], 1[2]
, идет не так: для этого не требуется1
.Более правильным сравнением было бы это сделать:
console.log([...1]); // or: const [a, b, c] = 1;
... и этот код не сработает.
Функция 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 не является функцией
blockquote>Поскольку ваша сигнатура функции неверна. Чтобы использовать его надлежащим образом, вы можете использовать синтаксис распространения:
function foo(...arg) { console.log(arg[0], arg[1], arg[2]); } foo( 1, 2, 3 );
Это происходит потому, что функция 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
.
array
? (Обновлен мой ответ)
– BlackBeard
13 July 2018 в 14:16
Это потому, что функция 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
foo('abc')
– Yury Tarabanko
13 July 2018 в 14:04
foo({})
– Yury Tarabanko
13 July 2018 в 14:09
property[value]
– I am L
13 July 2018 в 14:09
Деструктурирование массива на самом деле является Истребитель разрушения , который работает с чем-либо, реализующим метод 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)