Jeśli jesteś początkujący to powiem Ci tak: nie stosuj w ogóle składni new Number, new String, new Boolean. Co więcej... jeśli to kurs dla początkujących i nie zostało to wyjaśnione to szczerze mówiąc mocno zastanowiłbym się nad jakością tego kursu...
Dlaczego tak piszę? Otóż zobacz kilka poniższych przykładów...
let s1 = new String('xxx'),
s2 = 'xxx',
n1 = new Number(1),
n2 = 1,
bool1 = new Boolean(true),
bool2 = true;
typeof s1; //'object'
typeof s2; //'string'
typeof n1; //'object'
typeof n2; //'number'
typeof bool1; //'object'
typeof bool2; //'boolean'
//Teoretycznie więc, tylko zmienne zadeklarowane z użyciem
// "new" powinny mieć metody, gdyż tylko one są obiektami... ale:
typeof s1.replace; //'function'
typeof s2.replace; //'function'
//Analogicznie z n1, n2, bool1, bool2 - mają one metody, które znajdują
//się w Number.prototype / Boolean.prototype
Object.getPrototypeOf(s1) === String.prototype; //true
Teoretycznie więc może się wydawać, że obie metody deklarowania zmiennych są dobre... Co więcej, kilka razy spotkałem się z uwagą, że zapis bez "new" pozwala skrócić deklarację dlatego jest lepszy. Otóż samo skrócenie nie ma tutaj większego znaczenia (tak wiem... mniej bajtów pliku ale kwestię wielkości plików odłóżmy na razie na bok) problem zaczyna się, gdy chcemy dalej pracować z takimi zmiennymi. Zobacz na przykład, co się dzieje gdy próbujesz przekonwertować je na wartość true/false (np. gdy użyjesz je w instrukcji warunkowej).
W JavaScript pusty ciąg znakowy ("", '') jest konwertowany na FALSE, podobnie jak zero (a dokładniej +0 i -0 ale na razie nie ma to znaczenia) no i oczywiście sama wartość false. Czy jednak na pewno zawsze tak jest?
let s1 = new String('xxx'),
s2 = 'xxx',
s3 = "",
s4 = new String("");
// Podwójny wykrzyknik przed zmienną dokonuje
//jawnej konwersji na true/false:
!!s1; //true -> oki, mamy w końcu niepusty ciąg znakowy
!!s2; //true -> oki, j.w.
!!s3; //false -> oki, pusty ciąg === false
!!s4; //true -> ups... jak to?!
//Co więcej...
let n1 = 0,
n2 = new Number(0);
!!n1; //false
!!n2; //true
Dzieje się tak dlatego, że w momencie użycia składni ze słowem "new" tworzysz jawnie obiekt, a w JavaScript obiekty zawsze konwertowane są do true, niezależnie od tego czy mają jakieś właściwości czy nie, nawet jeśli stworzymy pusty obiekt bez dziedziczenia prototypowego:
let obj = Object.create(null);
!!obj; //true
Jeśli natomiast zadeklarujesz zmienną o wartości typu prostego to nie tworzysz obiektu. Masz dostęp do metod i właściwości z np. String.prototype ale to dlatego, że w momencie próby ich użycia silnik JS dokonuje tymczasowej konwersji zmiennej na obiekt, a po zakończeniu działania danej metody obiekt zostaje "zapomiany" i ponownie mamy wartość typu prostego.
Bezpieczniejsze i zalecane jest więc stosowanie deklaracji typów prostych, szczególnie w przypadku string, number i... OBOWIĄZKOWO boolean! Dlaczego obowiązkowo? A no dlatego:
let a = true,
b = new Boolean(true),
c = false,
d = new Boolean(false);
!!a; //true
!!b; //true
!!c; false
!!d; true -> ups...
Oto przykład na to, że czasami true === false (oczywiście traktuj to jako pewnego rodzaju żart :)
Czy w związku z tym w ogóle nie stosuje się składni z new przy deklarowaniu zmiennych (pomijam tutaj jawne wywołanie konstruktora obiektu)? Otóż stosuje się... najczęściej w przypadku korzystania z dynamicznie tworzonych wzorców wyrażeń regularnych i składni new RegExp. Ponad to są typy,które wręcz wymagają wywołania konstruktora np. ArrayBuffer, ale na razie nie zaprzątaj sobie tym głowy (jako początkujący raczej nie będziesz korzystał z tego typu elementów ES).
Przeanalizuj więc dokładnie fragmenty kodów jakie dałem i sam sobie odpowiedz na pytanie, czy warto stosować new String, new Number, new Boolean (chociaż w tym ostatnim przypadku to nie ma się nad czym zastanawiać...).
Pozdrawiam,
i życzę powodzenia w nauce :)