рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ, рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рдорд┐рд▓рди, рдФрд░ рд╡реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ


рдорд┐рдЧреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдлреЛрдЯреЛ ├Б рдкрдбрд░рд┐рдпрди ред

рд╢реБрдн рджрд┐рди, рджреЛрд╕реНрддреЛрдВ!

рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реИрдо рд╕реЗрджрд┐рдЧрд┐рдпрди рдХреЗ рд▓реЗрдЦ "рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреИрдирд┐рдВрдЧ, рдЕрд╢рдХреНрдд рддрд╛рд▓рдореЗрд▓ рдФрд░ рдХреИрд╕реЗ рд╡реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓реЗрдВрдЧреЗ " рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рди, рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдШ, рдФрд░ рд╡реЗ рд▓реЗрдЦрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ


рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХрд╛ред

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.7 рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ рдФрд░ рдирд▓ рдХреЛрд▓реЗрд╕рд┐рдВрдЧ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмрд╛рдмреЗрд▓ 7.8.0 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рджрд╛рд╡реЗрджрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╡реЗ рдХреНрд░рдорд╢рдГ 4 рдФрд░ 3 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реИрдВ, (23 рдЬрдирд╡рд░реА рдХреЛ, ECMAScript 2020 рдорд╛рдирдХ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛, рдЕрд╢рдХреНрддрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг, рдФрд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддреЗрдВ рд╣реИрдВ; рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Habr├й рдкрд░ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рд╣реИ) рдЬреЗрдПрд╕ рдИрдПрд╕ 2020 рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдиреБрд╡рд╛рдж , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЪреЛрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд▓рдЧрднрдЧред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ


рдЕрдХреНрд╕рд░, рд╣рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдмрд╣реБрдд рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА 100 рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдирд╣реАрдВ рд▓рд┐рдЦреА рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдирдХреИрдкреНрдб рдЯрд╛рдЗрдкрд░реНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

const data = {} data.user.id // Uncaught TypeError: Cannot read property 'id' of undefined //           -   

рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЫрджреНрдо рдХреЛрдб (рдЧрд▓рдд рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 { 'url': 'https://api.github.com/repos/sedighian/Hello-World/pulls/12', 'number': 12, 'state': 'open', 'title': 'Amazing new feature', 'user': { 'login': 'sedighian', 'id': 123234 }, 'labels': [{ 'id': 208045946, 'name': 'bug', }] } 

рдЕрдирдХреНрд░реЗрдб рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдЖрдИрдбреА рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ "рдХреБрдЫ рдбрд╛рдВрд╕ рдХрд░рдирд╛ рд╣реИ"ред рд╣рдо рдкрд╣рд▓реЗ рдЬрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ, рд╡рд╣ рдкреНрд░рддреНрдпреЗрдХ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡рд╕реНрддреБ рдХреА рд╕рдЪреНрдЪрд╛рдИ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рд╕рд╢рд░реНрдд рд╡рд┐рд╡рд░рдг рдХреА рддрд░рд╣ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреВрд▓рд┐рдпрди рдХреА рддрд░рд╣ рд▓реМрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рд╕рд╛рдл рдФрд░ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдм рддрдХ рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рд╣реИ:

 const userId = data && data.user && data.user.id //     const label = data && data.labels && data.labels[0] const someFuncRes = navigator && navigator.serviceWorker && window.serviceWorker() 

рдпрд╛, рдпрджрд┐ рдЖрдк рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ:

 const { user: { id } = {} } = data || {} //        const { user } = data || {} const { id } = user || {} 

рд▓реЙрдбрд╢ рдпрд╛ рдПрдореНрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХрд╛ рд╣реИ:

 // lodash import _ from 'lodash' _.get(data, 'user.id') // ember import { get } from '@ember/object' get(data, 'user.id') 

рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

 const userId = data?.user?.id //     const label = data?.labels?.[0] const someFuncRes = someFunc?.() 

рдЕрд╢рдХреНрдд (рдЕрд╢рдХреНрдд coalescing) рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди


рдЬрдм рд╣рдо рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рд╢реВрдиреНрдп рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рддреЛ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ, рдСрдкрд░реЗрдЯрд░ || (рддрд╛рд░реНрдХрд┐рдХ рдпрд╛)ред

рдпрджрд┐ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓реЙрдЧрд┐рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕реЗрдбрд┐рдпрди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:

 //      data && data.user && data.user.login || 'sedighian' //     data?.user?.login || 'sedighian' //        null data?.user?.login ?? 'sedighian' 

рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рди рд╣реИрдВред рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХрд╛ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИ? рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗрд╡рд▓ рджрд╛рдИрдВ рдУрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдИрдВ рдУрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдЕрд╢рдХреНрдд рд╣реИред рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рд╡реИрдз), рд▓реЗрдХрд┐рди рдЧрд▓рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо '' (рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ), рдЧрд▓рдд рдпрд╛ 0. рдХреЗ рд╕рд╛рде рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕рд╣реА рдкрдХреНрд╖ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ:

 //  data.user.alias   ,     data?.user?.alias ?? 'code ninja' // '' data?.user?.alias || 'code ninja' // code ninja //  data.user.volumePreference = 0 data?.user?.volumePreference ?? 7 // 0 data?.user?.volumePreference || 7 // 7 //  data.user.likesCats = false data?.user?.likesCats ?? true // false data?.user?.likesCats || true // true 

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдореНрдмрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛:

 // lodash import _ from 'lodash' _.get(data, 'user.likesCats', true) // ember import { getWithDefault } from '@ember/object' getWithDefault(data, 'user.likesCats', true) 

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдПрдХ рдЪрд░ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЛрдб рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ:

 const temp = { celsius: 0 } temp?.fahrenheit ?? setFahrenheit(temp) 

рдХреНрдпрд╛ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?


рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдХреНрд░рдо рдпрд╛рдж рд░рдЦреЗрдВ (рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди, рдлрд┐рд░ рдПрдХ рдЕрд╡рдзрд┐):

 data.?user // Uncaught SyntaxError: Unexpected token '?' data?.user // ok 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдХ рдЧреИрд░-рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ:

 data?.user() // Ungaught TypeError: user is not a function 

рдЕрд╢рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рджрд░реНрдЬрдирд╛.рдЧреЗрдЯ рдпрд╛ EmberObject.getWithDefault рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ c null рдХрд╛ рд╕рдВрдпреЛрдЬрди "null" рдорд╛рди рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ:

 const data = { user: { interests: null } } // lodash import _ from 'lodash' _.get(data, 'user.interests', 'knitting') // null // ember import { get } from '@ember/object' getWithDefault(data, 'user.interests', 'knitting') // null //   null data?.user?.interests ?? 'knitting' // knitting 

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдСрд▓ рдж рдмреЗрд╕реНрдЯред

Source: https://habr.com/ru/post/hi485748/


All Articles