2017-01-16 2 views
4

Der Use-Case Ich erwäge ist die Schaffung eines hoffnungslos egozentrisch Null für Koaleszenz.Wie können Sie bewirken, dass ein Javascript-Objekt als Falsy behandelt wird?

Dieser Code funktioniert, erfordert aber eine explizite Prüfung gegen die Null in Frage:

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

 
let data = Null; 
 

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

ich in der Lage sein möchten, die explizite Kontrolle auszulassen und einfach tun

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

aber das funktioniert nicht, weil mein Null ein Objekt ist, und als solche ist treate d als truthy.

Die spec scheint darauf hinzuweisen, dass dies nicht möglich ist, aber Javascript ist so ein seltsames Ökosystem, dass ich hoffe, dass jemand in der Lage sein wird, eine mögliche Lösung zu finden.

(Bitte auch diskutieren nicht über die Vorteile dieser Art von Null, ich weiß, es ist eine potenziell strittige Frage und ich bin rein daran interessiert, wenn es getan werden kann, nicht, ob es getan werden sollte.)

+0

Mögliche Duplikate von [Kann ein Objekt falsch sein?] (Http://stackoverflow.com/questions/2081195/can-an-object-be-false) – Sheepy

+0

Verwenden Sie eine Dienstprogrammfunktion, die zurückgibt, was Sie wollen – charlietfl

Antwort

3

Nein, das geht nicht. Ein Objektreferenz ist niemals "falsy". Sie können valueOf() und toString() Methoden hinzufügen, die falschen Werte zurückgeben, wenn sie aufgerufen sind, aber wenn das alles getestet ist eine Referenz, die nichts nützen wird.

+1

Eine sofortige Gegenbeispiel ist 'document.all instanceof Object', mit' !! document.all === false', aber das scheint eine einzige Ausnahme zu sein, die nicht emuliert werden kann. ich nach einer <5 Minuten war nicht wirklich „Nein“ als Antwort, so offen, ich werde die Frage verlassen, bis entweder jemand zusammen mit einem neuen Verfahren kommt, oder die Sprache entwickelt sich zu einem Punkt, wo es sich nicht möglich, dies zu tun. – david

+0

@david was? 'document.all' ist archaisch, und in jedem Browser in der heutigen Zeit wird der Wert 'undefiniert' sein. Vielleicht behält IE es sogar in Edge, aber dann wird es * nicht undefiniert. Ich bin mir nicht sicher, ob ich sehe, worum es hier geht. In jedem Fall wird eine tatsächliche Objektreferenz definitiv ** niemals ** falsch sein. – Pointy

+0

@ David auch 'document.all Instanceof Object' gibt' true' in Firefox und '!! document.all == false' gibt' false', die durchaus Sinn macht. – Pointy

Verwandte Themen