W innych językach, takich jak Python 2 i Python 3, możesz definiować i przypisywać wartości do zmiennej krotkiej oraz pobierać ich wartości w następujący sposób:
tuple = ("Bob", 24)
name, age = tuple
print(name) #name evaluates to Bob
print(age) #age evaluates to 24
Czy jest coś podobnego w JavaScript? A może po prostu muszę to zrobić w brzydki sposób z tablicą:
tuple = ["Bob", 24]
name = tuple[0] //name Evaluates to Bob
age = tuple[1] //age Evaluates to 24
Czy istnieje lepszy sposób na symulowanie krotek Pythona w JavaScript 5?
Aktualizacja: Zobacz odpowiedź dotyczącą ES6, która powinna być preferowana w nowych projektach od CoffeeScript.
var tuple, name, age;
var name=tuple[0], age=tuple[1];
To trochę więcej pisania, ale brzydota może być przesadą.Odpowiedzi:
Javascript 1.7 dodał zniszczone przypisanie, które pozwala robić zasadniczo to, czego szukasz.
źródło
Musisz to zrobić w brzydki sposób. Jeśli naprawdę chcesz czegoś takiego, możesz sprawdzić CoffeeScript , który ma to i wiele innych funkcji, które sprawiają, że wygląda bardziej jak Python (przepraszam, że brzmi to jak reklama, ale naprawdę to lubię).
źródło
Możesz zrobić coś podobnego:
a następnie odnosić się do imienia i wieku jako atrybutów
źródło
Object.freeze()
, np .:tuple = Object.freeze({ name:'Bob', age:14 })
Ta funkcja „krotki” w EcmaScript 2015 nazywa się destrukturyzacją i wkrótce ma być obsługiwana przez najnowsze przeglądarki. Na razie obsługują go tylko Firefox i Chrome .
Ale hej, możesz użyć transpilera .
Kod wyglądałby tak ładnie jak python:
źródło
Zamrożona tablica zachowuje się identycznie jak krotka Pythona:
Bądź fantazyjny i zdefiniuj klasę
Działa dzisiaj we wszystkich najnowszych przeglądarkach.
źródło
Krotki nie są obsługiwane w JavaScript
Jeśli szukasz niezmiennej listy, możesz użyć Object.freeze (), aby uczynić tablicę niezmienną.
Źródło: Mozilla Developer Network - Object.freeze ()
Przypisz tablicę jak zwykle, ale zablokuj ją za pomocą 'Object.freeze ()
Używaj wartości tak, jak w przypadku zwykłej tablicy (wielokrotne przypisanie w Pythonie nie jest obsługiwane)
Spróbuj przypisać nową wartość
Ale wartość się nie zmienia
źródło
Niestety nie możesz użyć tej składni przypisania krotki w skrypcie (ECMA | Java).
EDYCJA: Ktoś powiązany z Mozillą / JS 1.7 - to nie działałoby w różnych przeglądarkach, ale jeśli nie jest to wymagane, to jest twoja odpowiedź.
źródło
To nie jest przeznaczone do rzeczywistego wykorzystania, tylko interesujące ćwiczenie. Zobacz Dlaczego używanie funkcji eval JavaScript to zły pomysł? dla szczegółów.
Jest to najbliższe rozwiązanie, jakie można uzyskać bez uciekania się do rozszerzeń specyficznych dla dostawcy:
Funkcja pomocnicza:
Dowód, że działa w dowolnym zakresie:
eval
nie jest obsługiwany w przeglądarce Safari.źródło
Jako aktualizacja odpowiedzi ministra możesz to teraz zrobić za pomocą es2015:
https://jsbin.com/fubaluwimo/edit?js,console
źródło
Możesz również mieć typ krotki w JavaScript. Po prostu zdefiniuj to za pomocą funkcji wyższego rzędu (termin akademicki to kodowanie Kościoła):
Pamiętaj, że
Tuple
nie jest używany jako normalny konstruktor. Rozwiązanie wcale nie opiera się na systemie prototypowym, ale wyłącznie na funkcjach wyższego rzędu.Jakie są zalety krotek
Array
używanych jak krotki? Krotki kodowane w kościele są niezmienne z założenia i zapobiegają skutkom ubocznym powodowanym przez mutacje. Pomaga to w tworzeniu bardziej niezawodnych aplikacji. Ponadto łatwiej jest wnioskować o kodzie, który rozróżniaArray
s jako typ kolekcji (np.[a]
) I krotki jako powiązane dane różnych typów (np(a, b)
.).źródło
Oto prosta implementacja krotki Javascript:
To jest 2 krotka, jednak możesz zmodyfikować mój przykład, aby obsługiwał krotki 3,4,5,6 itp.
źródło
tuple
Instancja jest wciąż zmienny, więc nie jest to technicznie krotka. Na dowód zmianytuple.Item1 = "Steve"
ówczesnegoconsole.log()
wyjściu.Oto wersja odpowiedzi Matthew Jamesa Davisa z dodanymi metodami krotek w języku Python:
źródło