null

JavaScript porównywanie jednocześnie do null i undefined

Posted on Updated on

Wklepanie poniższych kommend wzróci takie wyniki jak w komentarzu po prawej

undefined == null; true
null == null; true
undefined != null; false
null != null; false
“” != null; true

Reasumując wystarczać mi na razie będzie porównanie “argument == null” gdy w rzeczywistości będę chciał sprawdzić “argument === undefined || argument === null”
działa to też dla odwrotnego operator, czyli napiszę “argument != null” zamiast pisać “argument !== undefined && argument !== null”

Sprytny czytelnik zauważy że ta rzecz powinna też działać gdy “argument == undefined” i ma rację. Ja jednak na razie zostaję przy porównywaniu do nulla.

Update

Gdy próbowałem sięgać pamięcią do tej wiedzy to wydawało mi się że ta rzecz dzieje się w TypeScript-cie, okazało się jednak, że to czysty JS i można go np używać również wewnątrz markupu w angularze.

Gdzie na pewno ‘null’ to za mało

Posted on Updated on

Nie lubię nulli. Uważam że są nadużywane. A dodatkowo powinno się korzystać z rozszerzeń typu Option<T>, zeby explicite zaznaczyć brak wartości. Dzisiaj trafiłem na przykład który jest dosyć bliski każdemu i może produkować niejednoznaczne wyniki.

When null is not enough: an option type for C#

Na przykład metoda FirstOrDefault. Mając pustą listę stringów, FirstOrDefault wskazuje brak pierwszej wartości poprzez zwrócenie nulla. Ale mając listę rozpoczynająca się nullowym stringiem także zwróci null. Rozróżnienie tych dwóch przypadków jest często istotne, ale FirstOrDefault nie zrobi tego za ciebie (pomimo posiadania koniecznej logiki). Może zrefaktorować FirstOrDefault, aby rozróżniała między tymi dwoma przypadkami…, ale co powinna zwrócić? Odpowiedzią jest: typ opcji.

Mały refaktor – przerzucenie sprawdzania nulla

Posted on

Pierwszy przykład

Poprawny kod:

void Foo(object defaultValue)
{
    string defaultValueAsString = != null ? defaultValue.ToString() : string.Empty;
    // ...
}

Czytelniejszy kod:

void Foo(object defaultValue)
{
    string defaultValueAsString = (defaultValue ?? string.Empty).ToString();// 
    // ...
}

Oczywiście ktoś może sie doczepić że to nie jest to samo bo wywołamy dodatkowy ToString() na string.Empty – w mojej opinii pomijalne.

Drugi przykład

Poprawny kod:

// sting[] names;
return names == null ? string.Empty : string.Join(",", names);

Czytelniejszy kod:

// sting[] names;
return string.Join(",", names ?? Enumerable.Empty<string>());

Null-coalescing (??) operator działa też dla typów nullable

Posted on Updated on

Metoda pobierająca ale też od razu cachująca jakieś dane mogłaby wygladać tak:

private CustomerData _data; // assigned null by default

public CustomerData Data
{
    get
    {
        // Retrieve data that is expensive to get only at first contact
        _data = _data ?? GetValue(); 

        return _data;
    }
}

Korzystamy z operatora ?? który zwróci albo vartość po lewej stronie (gdy jest ona nie nullem) albo wartość po prawej stronie (gdy ta po lewej jest nullem).

Czy typy nullable (double?) też tak można skracać? Kiedyś napisałbym tak:

private double? _value;

public double Value
{
    get
    {
        if (!_value.HasValue)
        {
            _value = CalculateValue();
        }

        return _value.Value;
    }
}

Teraz jednak wiem że operator ?? zadziała też tutaj:

private double? _value;

public double Value
{
    get
    {
        _value = _value ?? CalculateValue();

        return _value.Value;
    }
}