Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

В чем разница между valueOf и toString

#javascript


В чем разница между ними?
И то, и то выводит нам строку, которую мы указывает в return, при том valueOf, если
явно указано, затирает toString.
Почитал пару источников, но так и не понял разницы. Если можно, поподробнее, пожалуйста.
    


Ответы

Ответ 1



Рискну предположить что Вы имеете ввиду функции valueOf и toString. Разница между ними чуть размыта, но понятна: valueOf используется для численного преобразования объекта (foo + 42, ++bar, etc.). Но есть он далеко не у всех объектов (т. е. есть, но возвращает сам объект, поэтому игнорируется) и обязан возвращать примитив, иначе будет проигнорирован и будет вызван toString. toString используется для строкового преобразования объекта (alert(foo)). Есть у всех объектов, обычно не очень информативен ([object Object]), но очень удобен, если нужно перегрузить оператор, например (в JS нет перегрузки/создания операторов). Тоже обязан вернуть примитив. Читать подробнее. У использования этих операторов есть нюансы (как везде в JS, наверное, экой коварный язык однако!), которые проще узнать из спецификации. www.ecma-international.org whatwg.org ES5 на русском Отличный учебник JS

Ответ 2



Если непонятно в источниках, стоит обратиться к спецификации: какой из данных методах будет вызван определяется внутри абстрактной операции ToPrimitive, которая выполняется практически при всех операциях с объектами, например: арифметические операции, операции сравнения и т.д. Операция ToPrimitive ( input [, PreferredType] ) Когда Type(input) - Object, выполняются следующие шаги: Если PreferredType отсутствует, hint будет "default". Если PreferredType подсказывает String, hint будет "string". Если PreferredType подсказывает Number, hint будет "number". Пусть exoticToPrim - GetMethod(input, @@toPrimitive). Если exoticToPrim это не undefined, тогда result будет Call(exoticToPrim, input, «hint»). ReturnIfAbrupt(result). Если Type(result) не Object, вернуть result. Бросить исключение TypeError. Если hint="default", hint будет "number". Вернуть результат OrdinaryToPrimitive(input,hint). Как видно из алгоритма, если у объекта нет внутренней экзотической функции для приведения к примитивному значению будет вызываться OrdinaryToPrimitive. При вызове абстрактной операции OrdinaryToPrimitive с аргументами O и hint, будут выполняться следующие шаги: Проверка типа: Type(O) - Object Проверка типа: Type(hint) это String и значение "string" или "number". Если hint = "string", тогда methodNames будет списком «"toString", "valueOf"». Иначе, methodNames будет списком «"valueOf", "toString"». Для каждого name из methodNames method будет Get(O, name). Если IsCallable(method) = true, тогда result = Call(method, O). Если Type(result) не Object, вернуть result. Бросить исключение TypeError. Примечание: Когда ToPrimitive вызывается без параметра hint, поведение такое же, как в случае передачи hint значения Number. Однако, объекты могут переопределить это поведения определив метод @@toPrimitive. Из объектов в текущей спецификации только объекты Date и Symbol переопределяют поведение по умолчанию. Объекты Date рассматривает вызов без передачи hint, как будто передали String.

Комментариев нет:

Отправить комментарий