Poza oczywistym faktem, że pierwsza forma może wykorzystywać zmienną, a nie tylko literał łańcuchowy, czy istnieje jakiś powód, aby używać jednego nad drugim, a jeśli tak, to w jakich przypadkach?
W kodzie:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
Kontekst: Napisałem generator kodu, który produkuje te wyrażenia i zastanawiam się, który jest lepszy.
javascript
syntax
object-literal
Mark Renouf
źródło
źródło
Odpowiedzi:
(Źródło stąd .)
Notacja w nawiasach kwadratowych pozwala na stosowanie znaków, których nie można używać z notacją kropkową:
w tym znaki spoza ASCII (UTF-8), jak w
myForm["ダ"]
( więcej przykładów ).Po drugie, notacja w nawiasach kwadratowych jest przydatna w przypadku nazw właściwości, które różnią się w przewidywalny sposób:
Podsumowanie:
Innym przykładem znaków, których nie można używać z notacją kropkową, są nazwy właściwości, które same zawierają kropkę .
Na przykład odpowiedź JSON może zawierać właściwość o nazwie
bar.Baz
.źródło
Notacja w nawiasach umożliwia dostęp do właściwości według nazwy przechowywanej w zmiennej:
obj.x
nie zadziałałoby w tym przypadku.źródło
Dwa najczęstsze sposoby uzyskiwania dostępu do właściwości w JavaScript to kropka i nawiasy kwadratowe. Oba
value.x and value[x]
uzyskują dostęp do nieruchomości o wartości - ale niekoniecznie do tej samej właściwości. Różnica polega na interpretacji x. W przypadku użycia kropki część po kropce musi być prawidłową nazwą zmiennej i bezpośrednio określa nazwę właściwości. Podczas używania nawiasów kwadratowych wyrażenie między nawiasami jest obliczane w celu uzyskania nazwy właściwości. Podczas gdy value.x pobiera właściwość wartości o nazwie „x”, wartość [x] próbuje ocenić wyrażenie x i wykorzystuje wynik jako nazwę właściwości.Jeśli więc wiesz, że interesująca Cię właściwość nazywa się „długością”, mówisz
value.length
. Jeśli chcesz wyodrębnić właściwość nazwaną wartością przechowywaną w zmienneji
, powiedzvalue[i]
. A ponieważ nazwy nieruchomość może być dowolny ciąg znaków, jeśli chcesz uzyskać dostęp właściwość o nazwie“2”
lub“John Doe”
należy użyć nawiasów kwadratowych:value[2] or value["John Doe"]
. Dzieje się tak, mimo że z góry znasz dokładną nazwę właściwości, ponieważ żadna z nich nie“2” nor “John Doe”
jest prawidłową nazwą zmiennej i dlatego nie można uzyskać do niej dostępu za pomocą notacji kropkowej.W przypadku tablic
Elementy w tablicy są przechowywane we właściwościach. Ponieważ nazwy tych właściwości są liczbami i często musimy uzyskać ich nazwę ze zmiennej, musimy użyć składni nawiasu, aby uzyskać do nich dostęp. Właściwość length tablicy mówi nam, ile elementów zawiera. Ta nazwa właściwości jest prawidłową nazwą zmiennej i znamy ją z góry, więc aby znaleźć długość tablicy, zwykle piszesz,
array.length
ponieważ łatwiej jest ją zapisaćarray["length"]
.źródło
The elements in an array are stored in properties
to mnie dezorientuje. Co rozumiesz przez przechowywane we właściwościach? Jakie są właściwości? W moim rozumieniu tablica to tylko garść wartości bez właściwości. Jeśli są one przechowywane we właściwościach, to dlaczego nie jest toproperty: value
tablica asocjacyjna?Notacja kropkowa nie działa z niektórymi słowami kluczowymi (jak
new
iclass
) w programie Internet Explorer 8.Miałem ten kod:
I to wywołuje przerażający „oczekiwany identyfikator” (przynajmniej w IE8 na Windows XP, nie próbowałem innych środowisk). Prostym rozwiązaniem jest przejście na notację w nawiasach:
źródło
Zachowaj ostrożność podczas używania tych notacji: Na przykład. jeśli chcemy uzyskać dostęp do funkcji znajdującej się w elemencie macierzystym okna. W IE:
nie jest równoważne z
Możemy użyć:
lub
aby uzyskać do niego dostęp
źródło
Ogólnie rzecz biorąc, wykonują tę samą pracę.
Niemniej jednak notacja w nawiasach daje możliwość robienia rzeczy, których nie można zrobić za pomocą notacji kropkowej
Można to rozszerzyć na dowolną właściwość zawierającą znaki specjalne.
źródło
Musisz użyć nawiasów, jeśli nazwy właściwości mają znaki specjalne:
Poza tym przypuszczam, że to tylko kwestia gustu. IMHO, notacja kropkowa jest krótsza i sprawia, że bardziej oczywiste jest, że jest to właściwość niż element tablicy (chociaż oczywiście JavaScript i tak nie ma tablic asocjacyjnych).
źródło
Notacja w nawiasach może używać zmiennych, więc jest przydatna w dwóch przypadkach, w których notacja kropkowa nie będzie działać:
1) Gdy nazwy właściwości są określane dynamicznie (gdy dokładne nazwy nie są znane do czasu uruchomienia).
2) Podczas korzystania z pętli for..in, aby przejść przez wszystkie właściwości obiektu.
źródło: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
źródło
Należy użyć notacji w nawiasach kwadratowych, gdy -
Nazwa właściwości to liczba.
Nazwa właściwości ma charakter specjalny.
Nazwa właściwości jest przypisana do zmiennej i chcesz uzyskać dostęp do wartości właściwości przez tę zmienną.
źródło
Przypadek, w którym
[]
notacja jest pomocna:Jeśli twój obiekt jest dynamiczny i mogą występować losowe wartości w klawiszach takich jak
number
i /[]
lub inny znak specjalny, na przykład -var a = { 1 : 3 };
Teraz, jeśli spróbujesz uzyskać dostęp w
a.1
ten sposób, to przez błąd, ponieważ oczekuje tam łańcucha.źródło
Notacja kropkowa jest zawsze lepsza. Jeśli używasz jakiegoś „inteligentniejszego” IDE lub edytora tekstowego, pokażą niezdefiniowane nazwy z tego obiektu. Notacji w nawiasach należy używać tylko wtedy, gdy nazwa ma podobne myślniki lub coś podobnego jest niepoprawna. A także, jeśli nazwa jest przechowywana w zmiennej.
źródło
Math.sqrt(25)
, ale nieMath['sqrt'](25)
.Dodajmy jeszcze jeden przypadek użycia notacji w nawiasach kwadratowych. Jeśli chcesz uzyskać dostęp do właściwości powiedz
x-proxy
w obiekcie, wówczas-
zostanie źle zinterpretowany. Są też inne przypadki, takie jak spacja, kropka itp., W których operacja kropki nie pomoże. Również jeśli masz klucz w zmiennej, wówczas jedynym sposobem na uzyskanie dostępu do wartości klucza w obiekcie jest notacja nawiasowa. Mam nadzieję, że uzyskasz więcej kontekstu.źródło
Przykład, w którym notacja kropkowa kończy się niepowodzeniem
źródło