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. Скажем так - это мои предположения исходя из полученных результатов. Но я не нашел в документации, где бы рассматривался подобный пример, чтобы чётко иметь представление об алгоритме работы. |
|
Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ? Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают. Запятая тоже.. alert( (7, 8, foo) ); // 'foo'
|
Цитата:
Цитата:
var foo = { toString: function() { return 'foo'; }, valueOf: function() { return 2; } }; alert(typeof (foo ^ '1')); |
Всё что я пока что понял, что при применениее различных операторов к объекту, у которого есть оба этих метода, результат будет тот или этот.. А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
|
Цитата:
|
также советую ТСу, для упорядоченности мыслей в рамках темы, прочитать эту статью
|
Нуууу, так эту статью я год назад сам написал.. зачем мне ее читать )))
Давай лучше вернемся к моему вопросу. Объясните пожалуйста на пальцах, почему alert( foo + '1' ); возвращает '21' а не 'foo1'.. Я не понимаю, что значит фраза "что ожидает получить интерпретатор". А вдруг он ожидает именно строку, а не числовое значение, которое потом нужно еще привести в строку )) |
Цитата:
https://learn.javascript.ru/object-c...зования Цитата:
функция 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); Т.е. интерпретатор ожидает получить первые два параметра в виде чисел, и пытается перевести их в числа |
И я отлично вижу, что в моём примере идет две стадии преобразования. Но мой вопрос такой: Почему в данном примере интерпретатор возвращает Number (а не String) и потом преобразовывает в строку? По какому признаку он определил, что нужно Number вернуть?
Вот если бы у вас не было возможности выполнить код, а дать ответ опираясь исключительно на знания - вы ведь можете это сделать.. Просто глядя на код. Мой вопрос: что вам подсказывает, что интерпретатор ожидает Number? "Плюсик"? Если да - то почему.. Если что-то другое, скажите что.. Откройте тайну, умоляю )) |
Часовой пояс GMT +3, время: 04:31. |