savostin
@savostin
Еще один программист

Почему так происходит?

const obj = {
  valueOf() {
    console.log('value');
    return false;
  },
  toString() {
    console.log('string');
    return false;
  },
  [Symbol.toPrimitive](hint) {
    console.log('hint', hint);
    return false;
  }
};

console.log(obj  ? 'yes' : 'no');
console.log(obj == true ? 'yes' : 'no');
"yes"
"hint", "default"
"no"


А так:
const obj = {
  valueOf() {
    console.log('value');
    return false;
  },
  toString() {
    console.log('string');
    return false;
  },
};

console.log(obj  ? 'yes' : 'no');
console.log(obj == true ? 'yes' : 'no');
"yes"
"value"
"no"


Суть вопроса: что вызывается при obj ? 'yes' : 'no' и как это у объекта переписать? Нужно при таком вызове у существующего объекта получить false ;)
  • Вопрос задан
  • 152 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В первом случае вызывается преобразование ToBoolean, которое для Object всегда возвращает true.
https://262.ecma-international.org/9.0/#sec-toboolean

Во втором случае нестрогое сравнение Object и Boolean преобразуется как
Object == ToNumber(Boolean)
ToPrimitive(Object) == ToNumber(Boolean)
OrdinaryToPrimitive(Object, "number") == ToNumber(Boolean)
Object.valueOf == ToNumber(true)
false == 1
ToNumber(false) == 1
0 == 1
false
https://262.ecma-international.org/9.0/#sec-abstra...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы