В coffeescript это просто:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Допускает ли es6 нечто подобное?
> const [, b] = [1, 2, 3]
'use strict'
> b // it got the second element, not the last one!
2
> const [...butLast, last] = [1, 2, 3]
SyntaxError: repl: Unexpected token (1:17)
> 1 | const [...butLast, last] = [1, 2, 3]
| ^
at Parser.pp.raise (C:\Users\user\AppData\Roaming\npm\node_modules\babel\node_modules\babel-core\node_modules\babylon\lib\parser\location.js:24:13)
Конечно, я могу сделать это способом es5 -
const a = b[b.length - 1]
Но, возможно, это немного подвержено ошибкам на единицу. Может ли сплат быть только последним элементом деструктуризации?
ecmascript-6
destructuring
Джордж Симмс
источник
источник
...
в es6, в частности о том , что его можно использовать только в последнюю очередь при деструктуризации или в списке параметров. Это потенциально противоречит здравому смыслу для кого-то, кто входит в es6 из coffeescript, и поэтому этот вопрос потенциально полезен.[1,2,3].slice(-1)
вы даже не можете деструктурировать эквивалент[1,2,3].slice(0, -1)
. Это обычные операции. Деструктуризация ES6 - это как-то шутка!Ответы:
В ES6 / 2015 это невозможно. Стандарт просто этого не предусматривает.
Как видно из спецификации , это
FormalParameterList
может быть:FunctionRestParameter
FormalsList
(список параметров)FormalsList
, за которым следуетFunctionRestParameter
После
FunctionRestParameter
последующих параметров не предусмотрен.источник
источник
pop
версию быстрее (OS X, Chrome 68).Я считаю, что ES6 может хотя бы помочь с этим:
Учитывая, что ваш массив (arr) не является неопределенным и является повторяющимся элементом (да, даже строки работают !!), он должен возвращать последний элемент .. даже для пустого массива, и он также не меняет его. Тем не менее, он создает промежуточный массив .. но это не должно стоить дорого.
Тогда ваш пример будет выглядеть так:
источник
.slice(-1)[0]
немного менее плохо, илиvar [last]=arr.slice().reverse()
еще одно уродливое, если вам нужноvar [last] = arr.slice(-1)
Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
который не изменяетсяarr
.Вы можете деструктурировать перевернутый массив, чтобы приблизиться к желаемому.
источник
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? Что касается выступлений?.slice(-1)
технически быстрее, но он не дает вам одновременно последний элемент и подмассив за один вызов, что является преимуществом...
splat при деструктуризации. При использовании на более длинных массивах следует учитывать снижение производительности при двойном реверсировании, но для небольшого скрипта, вероятно, стоит удобство? Но вы могли бы так же легко,let a = array.slice(-1), rest = array.slice(0,array.length-2)
если бы вам по-прежнему нужен был oneliner в ES5, это примерно на 4% быстрее. jsperf.com/last-array-splatдругой подход:
источник
Не обязательно самый эффективный способ работы. Но в зависимости от контекста довольно элегантным способом будет:
источник
источник
Это должно работать:
источник
Вы можете попробовать этот хак:
источник
Не разрушающий способ, но мог бы помочь. Согласно документации javascript и обратному методу можно попробовать следующее:
источник
Определенно, вопрос касается деструктуризации массивов JavaScript, и мы знаем, что невозможно получить последний элемент массива с помощью назначения деструктуризации, есть способ сделать его неизменным , см. Следующее:
Мы не
arr
изменяем переменную, но по-прежнему имеем все члены массива, кроме последнего элемента, в виде массива и последний элемент отдельно.источник
источник