2017-01-16 7 views
4

Используемый случай, который я рассматриваю, создает безнадежно эгоцентричный Null для объединения.Как вы можете заставить объект javascript рассматриваться как ложь?

Этот код работает, но требует явной проверки против 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 является объектом, и, как таковой, d как правдивый.

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

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

+0

Возможный дубликат [Может ли объект быть ложным?] (Http://stackoverflow.com/questions/2081195/can-an-object-be-false) – Sheepy

+0

Используйте функцию утилиты, которая возвращает то, что вы хотите – charlietfl

ответ

3

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

+1

counter-example - 'document.all instanceof Object', с' !! document.all === false', но это похоже на одиночное исключение, которое невозможно эмулировать. Я не был действительно после <5 минут «Нет» в качестве ответа, поэтому я собираюсь оставить вопрос открытым до тех пор, пока кто-нибудь не придет с новым методом, или язык не превратится в точку, где он становится возможно. – david

+0

@ давид какой? 'document.all' является архаичным, и в любом браузере в этот день и в возрасте значение будет' undefined'. Может быть, IE сохраняет его, даже в Edge, но тогда он * не будет 'undefined'. Я не уверен, что вижу, о чем вы здесь. В любом случае, фактическая ссылка на объект обязательно ** никогда не будет ложной. – Pointy

+0

@david также 'document.all instanceof Object' возвращает' true' в Firefox, а '!! document.all == false' возвращает' false', что имеет смысл. – Pointy