Optional chaining in Javascript

https://v8.dev/features/optional-chaining

In loc de

// Error prone-version, could throw.
const nameLength = db.user.name.length;

// Less error-prone, but harder to read.
let nameLength;
if (db && db.user && db.user.name)
  nameLength = db.user.name.length;

se va putea scrie cam asa

// Still checks for errors and is much more readable.
const nameLength = db?.user?.name?.length;

In combinatie cu null coalescing

const middleName = object?.names?.middle ?? '(no middle name)';
  // → '(no middle name)'

Momentan nu este implementat in niciun browser. Se poate folosi cu Babel

4 Likes

E o chestie care trebuia să fie by default în atâtea ES-uri câte au apărut…

4 Likes

Din ce stiam eu, cei de la Typescript (?) au zis ca nu vor implementa asta. Period.
Era intr-un comentariu la un issue pe github.

Poate suna arhaic, dar nu se mai foloseste ***object.hasOwnProperty(‘x’)***?

imi pare mai elegant ?.
si oricum, conform https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty, verifica daca obiectul are propietatea respectiva, nu daca este nula :slight_smile:

LE:

Daca propietatea este nula, Object.hasOwnProperty('coupon') intoarce false :slight_smile:

let obj = {
    name: "Cosmin",
    coupon: null
}

console.log(Object.hasOwnProperty('coupon'))

//false
1 Like

În Javascript null sau lipsa sunt echivalente:

Object.prototype.hasOwnProperty() verifica doar proprietatile directe pe obiectul respectiv, insa nu cauta pe prototype-ul obiectului.

@Cosmin_Popescu Object.prototype.hasOwnProperty() NU intoarce false daca proprietatea are valoarea null. Nu verifica valoarea proprietatii.

Tu ai cautat daca exista proprietatea coupon pe obiectul global Object :slight_smile: Ar fi trebuit sa folosesti in forma urmatoare Object.prototype.hasOwnProperty.call(obj, 'coupon')

https://codepen.io/danielbokor/pen/VwZMxEg

1 Like

yup !
m-am lamurit :smiley:
merci !

In niciun caz nu sunt echivalente!

null este un tip de date in JavaScript, care este folosit in mod intentionat ca valoare a unei variabile/proprietati. In cazul in care accesezi variabila/proprietatea respectiva, ti se va returna valoarea acesteia, adica null;

In cazul in care accesezi proprietate care nu exista (lipsa), ti se va returna undefined, care este un tip de date diferit fata de null !

In al 3lea rand, exista conceptul de undeclared care presupune sa accesezi o variabila care nu a fost declarata, caz in care ti se returneaza o eroare de forma ReferenceError in care ti se spune ca variabila nu a fost definita (declarata).

https://codepen.io/danielbokor/pen/LYPzrYq

tl;dr: null si undefined NU sunt echivalente :slight_smile:

1 Like
  1. Nu scoate din context: pentru hasOwnProperty null sau lipsa valori sunt echivalente (nu am zis identice, ci echivalente… ex: == vs ===).

  2. Nu am zis eu asta, MDN zice:

    The value null represents the intentional absence of any object value. It is one of JavaScript’s
    primitive values.

    Și da, știu ca e nunațată afirmația cu absența intenționată, dar nu astă era conextul.

  3. Asta merge doar în strict mode care trebuie activat explicit (es2015 and up), nu?

  1. Faptul ca atat null cat si undefined sunt falsy values nu inseamna ca ele sunt echivalente, asa cum nici empty string si 0 (zero) nu sunt echivalente, desi sunt tot falsy values.

Object.prototype.hasOwnProperty() returneaza true daca daca proprietatea exista definita pe obiect, indiferent de valoarea sa (poate fi chiar si null sau undefined setat in mod explicit).
In schimb, returneaza false daca proprietatea nu este definita pe obiect.

  1. MDN zice asa

The value null represents the intentional absence of any object value. It is one of JavaScript’s
primitive values.

Asta inseamna ca proprietatea/variabila exista doar ca are valoarea null setata in mod intentionat.
Daca nu ar fi avut nicio valoare, ar fi returnat undefined (ceea ce e diferit fata de null).

  1. (A) Accesarea de tip Right Hand Side a unei variabile nedeclarate returneaza eroare indiferent daca exista strict mode setat sau nu.
    (B) In schimb, referinta de tip Left Hand Side (asignarea valorii unei variabile) functioneaza doar daca strict mode nu e setat. Daca strict mode este setat, nu functioneaza nici referinta LHS.
    Pe scurt, (A) nu poti citi ceva ce nu exista, insa (B) se poate defini o variabila la runtime in cazul in care nu avem strict mode.

Ai afirmat ca null si lipsa unei variabile/proprietati ar fi echivalente. In niciun caz nu este asa.

1 Like

Aveti idee cand va fi disponibil in Node ?

Poti sa il folosesti deja cu babel-node in development si pentru production sa faci transpile.


const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined

console.log(adventurer.someNonExistentMethod?.())
// expected output: undefined

Si a fost integrat in mai multe browsere. :slight_smile:

4 Likes

Asta nu poate ascunde erorile de programare? :face_with_monocle:

const myCat = adventurer.catf?.name; // unde-i my cat? :))

Probabil daca vezi undefined unde nu te astepti. :wink:

Si este disponibil si in Node.js. :smiley:

V8 upgraded to V8 8.1

As always a new version of the V8 JavaScript engine brings performance tweaks and improvements as well as keeping Node.js up with the ongoing improvements in the language and runtime. This time we also have some naming fun with it being version 8 of V8 (“V8 of V8”).

Highlights of the new JavaScript features include:

  • Optional Chaining — MDN

  • Nullish Coalescing — MDN

  • Intl.DisplayNamesMDN

  • Enables calendar and numberingSystem options for Intl.DateTimeFormat MDN

For more information about the new features in V8 checkout the Node.js V8 blog: https://v8.dev/blog.