Tworzę API, które zwraca wyniki w formacie JSON. Czy istnieje obecnie najlepsza praktyka dotycząca tego, czy powinniśmy uwzględniać klucze w wyniku, gdy wartość jest równa null? Na przykład:
{
"title":"Foo Bar",
"author":"Joe Blow",
"isbn":null
}
lub
{
"title":"Foo Bar",
"author":"Joe Blow"
}
Ponieważ drugi jest mniejszy, skłaniam się ku temu stylowi, ale nie jestem pewien, czy jest preferowany styl, czy nie. Z perspektywy klienta wydaje się, że oba style byłyby funkcjonalnie równoważne. Jakieś wady lub zalety każdego z nich?
javascript
json
null
undefined
jjathman
źródło
źródło
Odpowiedzi:
Drugi pozwoli zaoszczędzić niewielką ilość przepustowości, ale jeśli byłby to problem, użyłbyś również tablic indeksowanych zamiast wypełniać JSON kluczami. Najwyraźniej
["Foo Bar","Joe Blow"]
jest znacznie krótszy niż to, co masz teraz.Pod względem użyteczności nie sądzę, że ma to jakiekolwiek znaczenie. W obu przypadkach
if(json.isbn)
przejdzie doelse
. Zwykle nie ma potrzeby rozróżniania międzynull
(brak wartości) iundefined
(brak podanej wartości).źródło
!= null
(nieprzeznaczony ściśle)if( typeof onbeforepaste == "undefined")
aby sprawdzić, czyonBeforePaste
jest obsługiwany. Nawet wtedy nie robi to żadnej różnicy, ponieważ możesz przypisać zdarzenia, ile chcesz (po prostu nic nie zrobią, jeśli nie są obsługiwane).Jestem fanem zawsze włączania null wyraźnie, ponieważ ma to znaczenie. Pominięcie właściwości pozostawia niejednoznaczność.
Tak długo, jak Twój protokół z serwerem jest uzgodniony z dowolnym z powyższych, może działać, ale jeśli przekażesz wartości null z serwera, uważam, że dzięki temu twoje API będzie później bardziej elastyczne.
Powinienem również wspomnieć, że funkcja hasOwnProperty języka JavaScript zapewnia dalszy wgląd.
/* if true object DOES contain the property with *some* value */ if( objectFromJSON.hasOwnProperty( "propertyName" ) ) /* if true object DOES contain the property and it has been set to null */ if( jsonObject.propertyName === null ) /* if true object either DOES NOT contain the property OR object DOES contain the property and it has been set to undefined */ if( jsonObject.propertyName === undefined )
źródło
"propertyName" in objectFromJSON
Zamiast tego napisałbymobjectFromJSON.hasOwnProperty("propertyName")
. Ponadto, jeśli nalegasz na używanie,hasOwnProperty
napiszObject.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")
dla bezpieczeństwa.W JavaScript
null
oznacza coś zupełnie innego niżundefined
.Dane wyjściowe JSON powinny odzwierciedlać to, co jest używane i potrzebne w aplikacji w określonym kontekście korzystania z danych JSON.
źródło
{"prop":undefined}
różni się od{}
.Zdecydowanie powinieneś to uwzględnić, jeśli istnieje potrzeba rozróżnienia między nimi,
null
aundefined
ponieważ mają one dwa różne znaczenia w JavaScript. Możesz myśleć onull
znaczeniu, że właściwość jest nieznana lub pozbawiona znaczenia, iundefined
że oznacza, że właściwość nie istnieje.Z drugiej strony, jeśli nie ma potrzeby, aby ktokolwiek dokonywał takiego rozróżnienia, nie przejmuj się.
źródło
Myślę, że nie ma różnicy, kiedy używasz JSON jako danych stojących za doświadczeniem użytkownika.
Różnica pojawia się w plikach JSON-config, gdy użytkownik powinien coś edytować ręcznie. Korzystając z pierwszego przykładu, dajesz użytkownikowi wskazówkę dotyczącą konfiguracji.
źródło