Różnica w tych 2 ciągach (JavaScript)

Sep 07 2020

Próbowałem utworzyć zmienne typu string z wartościami na 2 sposoby.

  1. Jako ciąg znaków
  2. 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

9 xMayank Sep 07 2020 at 05:07

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.

4 GauravMogha Sep 07 2020 at 05:07

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.

2 LarsNielsen Sep 07 2020 at 05:07

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

AkhilRavindran Sep 07 2020 at 05:12

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.

Unknow Sep 07 2020 at 05:07

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.