Wenn Sie nach Eigenschaften eines Objekts suchen, ist es nicht ausreichend, nach einer losen Gleichheit zu suchen. null
ist nicht genug.
Lose Gleichheit (==
) verwendet Typ Hinting in JavaScript, die versucht, die Mitglieder in einen gemeinsamen Typ zu konvertieren, der dann für die Bestimmung verwendet werden kann, ob sie gleich sind oder nicht. Aus diesem Grund schreiben Best Practices für JavaScript vor, dass strikte Gleichheit (===
) immer verwendet werden soll, um Rand-Case-Szenarien oder unbekanntes Verhalten beim Prüfen auf Werte oder Typen zu vermeiden. Sie können weitere Informationen über lose vs strikte Gleichheit finden Sie hier:
Während dies in Ihrer Funktion nicht ein Must-Have ist, ist es eine gute Praxis zu folgen und sich als Gewohnheit entwickeln, so dass beim späteren Code die Implikationen der losen Gleichheit (==
) vermieden werden könnten (zB Vermeiden von '3' == 3
, wenn eine Zahl oder ein String-Typ erwartet wird).
zwar ein Nachteil der Sprache, die von einigen als unter Verwendung von null
als Kontrolle für undefined
in Absicht ähnlich ist, ist aber tatsächlich in dem Code auszudrücken gemeint, dass der Coder einen object
(oder ihr Fehlen) zur Verfügung gestellt werden erwartet, anstelle eines primitiven Typs (number
, string
, boolean
, function
). Dies unterscheidet sich von Java oder einer anderen typisierten Sprache, wobei null
für Object
Typ definierte Variablen verwendet wird; , aber in JavaScript gibt es keine Einschränkung auf den angegebenen Typ.
Sie können weitere Informationen über null
bei MDN erfahren: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
In der Praxis und vor allem, wenn mit Werten zu tun, die außerhalb einer Einheit kommen -, die mit dem Fall eines API ist - ist eine bewährte Methode angesehen um zu überprüfen, ob der Typ ein object
ist, um sicherzustellen, dass es Eigenschaften hat.
Obwohl Ihr Code nicht inkorrekt ist, zeigt er doch, dass den Best Practices wenig Aufmerksamkeit geschenkt wird, was letztendlich dazu führen wird, dass Buggy-Code geschrieben wird.
Mein Vorschlag für Ihren Code, nach Best Practices und unabhängig von jeder Bibliothek ist:
function getStatusValue(response) {
// must be of type `object`, to have properties.
if (typeof response === 'object' &&
// any variable of type `object` might be `null`, so exclude that.
response !== null &&
// `metadata` property must be of type `object`, to have properties.
typeof response.metadata !== 'object' &&
// `metadata` is of type `object`, check for not being `null`.
response.metadata !== null) {
// `status` property is expected to be a string, given by the API spec
if (typeof response.metadata.status === 'string' &&
// on strings, we can access the `length` property to check if empty string (0 chars).
response.metadata.status.length > 0) {
// all good, return `status` property.
return response.metadata.status;
} else {
// `status` property is either not a string, or an empty string ('').
}
} else {
// invalid `response` object.
}
}
Auch könnte es einfacher sein, oder aus irgendwelchen Bibliotheken, die Sie für ein überprüfen integrieren, eine Funktion zum Erstellen gültiges Objekt; so etwas wie _.isObject oder dies:
function isObject(o) {
return (typeof o === 'object' && o !== null);
}
, die Sie später in dem oben verwendet werden könnten, wie so snipped:
function getStatusValue(response) {
if (isObject(response) && isObject(response.metadata)) {
if (typeof response.metadata.status === 'string' &&
response.metadata.status.length > 0) {
return response.metadata.status;
} else {
// `status` property is either not a string, or an empty string ('').
}
} else {
// invalid `response` object.
}
}
Als letzten Gedanken, wie es ist deutlich sichtbar, Best Practices folgende nicht erhöht die Größe des Codes, aber der Vorteil ist, dass der resultierende Code ist viel sicherer, mit weniger Chancen, Ausnahmen zu werfen (root von vielen Abstürzen App), einfacher zu kooperieren, und einfacher zu Tests/Coverage für zu bauen.
Zum einen können Sie '! = Null 'weglassen, weil' null'/'undefined' falsch ist – qxz
Ich benutze' if (obj && obj.prop) '. Um 'undefiniertes' Objekt zu verhindern, können Sie' strict mode' verwenden. –
Ja, wir verwenden den strikten Modus – anchnk