Medium - Understand the Superpower of Optional Chaining in JavaScript

원문 - Javascript JeepπŸš™πŸ’¨

Trend νŒŒμ•…μ„ μœ„ν•œ Medium κΈ°κ³ λ¬Έ ν¬μŠ€νŒ… - μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°•λ ₯ν•œ μ˜΅μ…”λ„ 체이닝을 이해해 λ΄…μ‹œλ‹€; μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒˆλ‘œμš΄ κΈ°λŠ₯은 μ˜΅μ…”λ„ 체이닝에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

?.-> μ˜΅μ…”λ„ 체이닝 μ˜€νΌλ ˆμ΄ν„°

Image from twitter by Daniel Rosenwasser (@Daniel Rosenwasser).

Optional Chaining

μ˜΅μ…”λ„ 체이닝은 κ°μ²΄μ•ˆμ˜ ν”„λ‘œνΌν‹°κ°€ μ‚¬μš© κ°€λŠ₯ν•œμ§€ μˆ˜λ™μœΌλ‘œ 체크할 ν•„μš”κ°€ 없도둝 λ§Œλ“€μ–΄ 쀄 κ²ƒμž…λ‹ˆλ‹€. μ˜΅μ…”λ„ 체이닝을 μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ 체크가 μˆ˜ν–‰λ  κ²ƒμž…λ‹ˆλ‹€. μ˜΅μ…”λ„ 체이닝이 μ—†λŠ” 예제λ₯Ό λ³΄μ‹œμ£ .

function sayHi(user) {
  let name = user.name.toUpperCase();
  console.log(`Hi Mr. ${name}`);
}

μœ„μ˜ ν•¨μˆ˜λ₯Ό λ³΄μ‹œλ©΄ hi와 ν•¨κ»˜ μ‚¬μš©μžμ˜ 이름이 좜λ ₯될 κ²ƒμž…λ‹ˆλ‹€.

var user1 = { name: "John" };
sayHi(user1); // Hi Mr.JOHN.

κ·ΈλŸ¬λ‚˜ name ν”„λ‘œνΌν‹°κ°€ μ—†λŠ” user 객체λ₯Ό μ „λ‹¬ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ—λŸ¬κ°€ λ°œμƒν•  κ²ƒμž…λ‹ˆλ‹€.


sayHi({});
// TypeError: Cannot read property 'toUpperCase' of undefined.

sayHi();
// TypeError: Cannot read property 'name' of undefined.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μš°λ¦¬λŠ” κ°μ²΄μ•ˆμ— name ν”„λ‘œνΌν‹°κ°€ μ‚¬μš©κ°€λŠ₯ν•œ 지 μ²΄ν¬ν•˜λŠ” λ‘œμ§μ„ λ„£μ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

function sayHi(user) {
  let name = (user && user.name && user.name.toUpperCase()) || "Unknown";
  console.log(`Hi Mr. ${name}`);
}
sayHi({}); // Hi Mr. Unknown
sayHi(); // Hi Mr. Unknown

Using Optional Chaining

μ˜΅μ…”λ„ 체이닝은 μ—°μ‚°μž μ™Όμͺ½μ˜ 객체가 μœ νš¨ν•œμ§€ (nullμ΄λ‚˜ undefinedκ°€ μ•„λ‹Œμ§€) ν™•μΈν•©λ‹ˆλ‹€. ν”„λ‘œνΌν‹°κ°€ μœ νš¨ν•˜λ‹€λ©΄ μ—°μ‚°μž 였λ₯Έμͺ½μ„ μ‹€ν–‰ν•˜κ³  μ•„λ‹ˆλΌλ©΄ undefinedλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€. κ°„λ‹¨ν•œ 예제λ₯Ό ν•œλ²ˆ λ³΄μ‹œμ£ 

function sayHi(user) {
  let name = ( user?.name?.toUpperCase() )|| "unKnown";
  console.log(`Hi Mr. ${name}`);
}

μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μžμ™€ λ™μΌν•œ λ„€μ΄ν‹°λΈŒ μžλ°” 슀크립트 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

(property == undefined || property == null ) ? undefined : property

Using variables as property name

μ˜΅μ…”λ„ 체이닝에 μžˆλŠ” ν”„λ‘œνΌν‹° 이름을 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

var user = {name: "John", age: 20};
var Age = "age";
user?.[Age];
user?.["a"+"ge"]

Function call with optional chaining

μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλŠ” λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 데에도 μ˜΅μ…”λ„ 체이닝을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var user = {
  name: "John",
  getName() {
    return this.name;
  }
}
user?.getName?.();

Summary

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ˜΅μ…”λ„ 체이닝이 μΆ”κ°€λ˜μ—ˆλ‹€
  • undefinedλ₯Ό μ°Έμ‘°ν•˜λŠ” λ°μ—μ„œ 맀우 λ§Žμ€ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”λ§ŒνΌ JSμ—μ„œλŠ” νƒ€μž…μ²΄ν¬κ°€ μ€‘μš”ν•˜λ‹€; κ·Έλž˜μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 인기 μžˆλŠ” 거ꡬ..
  • 기쑴의 둜직, μ½”λ“œ μŠ€νƒ€μΌλ³΄λ‹€ μ’€ 더 κΉ”λ”ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλŠ” μ˜΅μ…”λ„ 체이닝이 μΆ”κ°€λ˜μ—ˆλ‹€.

Β© 2019. All rights reserved.

Powered by Hydejack v8.1.1