Как можете да накарате 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 е обект и като такъв се третира като верен.

спецификация изглежда показва, че това не е Не е възможно, но javascript е толкова странна екосистема, че се надявам някой да успее да предложи възможно решение.

(Също така, моля, не обсъждайте достойнствата на този вид Null, знам, че това е потенциално спорен въпрос и се интересувам само дали МОЖЕ да се направи, а не дали ТРЯБВА да се направи.)


person david    schedule 16.01.2017    source източник
comment
Възможен дубликат на Може ли един обект да е false?   -  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
@давид какво? 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