• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Javascript new string itp.

Object Storage Arubacloud
0 głosów
589 wizyt
pytanie zadane 17 maja 2017 w JavaScript przez Vorex444 Dyskutant (9,610 p.)

Siema, zacząłem sobie przerabiać pewien kurs Js'a i jestem w na "new String" "new Number" itp.

mam pytanie odnośnie tego. 

Do czego to się wykorzstuje i w czym się przydaje? 

Bo nie czaje tego: 

var varNr = new Number(20); //liczba
var text = new String('To jest tekst'); //łańcuch znaków
var varBol = new Boolean(true); //logiczny - prawda/fałsz

4 odpowiedzi

+1 głos
odpowiedź 17 maja 2017 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 17 maja 2017
 
Najlepsza

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 :)

komentarz 18 maja 2017 przez Vorex444 Dyskutant (9,610 p.)
Dzięki ;)
+2 głosów
odpowiedź 17 maja 2017 przez niezalogowany
0 głosów
odpowiedź 17 maja 2017 przez solski Użytkownik (720 p.)
JS jest językiem obiektowym, więc WSZYSTKO jest obiektem (łącznie ze stringami, liczbami itd itp). Generalnie nie musisz za kazdym razem tworzyc nowego obiektu w ten sposob, wystarczy np. var number = 12;
komentarz 17 maja 2017 przez Vorex444 Dyskutant (9,610 p.)
czyli tego sie praktycznie wgl nie używa?
komentarz 17 maja 2017 przez niezalogowany

JS jest językiem obiektowym, więc WSZYSTKO jest obiektem (łącznie ze stringami, liczbami itd itp).

"Stringi, liczby itd itp" to typy proste. Data types

–1 głos
odpowiedź 17 maja 2017 przez ShiroUmizake Nałogowiec (46,300 p.)
Ograniczasz mu typ danych, a bardziej profesjonalnie ustalasz dla obiektu klasę. Przez co przeglądarka ma trochę mniej pracy(ale przy małych skryptach, różnicy za wielkiej nie ma). Czasami przydatne (parę razy musiałem użyć), gdy przeglądarka(interpreter) nie potrafi ustalić typ danych, ale to zdarzało się bardziej przy zawansowanych aplikacjach (Ale tam raczej się używa typeScript do statycznego typowania

<-- Nie znalałzem jeszcze potrzeby jego użycia.)

Oczywiście wiążą się pewne ograniczenia związane z tym, dot dostępem do metod.
komentarz 17 maja 2017 przez Tomek Sochacki Ekspert (227,510 p.)

Oczywiście wiążą się pewne ograniczenia związane z tym, dot dostępem do metod.

A skąd takie stwierdzenie? Zarówno deklaracja typu prostego jak i jawnie obiektu może stosować te same metody z prototypu. Weźmy chociażby prosty przykład: zadeklaruj ciąg znakowy 'abcd' i poprzez odpowiednie metody dokonaj odwrócenia jego znaków, czyli stwórz 'dcba':

let a = 'abcd',
    b = new String('abcd');

a.split("").reduceRight((a,b) => a+b); //'dcba'
b.split("").reduceRight((a,b) => a+b); //'dcba'

W obu przypadkach masz dostęp do metody String.prototype.split, a następnie możesz przekonwerować wartość do "[''object Array]" i użyć Array.prototype.reduceRight.

Podobne pytania

0 głosów
2 odpowiedzi 3,860 wizyt
0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 12 stycznia 2017 w JavaScript przez TheFunny Gaduła (3,420 p.)
+1 głos
1 odpowiedź 228 wizyt

92,575 zapytań

141,424 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...