Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.12.2015, 14:11
Интересующийся
Отправить личное сообщение для Nazaki Посмотреть профиль Найти все сообщения от Nazaki
 
Регистрация: 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. Скажем так - это мои предположения исходя из полученных результатов. Но я не нашел в документации, где бы рассматривался подобный пример, чтобы чётко иметь представление об алгоритме работы.
Ответить с цитированием
  #2 (permalink)  
Старый 31.12.2015, 14:17
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

https://learn.javascript.ru/object-conversion
Ответить с цитированием
  #3 (permalink)  
Старый 31.12.2015, 14:26
Интересующийся
Отправить личное сообщение для Nazaki Посмотреть профиль Найти все сообщения от Nazaki
 
Регистрация: 23.12.2015
Сообщений: 16

Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ? Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают. Запятая тоже.. alert( (7, 8, foo) ); // 'foo'
Ответить с цитированием
  #4 (permalink)  
Старый 31.12.2015, 14:40
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от Nazaki
Т.е. всё что преобразует результат к примитиву заставит вернуть valueOf ?
Нет.
Сообщение от Nazaki
Если так, то какие манипуляции кроме математических операторов приводят к примитиву? Судя по результатам - логические этого не делают.
var foo = {
  toString: function() {
    return 'foo';
  },
  valueOf: function() {
    return 2;
  }
};

alert(typeof (foo ^ '1'));
Ответить с цитированием
  #5 (permalink)  
Старый 31.12.2015, 14:51
Интересующийся
Отправить личное сообщение для Nazaki Посмотреть профиль Найти все сообщения от Nazaki
 
Регистрация: 23.12.2015
Сообщений: 16

Всё что я пока что понял, что при применениее различных операторов к объекту, у которого есть оба этих метода, результат будет тот или этот.. А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
Ответить с цитированием
  #6 (permalink)  
Старый 31.12.2015, 15:00
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Nazaki Посмотреть сообщение
А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
По ссылке EmperioAf всё четко объяснено вроде... надо просто почитать...
Ответить с цитированием
  #7 (permalink)  
Старый 31.12.2015, 15:40
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от Nazaki
А может кто-то чётко объяснить, при каких обстоятельствах мы получим toString, а когда valueOf?
Здесь главное то, что ожидает получить интерпретатор. Если ему нужна строка то будет вызываться метод toString у объекта, а если число, то соответственно valueOf
Ответить с цитированием
  #8 (permalink)  
Старый 31.12.2015, 15:49
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

также советую ТСу, для упорядоченности мыслей в рамках темы, прочитать эту статью
Ответить с цитированием
  #9 (permalink)  
Старый 31.12.2015, 21:16
Интересующийся
Отправить личное сообщение для Nazaki Посмотреть профиль Найти все сообщения от Nazaki
 
Регистрация: 23.12.2015
Сообщений: 16

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

Давай лучше вернемся к моему вопросу. Объясните пожалуйста на пальцах, почему alert( foo + '1' ); возвращает '21' а не 'foo1'.. Я не понимаю, что значит фраза "что ожидает получить интерпретатор". А вдруг он ожидает именно строку, а не числовое значение, которое потом нужно еще привести в строку ))
Ответить с цитированием
  #10 (permalink)  
Старый 31.12.2015, 22:09
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 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);

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ValueOf. Все точки над И. Vyus Общие вопросы Javascript 4 16.06.2014 22:29
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
В зависимости от referrer выводить рекламу adsene или зорьки wlad2 Общие вопросы Javascript 12 19.12.2010 01:02
Как узнать свернуто окно браузера или нет. bar-boss Events/DOM/Window 3 25.09.2008 16:09