Po uruchomieniu polecenia x = 'test'.match(/(t(e)/) w konsoli otrzymuję następujące wyjście.

["te", "e", index: 0, input: "test"]

Następnie uruchomiłem następujące polecenia:

x.length Wyjście: 2

Object.keys(x).length Wyjście: 4

Co tu się dzieje? Zmienna wydaje się być literałem tablicy z literałami obiektów w indeksie 2 i 3. przepraszam, jeśli jest to pytanie nooby, ale kiedy próbuję zrobić

x = ["te", "e", index: 0, input: "test"] dostaję Uncaught SyntaxError: Unexpected token :, który jest oczekiwany, ale jestem zdezorientowany, jak ustawienie funkcji x do tego.

2
user7986267 28 czerwiec 2017, 02:06

4 odpowiedzi

Najlepsza odpowiedź

Lemme pomoże trochę

  • ["te", "e", index: 0, input: "test"] to struna wersja obiektu zwracana przez funkcję match.
  • x nie jest "ustawiony na to". x jest ustawiony na obiekt opisujący mecze Regexa. Kiedy robisz console.log(x), x.toString() jest wywoływany pod maską i zwraca ["te", "e", index: 0, input: "test"]. To tylko reprezentacja tekstowa dla wygody. Struktura bazowa jest bardziej złożona.

Teraz dla innych Gotchas:

  • "te" został dopasowany przez Regex
  • "e" to wychwytywanie z tego meczu (z powodu nawiasów w regexp)
  • x.length opisuje liczbę znalezionych meczów / przechwytów
  • Object.keys(x).length to 4. Masz 2 przechwytywanie (2 klawisze), do którego dodaje 2 klawisze dla index i input
2
Aurélien Gasser 27 czerwiec 2017, 23:14

"Tablice są obiektami podobnymi do listy, których prototyp ma metody wykonywania operacji przechodzących i mutacji". Od MDN.

Podczas uzyskiwania dostępu do "indeksu" lub "wkład" jest to właściwość obiektu, tak jak każda inna.

Spróbuj tego:

a = new Array() 
a.hello = 'world' 
console.log(a.hello)
console.log(Object.keys(a)) 

Otrzymasz następujące wyjście:

'world' 
['hello']
0
Ezra Chu 27 czerwiec 2017, 23:17

Wynik 'test'.match(/(t(e)/) jest naprawdę po prostu ["te", "e"], który ma długość 2 i wydaje się być tym, co chcesz uzyskać, więc możesz użyć x = ["te", "e"]

0
frozen 27 czerwiec 2017, 23:14

Tablice są obiektami, indeksy są nazwami właściwości, ale nie pokazano w literałach tablicy. Konsola ma mieszanie tablicy i literalnej składni obiektu (który jest nieprawidłowy, jeśli jest używany jako kod).

Równoważny literał byłby:

{
 0: "te",
 1: "e",
 index: 0,
 input: "test"
};

Ale literał obiektu konstruują zwykłe obiekty, a nie obiekty tablicy. Możesz skonstruować równoważną tablicę za pomocą:

var x = ['te', 'e'];
x.index = 0;
x.input = 'test';
2
RobG 27 czerwiec 2017, 23:18