JavaScript: toString() a valueOf()

Różnica między toString() i valueOf() jest prosta: ta pierwsza służy do zamiany obiektu na stringa, a ta druga, na liczbę wartość prymitywną (a więc stringa lub liczbę). Na tym rzeczy oczywiste się kończą. Kiedy JavaScript użyje jednej, a kiedy drugiej metody?

Przyjmijmy, że będziemy korzystać z poniższych zmiennych:

var
    s = {
        toString: function() { return "abc"; }
    },
    v = {
        valueOf: function() { return "123"; }
    },
    sv = {
        toString: function() { return "zyx"; },
        valueOf: function() { return 987; }
    };

Jak widać, mamy zmienną definiującą tylko toString(), drugą, definiującą tylko valueOf() i trzecią, która definiuje obie metody.

Operator +

Operator + służy do konkatenacji i do dodawania. JavaScript będzie w miarę możliwości preferował valueOf().

> s + v + sv
'abc123987'

A zatem:

  • gdy zdefiniowana jest tylko metoda toString(), jest ona użyta,
  • gdy zdefiniowana jest tylko metoda valueOf(), jest ona użyta,
  • gdy zdefiniowane są obie metody, używana jest valueOf().

Array.prototype.join()

Metoda join() służy do połączenia elementów tablicy w jeden string. Na elementach używa zostanie wyłącznie metoda toString().

> [s, v, sv].join()
'abc[object Object]zyx'

A zatem:

  • gdy zdefiniowana jest tylko metoda toString(), jest ona użyta,
  • gdy zdefiniowana jest tylko metoda valueOf(), używana jest prototypowa metoda toString(),
  • gdy zdefiniowane są obie metody, używana jest toString().

Komentarze

Comandeer

2015-02-20, 22:20

Nie zgodzę się, że valueOf zwraca liczbę - zwraca wartość danego obiektu jako wartość prymitywną. Jest po prostu nieco bardziej uniwersalną wersją toString.

Najprostszy dowód? 'a'.valueOf() → nie zwróci liczby ;)

Dominik Marczuk

2015-02-20, 22:31

No zaiste, zaiste. Nawet w moim własnym przykładzie obiekt v zwraca stringa. Napisałem trochę bez zastanowienia, prawdopodobnie myśląc o obiekcie Date, którego metoda valueOf() zwraca timestampa właśnie w postaci liczby :).


Napisz komentarz


Szukaj wpisów


Chmura tagów