Как вы можете заставить объект javascript рассматриваться как фальшивый?

Рассматриваемый мной вариант использования - создание безнадежно эгоцентрического Null для объединения.

Этот код работает, но требует явной проверки по рассматриваемому Null:

const Null = new Proxy({}, {get: () => Null});

let data = Null;

console.log(data.a.b.c.d !== Null ? "Has value" : "Is Null");

Я хотел бы иметь возможность опустить явную проверку и просто сделать

console.log(data.a.b.c.d ? "Has value" : "Is Null");

но это не работает, потому что мой Null является объектом и поэтому считается правдой.

spec, похоже, указывает на то, что это не Это невозможно, но javascript - такая странная экосистема, что я надеюсь, что кто-то сможет придумать возможное решение.

(Также, пожалуйста, не обсуждайте достоинства такого рода Null, я знаю, что это потенциально спорный вопрос, и меня просто интересует, МОЖНО ли это сделать, а не ДОЛЖНО ли это быть сделано.)


person david    schedule 16.01.2017    source источник
comment
Возможный дубликат Может ли объект быть ложным?   -  person Sheepy    schedule 16.01.2017
comment
Используйте служебную функцию, которая возвращает то, что вы хотите   -  person charlietfl    schedule 16.01.2017


Ответы (1)


Нет, ты не можешь. Ссылка на объект никогда не бывает «ложной». Вы можете добавить методы valueOf() и toString(), которые возвращают ложные значения при их вызове, но если все, что проверено, - это ссылка, которая не принесет никакой пользы.

person Pointy    schedule 16.01.2017
comment
Непосредственным контрпримером является document.all instanceof Object с !!document.all === false, но это действительно единственное исключение, которое невозможно подражать. На самом деле я не стал отвечать «Нет» через 5 минут, поэтому я собираюсь оставить вопрос открытым до тех пор, пока кто-нибудь не предложит новый метод, или пока язык не разовьется до такой степени, что это станет возможным. . - person david; 16.01.2017
comment
@david что? document.all является архаичным, и в любом браузере в наши дни значение будет undefined. Может быть, IE сохраняет его даже в Edge, но тогда он не будет undefined. Не уверен, что понимаю, о чем вы здесь говорите. В любом случае фактическая ссылка на объект определенно никогда не будет ложной. - person Pointy; 16.01.2017
comment
@david также document.all instanceof Object возвращает true в Firefox, а !!document.all == false возвращает false, что имеет смысл. - person Pointy; 16.01.2017
comment
Да, это архаично, но оно есть. Большинство браузеров сохранят его, потому что обратная совместимость - важная вещь в веб-разработке. - person david; 16.01.2017
comment
Интересно, что моя версия firefox !!document.all === false возвращает true. На какой версии вы проверяете? Мой 52.0a2 (2016-12-06) (64-bit) - person david; 16.01.2017
comment
Firefox 50.1.0 возвращает true для !!document.all === false, потому что это верно. document.all это undefined в современном Firefox. - person Pointy; 16.01.2017
comment
Я думал, вы сказали, что document.all instanceof Object вернул true в вашем браузере? undefined instanceof Object вернет false. - person david; 16.01.2017
comment
Нет, в Firefox v50 document.all равно undefined, а undefined не является экземпляром Object. - person Pointy; 16.01.2017
comment
Тот факт, что document.all instanceof Object возвращает true, вероятно, имеет какое-то отношение к тому, что происходит с undefined в левой части instanceof. Это undefined, потому что Firefox этого не реализует. Если он оказывается экземпляром 'Object', это потому, что что-то превращает его в null, держу пари. - person Pointy; 16.01.2017