Różnica w tych 2 ciągach (JavaScript)
Próbowałem utworzyć zmienne typu string z wartościami na 2 sposoby.
- Jako ciąg znaków
- Korzystanie z nowego słowa kluczowego
Ale wydaje mi się, że oba te elementy różnią się reprezentacją na console.log . Czy ktoś może mi powiedzieć, czy druga droga nie zwraca ciągu, czy jest inna?
var str1 = "abc";
var str2 = new String("def");
console.log(str1);
console.log(str2);
Spodziewany:
Alfabet
Wynik:
Odpowiedzi
JavaScript ma dwie główne kategorie typów, prymitywne i obiekty.
typeof new String(); // "object"
typeof ''; // "string"
W przypadku instrukcji przypisywania wartości pierwotnych do zmiennej, takiej jak:
var str1 = "Hi";
JavaScript wewnętrznie utworzy zmienną za pomocą:
String("Hi")
Użycie słowa kluczowego new działa inaczej i zamiast tego zwraca obiekt.
Wywołanie new String(something)tworzy obiekt instancji typu String.
Wyniki wyglądają tak samo za pośrednictwem console.log (), ponieważ po prostu wyodrębni pierwotny łańcuch z przekazanej do niego instancji String.
A więc: po prostu zwykły łańcuch String () zwraca łańcuch pierwotny. new String ('xyz') zwraca obiekt skonstruowany przez konstruktor String.
Rzadko trzeba jawnie konstruować instancję typu String.
Pracujesz z dwoma różnymi rzeczami. To var str1 = "abc"daje ci prymityw. Podczas gdy var str2 = new String("def");daje ci obiekt typu string. Te dwa typy zachowują się inaczej
Obiekt String umożliwia pracę z serią znaków; opakowuje on pierwotny typ danych typu string z wieloma metodami pomocniczymi.
Ponieważ JavaScript automatycznie konwertuje między prymitywami łańcuchowymi a obiektami typu String, można wywołać dowolną metodę pomocniczą obiektu String na prymitywach łańcuchowych.
Kiedy drukujesz obiekt, często konsola drukuje właściwości obiektu.
Jeśli jest prymitywem, konsola po prostu wypisuje wartość.
Prymityw nie jest opakowany, ale jeśli utworzysz ciąg za pomocą konstruktora, ciąg jest opakowany w obiekt i zawsze ma właściwości.
Jeśli jest tylko literałem, ma właściwości tylko wtedy, gdy uzyskujesz dostęp do właściwości ciągu za pomocą .operatora, ponieważ występuje boks, ale po tym nadal jest literałem bez żadnych dodatkowych dodatków, z tego powodu podczas drukowania "The cat is very grumpy"po prostu wypisz wartość i nic więcej. prymitywy literały nie zawsze są obiektami z właściwościami, są obiektami tylko wtedy, gdy są opakowane.