Operator “===”: unikalne ciągi tekstowe w przeglądarce

Operator “===”: unikalne ciągi tekstowe w przeglądarce
overcq
  • Rejestracja:około 7 lat
  • Ostatnio:około 9 godzin
  • Postów:393
0

Niegdyś przeczytałem (ale nie mam źródła; bodajże gdzieś na stronach developer.chrome.com), że przy programowaniu rozszerzeń do przeglądarki Chrome można było porównywać ciągi tekstowe operatorem ===, ponieważ w pamięci tej przeglądarki www wszystkie ciągi tekstowe są umieszczane w tablicy bez powtórzeń, więc te same ciągi tekstowe są tym samym obiektem w pamięci. W innych przeglądarkach www trzeba było do porównywania ciągów tekstowych używać operatora ==?

Wiem, że teraz jest definicja operatora ===, w której osobno wymienione są ciągi tekstowe jako porównywane znak po znaku przez wartość, a nie identyczność obiektu.

Czy ktoś może sobie przypomnieć, ew. wskazać źródło, jak operator === był obsługiwany dla ciągów tekstowych w przeglądarkach www? I czy rzeczywiście traktował ciągi tekstowe jak obiekty? A jeśli tak, to od której wersji w poszczególnych przeglądarkach jest obsługiwany tak jak teraz?


Nie znam się, ale się wypowiem.
Wizytówka
joh­nny_Be_go­od jest mistrzem ‘eskejpowania’ i osadzania.
edytowany 2x, ostatnio: overcq
lion137
Internet coś mówi?
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 8 godzin
1

=== zawsze traktował dwa stringi identycznie, nie ważne czy to te same obiekty w pamięci czy nie, to nie głupia java - porównywanie stringów odbywa się po znakach tak jak to powinno zawsze być
Ale... w javascript masz typy prymitywne (bool, null, undefined, number, BigInt, string) i obiekty (Boolean, Number, String, Object, ...).
Porównywanie obiektów do teraz zwraca false:

Kopiuj
new String('a') === new String('a'); // false
new Boolean(true) === new Boolean(true); // false

za to porównywanie prymitywów jest po wartości:

Kopiuj
'a' === 'a' // od zawsze true
String('a') === String('a') // od zawsze true (String bez "new" tworzy prymityw stringa, nie obiekt)
Boolean(true) === Boolean(true); // true
Kopiuj
typeof 'a' // string
typeof String('a') // string
typeof new String('a') // object

typeof false // boolean
typeof new Boolean(false) // object

jeśli nie wiesz czy na wejściu dostajesz stringa czy zaboxowanego stringa i chcesz mieć pewność to możesz zrobić unboxing stringa rzutując go:

Kopiuj
String(new String('a')) === String(new String('a')) // true

"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
jarekr000000
to nie głupia java poprzeczka nie była ustawiona wysoko, ale boxowywanie nawet javę przebija...
KamilAdam
Jest prymityw String i obiekt String XD mnie się podoba XD przez chwile chciałem napisać klasa String ale tego chyba jeszcze nie ma XD
obscurity
java w niczym nie jest lepsza, masz typy proste int, float, double etc i zapudełkowane Integer, Float, Double itp. Tu akurat javascript był wzorowany na javie, jedyna różnica że string w javie nigdy nie jest typem prostym i to akurat poprawili
GK
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:4
1
overcq napisał(a):

ponieważ w pamięci tej przeglądarki www wszystkie ciągi tekstowe są umieszczane w tablicy bez powtórzeń, więc te same ciągi tekstowe są tym samym obiektem w pamięci?

To co piszesz, to dotyczy Javy.

W JavaScript każdy string jest osobną kopią w pamięci i jest rezerwowana pamięć dla każdego nowego stringa. Stringi w JS są immutable.

edytowany 1x, ostatnio: gkucmierz
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 8 godzin
1
gkucmierz napisał(a):

W JavaScript każdy string jest osobną kopią w pamięci i jest rezerwowana pamięć dla każdego nowego stringa. Stringi w JS są immutable.

To nie jest prawdą. Standard tego nie opisuje i jest to zależne od implementacji konkretnego silnika, ale większość współczesnych silników robi internalizację stringów
https://stackoverflow.com/questions/5276915/do-common-javascript-implementations-use-string-interning
Nie ma to jednak żadnego znaczenia dla programisty


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.