31.12.2015, 14:11
|
Интересующийся
|
|
Регистрация: 23.12.2015
Сообщений: 16
|
|
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. Скажем так - это мои предположения исходя из полученных результатов. Но я не нашел в документации, где бы рассматривался подобный пример, чтобы чётко иметь представление об алгоритме работы.
|
|
31.12.2015, 14:17
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
|
|
31.12.2015, 14:26
|
Интересующийся
|
|
Регистрация: 23.12.2015
Сообщений: 16
|
|
Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ? Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают. Запятая тоже.. alert( (7, 8, foo) ); // 'foo'
|
|
31.12.2015, 14:40
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
Сообщение от Nazaki
|
Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ?
|
Нет.
Сообщение от Nazaki
|
Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают.
|
var foo = {
toString: function() {
return 'foo';
},
valueOf: function() {
return 2;
}
};
alert(typeof (foo ^ '1'));
|
|
31.12.2015, 14:51
|
Интересующийся
|
|
Регистрация: 23.12.2015
Сообщений: 16
|
|
Всё что я пока что понял, что при применениее различных операторов к объекту, у которого есть оба этих метода, результат будет тот или этот.. А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
|
|
31.12.2015, 15:40
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
Сообщение от Nazaki
|
А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
|
Здесь главное то, что ожидает получить интерпретатор. Если ему нужна строка то будет вызываться метод toString у объекта, а если число, то соответственно valueOf
|
|
31.12.2015, 15:49
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
также советую ТСу, для упорядоченности мыслей в рамках темы, прочитать эту статью
|
|
31.12.2015, 21:16
|
Интересующийся
|
|
Регистрация: 23.12.2015
Сообщений: 16
|
|
Нуууу, так эту статью я год назад сам написал.. зачем мне ее читать )))
Давай лучше вернемся к моему вопросу. Объясните пожалуйста на пальцах, почему alert( foo + '1' ); возвращает '21' а не 'foo1'.. Я не понимаю, что значит фраза "что ожидает получить интерпретатор". А вдруг он ожидает именно строку, а не числовое значение, которое потом нужно еще привести в строку ))
|
|
31.12.2015, 22:09
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
Сообщение от 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);
Т.е. интерпретатор ожидает получить первые два параметра в виде чисел, и пытается перевести их в числа
|
|
01.01.2016, 22:52
|
Интересующийся
|
|
Регистрация: 23.12.2015
Сообщений: 16
|
|
И я отлично вижу, что в моём примере идет две стадии преобразования. Но мой вопрос такой: Почему в данном примере интерпретатор возвращает Number (а не String) и потом преобразовывает в строку? По какому признаку он определил, что нужно Number вернуть?
Вот если бы у вас не было возможности выполнить код, а дать ответ опираясь исключительно на знания - вы ведь можете это сделать.. Просто глядя на код. Мой вопрос: что вам подсказывает, что интерпретатор ожидает Number? "Плюсик"? Если да - то почему.. Если что-то другое, скажите что.. Откройте тайну, умоляю ))
|
|
|
|