Napište lepší kód pomocí těchto 5 funkcí JavaScriptu

JavaScript je jedním z nejpopulárnějších počítačových jazyků všech dob, jedním z důvodů je vysoce intuitivní syntaxe JavaScriptu. To není ani to nejlepší, nejlepší na tom je, že do jazyka je pravidelně přidáváno mnoho nových funkcí.

Dnes uvidíme některé z těchto nových funkcí, které nám pomohou s psaním intuitivnějšího kódu.

Nulový slučovací operátor (??)

Nulový slučovací operátor (??) je logický operátor, který vrací svůj operand na pravé straně, když je jeho operand na levé straně null nebo undefined a jinak vrátí svůj levý operand.


false || '@sun_anshuman' // returns '@sun_anshuman'

false ?? '@sun_anshuman' // returns false

0 || '@sun_anshuman' // returns '@sun_anshuman'

null || '@sun_anshuman' // returns '@sun_anshuman'

null ?? '@sun_anshuman' // returns '@sun_anshuman'

undefined ?? '@sun_anshuman' // returns '@sun_anshuman'

Problém s || je, že je to booleovský operátor, takže před vyhodnocením převede levý operand na booleovský, takže jak 0, tak '' jsou false .

Použití případ od příkladu

Předpokládejme, že vytváříte hru, kde je minimální skóre 0 a -1 považujete za neplatné skóre.

Než tedy aktualizujete skóre uživatele, měli byste se ujistit, že je nastaveno na platnou hodnotu nebo definované neplatné skóre.


// the server returns 0
let score = fetchScoreFromServer(); 

// we only want the score to be -1 only if the score
// is undefined or null because 0 is a valid value

const finalScore = score || -1; 
// but this will give us the invalid value even if,
// the first operand (0) is a valid value, leading to a bug

Jak to vyřešit, ptáte se? (Vím, že už to víš, haha)


let score = fetchScoreFromServer(); // returns 0 again

const finalScore = score ?? -1;
// finalScore stays score (0 in this case), 
// unless the server returned null or undefined

Logické nulové přiřazení (??=)

Operátor logického nulového přiřazení (x ??=y) přiřadí pouze v případě, že x je nulové (null nebo undefined ).


let user = { name: "anshuman_bhardwaj" };
user.twitter_name ??= "@sun_anshuman"; // assigns '@sun_anshuman'
console.log(user); // {name: "anshuman_bhardwaj", twitter_name: "@sun_anshuman"}

Toto je v podstatě operace přiřazení založená na ?? operátor.

Použití případ od příkladu


// the above example can be rewritten like this
let finalScore = fetchScoreFromServer(); // returns 0 again

finalScore ??= -1;
// keeps value of 0

Další dobré místo pro použití ?? by bylo při odkazování na vlastnosti objektu a použití výchozí hodnoty. V takovém případě můžeme použít logické nulové přiřazení ??= aby výchozí hodnoty byly undefined vlastnosti.


const user = { email: '[email protected]', company: '' }

// assign user.name to email username if it's undefined
user.name ??= email.split("@")[0]

// make company Canoo if company not available on user
user.company ??= 'Canoo'
// this time company stays empty string

v operátoru

Operátor in vrátí hodnotu true, pokud je zadaná vlastnost v zadaném objektu nebo jeho prototypovém řetězci.


const user = { email: '[email protected]' } 

'email' in user // return true

'name' in user // return false

Pamatujete si dobu, kdy jste používali undefined hodnoty, protože v Object chyběl odkazovaný klíč.

Stojí za zmínku, že

Použití případ od příkladu

Dobrým případem použití je spustit kontroly zdravého rozumu před spuštěním operací s vlastnostmi objektu, abyste se vyhnuli provádění nedefinovaných kontrol a chyb.

// we have an user object
let user = { email: "[email protected]" };

// now we want to assign it a name if its not available

// checks if user has email
if ("email" in user) {
  // checks if user has name
  if (!("name" in user)) {
    user["name"] = user.email.split("@")[0];
  } else {
   console.log("Welcome user: " + user.name);
  }
} else {
  console.error("User does not have required property: email");
}

Použití v poli zkontroluje, zda je daný index prázdný slot nebo ne


const emptyList = new Array(5)

empties[2]    // returns undefined
2 in empties  // returns false

empties[2] = 'anshuman_bhardwaj'
2 in empties  // returns true

Volitelné řetězení (?.)

?. operátor je jako . operátor řetězení, kromě toho, že místo způsobení chyby, pokud je odkaz (nulový nebo nedefinovaný), se výraz zkratuje s návratovou hodnotou nedefinováno.


let user = { name: 'anshuman' }

user.address.zipcode // TypeError

user.addess?.zipcode // returns undefined

Stojí za zmínku, že

  1. Při použití s ​​voláním funkcí vrátí hodnotu undefined, pokud daná funkce neexistuje.
  2. Volitelné řetězení nelze použít u nedeklarovaného kořenového objektu, ale lze jej použít s nedefinovaným kořenovým objektem.

Příklady použití


// user can be null or an Object containing email
const user = getUserFromDev() 

// if we do this it will run fine when user is an Object 
// but when user is null this will give a TypeError
console.log(user.email)

// we can fix this by using optional chaining

console.log(user?.email)
// logs the actual user email when user is an Object
// logs undefined if user is null but doesn't crash

Podmíněný ternární operátor (?)

Ternární operátor zkontroluje, zda je zadaná podmínka pravdivá, pokud je pravdivá, vrátí první výraz, jinak vrátí druhý výraz.

x ? y : z , znamená, že pokud je x pravda, vraťte y jinak vraťte z.


let user = { age: 22 }

user['status'] = user.age > 18 ? 'adult' : 'minor'
// user.status is 'adult'

Tento operátor není specifický pro JavaScript, poprvé jsem ho použil v C++.

Použití případ od příkladu


let user = { email: "[email protected]" };

// lets consider this code, simple enough?
if ("email" in user) {
  user["name"] = user.email.split("@")[0];
} else {
  user["name"] = "Anonymous";
}

// we can make it even simpler by using ternary
user["name"] = "email" in user ? user.email.split("@")[0] : "Anonymous";

Bonus

Zde je několik příkladů s kombinací výše uvedených funkcí, podívejme se, kdo všechno může správně odpovědět v komentářích.


// consider the examples independent of each other

const user = { email: '[email protected]', lastName: undefined }

// 1
user["firstName"] = "email" in user 
                            ? user.email.split("_")[0] 
                            : "Anonymous";

// 2
user["familyName"] ??= 'Bhardwaj'

// 3
console.log('lastName' in user)

// 4 
console.log('' ?? '@sun_anshuman')

Další informace

Můžete se také podívat na toto video na YouTube, kde tyto příklady vysvětluji

Můžete také rozdělit CodeSandBox a vyzkoušet příklady.

Doufám, že jste si čtení tohoto článku užili stejně jako já jeho psaní!

Pro více takového obsahu mě prosím sledujte na Twitteru

Zdroje

Dokumenty MDN