W skrypcie kawowym jest to proste:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Czy es6 pozwala na coś podobnego?
> 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)
Oczywiście, że mogę to zrobić w sposób es5 -
const a = b[b.length - 1]
Ale może jest to trochę podatne na jeden błąd. Czy plama może być tylko ostatnią rzeczą w destrukturyzacji?
ecmascript-6
destructuring
George Simms
źródło
źródło
...
w es6, w szczególności, że może być użyte tylko jako ostatnia rzecz podczas destrukturyzacji lub na liście parametrów. Jest to potencjalnie sprzeczne z intuicją dla kogoś wchodzącego do es6 z coffeescript, a zatem to pytanie jest potencjalnie przydatne.[1,2,3].slice(-1)
że poza tym nie możesz nawet zniszczyć odpowiednika[1,2,3].slice(0, -1)
. To są typowe operacje. Destrukturyzacja ES6 to w jakiś sposób żart!Odpowiedzi:
Nie jest to możliwe w ES6 / 2015. Norma po prostu tego nie przewiduje.
Jak widać w specyfikacji ,
FormalParameterList
może to być:FunctionRestParameter
FormalsList
(lista parametrów)FormalsList
, po którym następuje aFunctionRestParameter
Po
FunctionRestParameter
parametrach nie podano.źródło
źródło
pop
wersję szybciej (OS X, Chrome 68).Uważam, że ES6 może przynajmniej w tym pomóc:
Biorąc pod uwagę, że twoja tablica (arr) nie jest niezdefiniowana i jest elementem iterowalnym (tak, nawet łańcuchy działają !!), powinna zwrócić ostatni element ... nawet dla pustej tablicy i też jej nie zmienia. Tworzy jednak tablicę pośrednią… ale to nie powinno kosztować dużo.
Twój przykład wyglądałby wtedy następująco:
źródło
.slice(-1)[0]
jest trochę mniej zły lubvar [last]=arr.slice().reverse()
jest inny brzydki, jeśli potrzebujeszvar [last] = arr.slice(-1)
Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
który nie podlega mutacjiarr
.Możesz zniszczyć odwróconą tablicę, aby zbliżyć się do tego, co chcesz.
źródło
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? Jeśli chodzi o występy?.slice(-1)
jest technicznie szybciej, ale to nie daje zarówno ostatniego punktu, a subarray w jednej rozmowy, co jest zaletą...
ikoną podczas demontażu struktury. Uderzenie w wydajność dwukrotnego cofania należy wziąć pod uwagę, gdy jest używane na dłuższych tablicach, ale dla małego skryptu prawdopodobnie warty wygody? Ale równie łatwolet a = array.slice(-1), rest = array.slice(0,array.length-2)
mógłbyś, gdybyś nadal chciał oneliner w ES5, czyli ~ 4% szybciej. jsperf.com/last-array-splatinne podejście to:
źródło
Niekoniecznie najbardziej wydajna metoda działania. Ale w zależności od kontekstu dość eleganckim sposobem byłoby:
źródło
źródło
To powinno działać:
źródło
Możesz spróbować tego hacka:
źródło
Zdecydowanie chodzi o Destrukturyzację dla tablic JavaScript i wiemy, że nie jest możliwe posiadanie ostatniego elementu tablicy przy użyciu przypisania destrukturyzacji, istnieje sposób, aby to zrobić niezmiennie , patrz poniżej:
Nie modyfikujemy
arr
zmiennej, ale nadal mamy wszystkie elementy tablicy z wyjątkiem ostatniego elementu jako tablicę, a ostatni element mamy oddzielnie.źródło
źródło
Nie niszczący, ale może pomóc. Zgodnie z dokumentacją javascript i metodą odwrotną można spróbować tego:
źródło