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

Operator “===”: unikalne ciągi tekstowe w przeglądarce
overcq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 402
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?

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
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
GK
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
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

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.