Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   toString или valueOf ??? (https://javascript.ru/forum/misc/60455-tostring-ili-valueof.html)

Nazaki 31.12.2015 14:11

toString или valueOf ???
 
Имею такой код
var foo = {
  toString: function() {
    return 'foo';
  },
  valueOf: function() {
    return 2;
  }
};
alert( foo ); // 'foo'
alert( foo + '1' ); // '21'
alert( foo || '3' ); // 'foo'


Насколько я заметил, интерпретатор возвращает toString, если с результатом не производить никаких манипуляций. Если с результатом что-то делаем, то вернет valueOf. Скажем так - это мои предположения исходя из полученных результатов. Но я не нашел в документации, где бы рассматривался подобный пример, чтобы чётко иметь представление об алгоритме работы.

EmperioAf 31.12.2015 14:17

https://learn.javascript.ru/object-conversion

Nazaki 31.12.2015 14:26

Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ? Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают. Запятая тоже.. alert( (7, 8, foo) ); // 'foo'

EmperioAf 31.12.2015 14:40

Цитата:

Сообщение от Nazaki
Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ?

Нет.
Цитата:

Сообщение от Nazaki
Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают.

var foo = {
  toString: function() {
    return 'foo';
  },
  valueOf: function() {
    return 2;
  }
};

alert(typeof (foo ^ '1'));

Nazaki 31.12.2015 14:51

Всё что я пока что понял, что при применениее различных операторов к объекту, у которого есть оба этих метода, результат будет тот или этот.. А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?

EmperioAf 31.12.2015 15:40

Цитата:

Сообщение от Nazaki
А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?

Здесь главное то, что ожидает получить интерпретатор. Если ему нужна строка то будет вызываться метод toString у объекта, а если число, то соответственно valueOf

EmperioAf 31.12.2015 15:49

также советую ТСу, для упорядоченности мыслей в рамках темы, прочитать эту статью

Nazaki 31.12.2015 21:16

Нуууу, так эту статью я год назад сам написал.. зачем мне ее читать )))

Давай лучше вернемся к моему вопросу. Объясните пожалуйста на пальцах, почему alert( foo + '1' ); возвращает '21' а не 'foo1'.. Я не понимаю, что значит фраза "что ожидает получить интерпретатор". А вдруг он ожидает именно строку, а не числовое значение, которое потом нужно еще привести в строку ))

EmperioAf 31.12.2015 22:09

Цитата:

Сообщение от Nazaki
Объясните пожалуйста на пальцах, почему alert( foo + '1' ); возвращает '21' а не 'foo1'

Перечитайте:
https://learn.javascript.ru/object-c...зования
Цитата:

Сообщение от Nazaki
Я не понимаю, что значит фраза "что ожидает получить интерпретатор"

Фраза "что ожидает получить интерпретатор" означает что у встроенных функций определёны типы получаемых значений. Например:
функция alert(message) попытается преобразовать message к строке если это не строка
А вот конструктор new Date() ожидает горазд большего:

new Date();
new Date(value);
new Date(dateString);
new Date(year, month[, day[, hour[, minute[, second[, millisecond]]]]]);


Или например метод Array.prototype.splice():

var arr = [3,4,5,6];
arr.splice(['2'], ['1']);
alert(arr);


var arr = [3,4,5,6];
arr.splice('2', ['1']);
alert(arr);

var arr = [3,4,5,6];
arr.splice({'1':'2'}, ['1']);
alert(arr);

Т.е. интерпретатор ожидает получить первые два параметра в виде чисел, и пытается перевести их в числа

Nazaki 01.01.2016 22:52

И я отлично вижу, что в моём примере идет две стадии преобразования. Но мой вопрос такой: Почему в данном примере интерпретатор возвращает Number (а не String) и потом преобразовывает в строку? По какому признаку он определил, что нужно Number вернуть?
Вот если бы у вас не было возможности выполнить код, а дать ответ опираясь исключительно на знания - вы ведь можете это сделать.. Просто глядя на код. Мой вопрос: что вам подсказывает, что интерпретатор ожидает Number? "Плюсик"? Если да - то почему.. Если что-то другое, скажите что.. Откройте тайну, умоляю ))


Часовой пояс GMT +3, время: 04:31.