일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- asgi
- leetcode
- 쿠버네티스
- FastAPI
- dockerfile
- Service
- ansible
- AWS
- asyncio
- Django
- ebs
- YAML
- POD
- docker
- intervals
- IAC
- EC2
- Python
- IAM
- 자바스크립트
- event loop
- terraform
- Deployment
- kernel
- EKS
- github
- Kubernetes
- K8S
- WSGI
- elasticsearch
- Today
- Total
궁금한게 많은 개발자 노트
자바스크립트 Polyfill / Transpile / optional chaining 본문
Polyfill이란? JS standard library에 표준으로 등록되어 있으나, 아직 브라우저나 node.js에서 구현되지 않은 기능을 미리 써 볼 수 있도록 만들어진 구현체를 뜻함 (모던 자바스크립트의 기능을 사용하기 위해 낮은 버전에서 주로 사용)
[ modern java script의 기능]
promise all이 가지고 있는 결함 : reject가 하나라도 있다면 then이 실행되지 않음
allsettled에서는 reject가 있더라도 then이 실행됨(모두 sellted가 되면 넘어감)
Transplie이란? 코드를 A언어에서 B언어로 변환하는 작업을 뜻함 -> 자바스크립트의 경우 보통 구현 런타임(브라우저, 혹은 구버전 node등)에서 신규 문법적 요소(optional chaining등)를 활용하기 위해 사용
즉, 신규 언어 스펙(ES6+)에서 구형 언어 스펙(ES5 등)으로 트랜스파일을 할 때 주로 사용
자바스크립트를 대상으로 하는 트랜스파일러는 Barbel, tsc(Typescript compiler), ESBuild등이 있습니다.
optional chaining
optional chaining 연산자 (?.) 는 체인의 각 참조가 유효한지 명시적으로 검증하지 않고, 연결된 객체 체인 내에 깊숙이 위치한 속성 값을 읽을 수 있다.
?. 연산자는 . 체이닝 연산자와 유사하게 작동하지만, 만약 참조가 nullish (en-US) (null 또는 undefined)이라면, 에러가 발생하는 것 대신에 표현식의 리턴 값은 undefined로 단락된다. 함수 호출에서 사용될 때, 만약 주어진 함수가 존재하지 않는다면, undefined를 리턴한다.
따라서 참조가 누락될 가능성이 있는 경우 연결된 속성으로 접근할 때 더 짧고 간단한 표현식이 생성된다. 어떤 속성이 필요한지에 대한 보증이 확실하지 않는 경우 객체의 내용을 탐색하는 동안 도움이 될 수 있다.
optional chaining은 선언되지 않은 루트 객체에 사용할 수 없지만, 정의되지 않은 루트 객체와는 함께 사용할 수 있다.
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
optional chaining 연산자는 참조나 기능이 undefined 또는 null일 수 있을 때 연결된 객체의 값에 접근하는 단순화할 수 있는 방법을 제공한다.
예를 들어, 중첩된 구조를 가진 객체에서 obj가 있다. optional chaining이 없이 깊이 중첩된 하위 속성을 찾으려면, 다음과 같이 참조를 확인해야 한다:
let nestedProp = obj.first && obj.first.second;
obj.first의 값은 obj.first.second의 값에 접근하기 전에 null (그리고 undefined)가 아니라는 점을 검증한다. 이는 만약에 obj.first를 테스트 없이 obj.first.second 에 직접 접근할 때 일어날 수 있는 에러를 방지한다.
그러나 optional chaining 연산자(?.)를 사용하여, obj.first.second 에 접근하기 전에 obj.first의 상태에 따라 명시적으로 테스트하거나 단락시키지 않아도 된다:
let nestedProp = obj.first?.second;
. 대신에 ?. 연산자를 사용함으로써, 자바스크립트는 obj.first.second에 접근하기 전에 obj.first가 null 또는 undefined가 아니라는 것을 암묵적으로 확인하는 것을 알고 있다. 만약 obj.first가 null 또는 undefined이라면, 그 표현식은 자동으로 단락되어 undefined가 반환된다.
이는 임시 변수가 실제로 생성되지 않는다는 점을 제외하고 다음과 동일하다.
let temp = obj.first;
let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
함수의 호출과 Optional chaining
존재하지 않을 수 있는 매서드를 호출할 때, optional chaining을 사용할 수 있다. 예를 들어, 구현 기간이나 사용자 장치에서 사용할 수 없는 기능 때문에 메서드를 사용할 수 없는 API를 사용할 경우, 유용할 수 있다.
함수 호출과 optional chaining을 사용함으로써 메서드를 찾을 수 없는 경우에 예외를 발생시키는 것 대신에 그 표현식은 자동으로 undefined를 반환한다:
let result = someInterface.customMethod?.();
메모: 만약 속성에 해당 이름이 있지만 함수가 아니라면, ?.의 사용은 여전히 예외를 발생시킨다. TypeError exception (x.y is not a function).
메모: 만약 someInterface 자체가 null이나 undefined이면, TypeError 예외가 여전히 발생 할 것이다. someInterface 자체가 null이나 undefined으로 예상된다면, ?.을 사용해야한다: someInterface?.customMethod?.()
optional callbacks과 event handlers 다루기
만약 객체에서 destructuring assignment로 callbacks 또는 fetch 메서드를 사용한다면, 그 존재 여부를 테스트하지 않으면 함수로 호출할 수 없는 존재 하지 않는 값을 가질 수 있다. ?.을 사용하면, 다음 추가 테스트를 피할 수 있다:
// Written as of ES2019
function doSomething(onContent, onError) {
try {
// ... do something with the data
}
catch (err) {
if (onError) { // Testing if onError really exists
onError(err.message);
}
}
}
// Using optional chaining with function calls
function doSomething(onContent, onError) {
try {
// ... do something with the data
}
catch (err) {
onError?.(err.message); // no exception if onError is undefined
}
}
'Language' 카테고리의 다른 글
Node.js require과 module, resolution (0) | 2022.04.07 |
---|---|
자바스크립트 정규표현식 (0) | 2022.04.04 |
자바스크립트 Promise (0) | 2022.04.04 |
자바스크립트 destructuring (0) | 2022.04.03 |
자바스크립트 function approach (0) | 2022.04.03 |