κ°μ
λ―Έμ | κΈ°κ° | Repository | PR & Review | github page |
---|---|---|---|---|
μ μ¬ λ λ¨Ήμ§ 2λ¨κ³ | 23-03-04 - 23-03-13 |
Repo | PR Review | π μ μ¬ λ λ¨Ήμ§ |
π λ―Έμ νκ³
μ΄λ² λ―Έμ μ λͺ©νμλ
- UIλ₯Ό μ»΄ν¬λνΈ λ¨μλ‘ μκ°νκ³ κ°λ°νλ μ°μ΅
- μ¬μ¬μ©ν μ μλ μ»΄ν¬λνΈλ₯Ό κ³ λ―Όν΄ λ³΄κΈ°
- μ¬μ©μ κ΄μ μμ μ€μνλ€κ³ μκ°νλ κΈ°λ₯μ μ€μ€λ‘ μ μνκ³ E2E ν μ€νΈλ‘ κ²μ¦ν΄ 보기 (2λ¨κ³)
3κ°μ§μ λλ¬ν μ μλλ‘ λ§μ κ³ λ―Όμ νμλ€. νΉν 리μ‘νΈκ° μλ λ°λλΌμλ°μ€ν¬λ¦½νΈμμ μ»΄ν¬λνΈμ λν΄ ν λ²λ μκ°μ ν μ μ΄ μκΈ° λλ¬Έμ μ²μμλ μ΄λ€ μμΌλ‘ μ κ·Όμ ν΄μΌ ν μ§ κ°μ΄ μ‘νμ§ μμλ€. μ»΄ν¬λνΈμ μν μ΄ λ¬΄μμΈμ§λ₯Ό μ€μ€λ‘ μκ°νκ³ μ μ λ΄λ¦¬λ κ²μ΄ μ΄λ² λ―Έμ μ ν΅μ¬ ν¬μΈνΈμμ§ μλ μΆλ€.
E2Eλ μ²μ μ¬μ©ν΄ λ΄€λλ°, μ€μ λ‘ μ±μ΄ μ€νλλ κ²μ 보λ μ½μλ‘ ν μ€νΈνλ κ²λ³΄λ€ ν¨μ¬ ν₯λ―Έλ‘κ³ μ¬λ―Έμμλ€.
κ·Έλ¦¬κ³ μ΄λ² λ―Έμ
μ ν΅ν΄ νμ
μ€ν¬λ¦½νΈμ 무μμμ λν΄ κΉ¨λ«κ² λμλ€. μ§κΈκΉμ§ λ΄κ° λ°°μ λ νμ
μ€ν¬λ¦½νΈλ κ·Έλ₯ μ μΉμ μμ€μ΄μꡬλ..
λΌλ κΉ¨λ¬μμ μ»μλ€. λκΈ°λΆμ¬κ° λμ΄μ νμ
μ€ν¬λ¦½νΈ μ€ν°λμ μ°Έμ¬νκ² λμμΌλ μ΄μ¬ν λ°°μ보μ.
νμ μ€ν¬λ¦½νΈ μ€ν°λ λ ν¬
1λ¨κ³ λ―Έμ μμλ μΉ μ»΄ν¬λνΈμ ν¨κ» μλμ° λλ ν¨κ» μ¬μ©νλ€. μ΄κ²μ μ΄μ μ λλ€κ° νμ΅ λͺ©νμ λλ¬νμ§ λͺ»ν κ² κ°μ λλμ΄ λ€μ΄ 2λ¨κ³ λ―Έμ μ΄ μμν λ, κΉλν μλμ° λμ λͺ¨λ κ±·μ΄λλ€. λλ¬Έμ μ»΄ν¬λνΈμ λν΄ λ λ§μ μκ°μ ν μ μλ μκ°μ΄ μμ§ μμλ μΆλ€.
ποΈ λ΄κ° μκ°νλ μ»΄ν¬λνΈλ?
μ μ¬ λ λ¨Ήμ§
λ―Έμ
μμ κ°μ₯ λ§μ κ³ λ―Όμ ν λΆλΆμ΄ μ»΄ν¬λνΈλ 무μμΈκ°?
λΌκ³ νμ ν μ μλ€. μ΄λ° λ³Έμ§μ μΈ κΆκΈμ¦μ 리μ‘νΈλ₯Ό μ¬μ©ν λμλ νμ§ μμλ€. κ·Έλ κΈ° λλ¬Έμ λ λ§μ κ³ λ―Όκ³Ό μκ°μ΄ μμλ κ² κ°λ€.
λ―Έμ μλ λ€μν μ»΄ν¬λνΈλ€μ΄ μ‘΄μ¬νλ€. λ¬Όλ‘ μ΄κ²λ μ΄λκΉμ§ λλλμ λ°λΌ λ€λ₯΄μ§λ§, λλΆλΆμ ν¬λ£¨λ€μ΄ λͺ¨λ λΉμ·νκ² λλμμ κ²μ΄λ€.
λͺ¨λ¬ μ»΄ν¬λνΈ
λλ μ»΄ν¬λνΈλ€μ΄ μ΄λ€ μν μ νλμ§ μκ°μ νμκ³ μ»΄ν¬λνΈμ ν΄λΉ μν μ μνν μ μλλ‘ μ± μμ λΆμ¬νλ€. μλ₯Ό λ€μ΄ λͺ¨λ¬μ°½μΈ κ²½μ° μλμ κ°μ κΈ°λ³Έ μν μ κ°μ§κ³ μλ€.
- λ°°κ²½μ΄ μ΄λμμ§λ€.
- λͺ¨λ¬μ°½μ΄ λ±μ₯νλ€.
- λ°°κ²½μ ν΄λ¦νλ©΄ λͺ¨λ¬μ°½μ΄ μ¬λΌμ§λ€.
- actionμ΄ closeModalμΈ λ²νΌμ ν΄λ¦νλ©΄ λͺ¨λ¬μ°½μ΄ μ¬λΌμ§λ€.
μ΄κ²μ΄ λͺ¨λ¬μ°½μ΄ κ°μ§κ³ μλ κΈ°λ³Έ μν (κΈ°λ₯)μ΄λ€. μ΄λ€ λͺ¨λ¬μ΄λΌλ μμ κ°μ κΈ°λ₯μ κ°μ ΈμΌ νλ€. μμ μν μ€ 1,2λ²μ UIμ κ΄ν κ²μ΄κ³ 3,4λ²μ λͺ¨λ¬μ°½μ΄ κ°μ ΈμΌ ν κΈ°λ₯μ΄λ€.
μ΄λ° λͺ¨λ¬μ°½μ κ°μ§κ³ μλ μ»΄ν¬λνΈλ€μ μμ κΈ°λ₯μ κΈ°λ³Έμ μΌλ‘ ν¬ν¨νκ³ μλ€. μ’ λ μμΈν λͺ¨λ¬ μ»΄ν¬λνΈλ₯Ό μ΄ν΄λ³΄μ. μ°Έκ³ λ‘ μ΄λ² λ―Έμ μ μΉ μ»΄ν¬λνΈλ‘ μ§ννμλ€.
import errorHandler from '../../utils/errorHandler';
import CustomElement from '../CustomElement';
class Modal extends CustomElement {
renderTemplate(): string {
return `
<div class="modal">
<div class="modal-backdrop"></div>
<div class="modal-container">
${this.innerHTML}
</div>
</div>
`;
}
render = () => {
super.render();
this.initEventHandlers();
};
close = () => {
if (!this.parentElement) return errorHandler.doesNotExistElement();
this.parentElement.remove();
};
initEventHandlers = () => {
const $modalBackdrop =
this.querySelector < HTMLDivElement > '.modal-backdrop';
const $closeModalButton =
this.querySelector < HTMLButtonElement > 'button[action="closeModal"]';
if (!$modalBackdrop) return errorHandler.doesNotExistElement();
if (!$closeModalButton) return errorHandler.doesNotExistElement();
$modalBackdrop.addEventListener('click', this.close);
$closeModalButton.addEventListener('click', this.close);
};
}
customElements.define('r-modal', Modal);
export default Modal;
ν΅μ¬μ΄ λλ κΈ°λ₯λ§ λΉ λ₯΄κ² μ΄ν΄λ³΄μ. μμ μ½λμμ close
λ©μλλ λͺ¨λ¬μ°½μ λ«λ κΈ°λ₯μ κ°μ§λ€. λ§μ½ μ΄λ° λͺ¨λ¬μ κΈ°λ₯μ μ¬μ©νκ³ μΆμΌλ©΄ <r-modal>{μνλ λ€λ₯Έ λ΄μ©}</r-modal>
μ κ°μ΄ μμ±νλ©΄ λλ€. λ―Έμ
μμλ μμμ μμ± λͺ¨λ¬κ³Ό μμμ μμΈ νμ΄μ§ λͺ¨λ¬μ΄ μλ€.
μ¦κ²¨ μ°ΎκΈ° μμ΄μ½ μ»΄ν¬λνΈ
νλμ μ»΄ν¬λνΈλ§ λ μμ보μ. μ΄λ²μ FavoriteIcon
μ»΄ν¬λνΈμ΄λ€. ν΄λΉ μ»΄ν¬λνΈμ κΈ°λ³Έ μν μ μλμ κ°λ€.
- λ³ μμ΄μ½μ κ°μ§κ³ μλ€.
- ν΄λ¦ν μ μλ€.
- ν΄λ¦νλ©΄ μ¦κ²¨μ°ΎκΈ° μμ΄μ½μ΄ ν κΈμ΄ λμ΄ λμμΈμ΄ λ°λλ€.
μμ μν μ μννκΈ° μν΄ FavoriteIcon
μ»΄ν¬λνΈκ° μ΄λ€ μ±
μμ κ°μ§κ³ μλμ§λ μλμ μ½λμμ νμΈν μ μλ€.
import errorHandler from '../../utils/errorHandler';
import CustomElement from '../CustomElement';
class FavoriteIcon extends CustomElement {
static get observedAttributes() {
return ['favorite'];
}
private get isFavorite() {
return this.hasAttribute('favorite');
}
private get restaurantName() {
return this.getAttribute('restaurantName');
}
renderTemplate = () => {
return `
<div
id="favorite-icon"
name="${this.restaurantName}"
class="favorite-restaurant-icon ${
this.isFavorite ? 'favorite-icon' : 'not-favorite-icon'
}">${this.isFavorite ? 'β
' : 'β'}</div>
`;
};
render = () => {
super.render();
this.initEventHandlers();
};
clickFavoriteIcon = () => {
if (this.isFavorite) {
this.removeAttribute('favorite');
} else {
this.setAttribute('favorite', '');
}
this.dispatchEvent(
new CustomEvent('toggleFavorite', {
bubbles: true,
detail: {
restaurantName: this.restaurantName,
},
}),
);
};
initEventHandlers = () => {
const $favoriteIcon = this.querySelector('.favorite-restaurant-icon');
if (!$favoriteIcon) return errorHandler.doesNotExistElement();
$favoriteIcon.addEventListener('click', this.clickFavoriteIcon);
};
}
customElements.define('r-favorite-icon', FavoriteIcon);
export default FavoriteIcon;
μ΄λ²μλ μ½λκ° κΈΈλ€. λΉ λ₯΄κ² ν΅μ¬λ§ μ§κ³ λμ΄κ°μ. μ μ½λμμ clickFavoriteIcon
λ©μλλ₯Ό 보μ. ν΄λΉ λ©μλμμ λ κ°μ§μ μΌμ νλ€.
첫 λ²μ§Έλ‘λ μκΈ° μμ μ favorite
μ΄νΈλ¦¬λ·°νΈλ₯Ό μμ±νκ³ μ κ±°νλ€. μ΄λ μ¦κ²¨μ°ΎκΈ° μμ΄μ½μ UI λ³κ²½κ³Ό κ΄λ ¨λμ΄ μλ€.
λ λ²μ§Έλ CustomEvent
λ₯Ό μ¬μ©νμ¬ λ£¨νΈμ μ΄λ²€νΈλ₯Ό 보λΈλ€. μ¦, μ¬κΈ°μλ λ¨μ§ ν΄λ¦μ νλ€λ μ΄λ²€νΈλ§ λ³΄λΌ λΏ μμμ μ μ 보λ₯Ό μ§μ λ°κΎΈμ§ μλλ€. μμμ μ μ 보λ₯Ό λ°κΎΈλ κ²μ ν΄λΉ μ»΄ν¬λνΈκ° μλλΌ λ μλ¨μΌλ‘ μ¬λΌκ°μΌ νλ€κ³ μκ°νκΈ° λλ¬Έμ΄λ€. μ§μ λλ©μΈμ λ°μ΄ν°λ₯Ό λ°κΎΈλ κ²μ ν κ³³μμ μ΄λ£¨μ΄μ§κΈΈ λ°λλ€.
κ²°λ‘
μ»΄ν¬λνΈμ κΈ°λ³Έ μν μ μκ°νμκ³ μ΄λ₯Ό μ»΄ν¬λνΈμμ ꡬννμλ€. λ€λ₯Έ μ»΄ν¬λνΈλ€μ λ¨μν μ΄λ₯Ό κ°μ Έλ€ μμΌλ‘μ¨ μΆκ° ꡬν μμ΄ κ°μ κΈ°λ₯μ μ¬μ©ν μ μμ λΏμ΄λ€.
π§βοΈ CustomEvent
μ΄λ² λ―Έμ
μμ κ°μ₯ μ μ©νκ² μ¬μ©ν κΈ°λ₯μ λ°λ‘ CustomEvent
λΌκ³ ν μ μλ€. μ»΄ν¬λνΈμμ CustomEvent
λ₯Ό λ°μμμΌ μλ¨μΌλ‘ λ³΄λ΄ λλ©μΈ μμ
κ³Ό νλ©΄ λ λλ§ μμ
μ λ€λ₯Έ κ³³μμ κ΄λ¦¬ν μ μλλ‘ νμλ€.
μ²μ μ¬μ©νλ κΈ°μ μ΄λΌ μ΄λ €μμ΄ μμ κ²μ΄λΌ μκ°νμλλ°, λ§μ μ¬μ©ν΄ 보λ μ΄λ ΅μ§ μμμ λ§μ΄ μ¬μ©νλ€. κΈ°λ³Έ μ¬μ©μ μλμ κ°λ€. μΌλ¨ μλμ this
λ HTMLElement
μ΄μ¬μΌ νλ€.
this.dispatchEvent(
new CustomEvent(μ΄λ²€νΈ μ΄λ¦, {
bubbles: true, -> λ²λΈλ§ μ¬λΆ
detail: {
μ΄λ²€νΈλ₯Ό ν΅ν΄ μ λ¬ν λ°μ΄ν°
},
})
);
μ΄λ²€νΈμ μ΄λ¦, μ΄λ²€νΈλ₯Ό ν΅ν΄ μ λ¬ν λ°μ΄ν°λ₯Ό μ€μ€λ‘ λ§λ€ μ μλ€. μ΄κ²μ΄ 맀λ ₯μ μΌλ‘ λ€κ°μλ€. μ§κΈκΉμ§ μ¬μ©ν μ΄λ²€νΈλ₯Ό 보면 click
, submit
κ³Ό κ°μ΄ λ²μ©μ μΈ λ¨μ΄μμ§λ§ CustomEvent
μμ λ΄ μ
λ§λλ‘ λ°κΏ μ μμλ€. λλ¬Έμ λ μ΄λ²€νΈκ° μ΄λ€ λμμ ν μ§λ₯Ό λ λͺ
ννκ² μλ €μ£ΌκΈ° μν΄ μ΄λ²€νΈμ μ΄λ¦μ μμΈνκ² μ μλ€. μλμ μ½λλ₯Ό μ°Έκ³ !
window.addEventListener('load', this.initLoad);
document.addEventListener(
'openRegisterRestauranModal',
render.openRegisterRestaurantModal
);
document.addEventListener('changeFilter', this.changeRestaurantFilter);
document.addEventListener('changeSort', this.changeRestaurantSort);
document.addEventListener('createRestaurant', this.addRestaurant);
document.addEventListener(
'openRestaurantDetailModal',
this.openRestaurantDetailModal
);
document.addEventListener('deleteRestaurant', this.deleteRestaurant);
document.addEventListener('toggleFavorite', this.toggleRestaurantFavorite);
document.addEventListener('changeRestaurantType', this.changeRestaurantType);
μ΄λ²€νΈμ μ΄λ¦λ§ λ³΄κ³ λ μΆ©λΆν μ΄λ€ μ΄λ²€νΈκ° λ°μν κ²μΈμ§λ₯Ό μμν μ μμ§ μλκ°? μ΄λ° μ μ΄ μ’μλ€. μμμ μ μΆκ°, μμ , μ¦κ²¨μ°ΎκΈ°μ μΆκ°, μμ λ±κ³Ό κ°μ λλ©μΈ λ‘μ§μ νμν μ 보, νλ©΄ λ λλ§μ νμν μ 보λ μ λ¬ν μ μμ΄ ν΄λΉ μ± μμ λ€λ₯Έ κ°μ²΄μ λΆμ¬ν μ μμλ€.
π¨ render ν¨μμ λΆλ¦¬
2λ¨κ³μμλ render
μ κ΄λ ¨ν ν¨μλ₯Ό λΆλ¦¬νμ¬ htmlμ΄ λλλ§ νλ κ³Όμ μ κ΄λ¦¬νμλ€. κΈ°μ‘΄μλ app.tsμμ λλ©μΈ κ΄λ¦¬, μ΄λ²€νΈ μ²λ¦¬, λλλ§μ λͺ¨λ νμκΈ° λλ¬Έμ 볡μ‘ν¨μ΄ μμλλ° render
ν΄λλ₯Ό λ§λ¦μΌλ‘μ¨ μν μ λλμ΄ μ£Όμλ€.
μ΄μ κ°μ΄ ꡬ쑰λ₯Ό λ°κΎΌ μ΄μ λ μλμ κ°λ€.
- μ¬λ¬ λ² λ°λ³΅λκ³ μ¬λ¬ κ³³μμ μ¬μ©λλ λ λλ§μ΄ μμ μ μλ€.
- μλ₯Ό λ€λ©΄, μ΄λ²€νΈμ λν μ±κ³΅ μ€ν¨ μ¬λΆλ₯Ό 보μ¬μ£Όλ κ²μ ν κ³³μ΄ μλλΌ μ¬λ¬ κ³³μμ μ¬μ©λ μ μλ€.
- μ΄λ° κ²½μ° κ°μ μ½λλ₯Ό ν¨μλ‘ λ§λ€μ΄ λΆλ¦¬ν΄ λλ©΄ νΈνλ€κ³ μκ°νμλ€.
- app.tsλ νλ©΄μμ λ°μμν€λ μ΄λ²€νΈμ λ°λΌ λ°μ΄ν°λ§ κ΄λ¦¬νλ€.
- λ°λ λ°μ΄ν°μ λ°λ₯Έ νλ©΄ λ λλ§μ λ€λ₯Έ κ³³μμ νλ κ²μ΄ μ ν©ν μν λΆλ¦¬λΌκ³ μκ°νλ€.
2,3λ² μ΄μ λ₯Ό μλμ μ½λλ₯Ό ν΅ν΄ λ μ΄ν΄λ³΄μ.
// app.ts
toggleRestaurantFavorite = ({ detail }: CustomEvent) => {
const { restaurantName } = detail;
this.#restaurants.forEach((restaurant) => {
if (restaurant.getName() === restaurantName) restaurant.toggleFavorite();
});
const targetRestaurant = this.#restaurants.filter(
(restaurant) => restaurant.getName() === restaurantName
)[0];
render.toggleRestaurantFavorite(this.#restaurantListType, targetRestaurant);
saveRestaurants(this.#restaurants);
};
μ ν¨μλ toggleFavorite μ΄λ²€νΈκ° λ°μνμ λ μ€νλλ ν¨μμ΄λ€.. toggleFavorite μ΄λ²€νΈλ₯Ό ν΅ν΄ μμμ μ μ΄λ¦μ μμλ΄κ³ ν΄λΉ μμμ μ μ¦κ²¨ μ°ΎκΈ° μ¬λΆλ§ λ°κΎΈλ μν μ νκ³ μκ³ λ°λ κ²°κ³Όμ λ°λ₯Έ νλ©΄ λ λλ§κ³Ό λ‘컬μ€ν 리μ§μ λ°λ μμμ λͺ©λ‘μ μ μ₯νλ κ²μ λͺ¨λ λ€λ₯Έ ν¨μμμ μ§ννλ€.
μ΄λ κ² renderμ ν΅ν΄μλ§ νλ©΄μ΄ λλλ§μ΄ λλλ‘ νμλ€.
βοΈ μ΅μ λ 체μ΄λ
μλμ κ°μ΄ DOM κ°μ²΄μ μ κ·Όνλ € νλ€.
const $targetRestaurant = document.querySelector<CustomRestaurantItem>(
`r-restaurant[name="${restaurant.getName()}"]`,
);
μ $targetRestaurant
λ CustomRestaurantItem λλ null κ°μ κ°μ§λ€. nullμ΄ λ μλ μμΌλ―λ‘ λ°λ‘ μ΄λ²€νΈλ₯Ό λ¬ μ μλ μν©μ΄ μκΈ΄λ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν ν΄κ²°λ² μ€ νλκ° λ°λ‘ μ΅μ
λ 체μ΄λμ΄λ€. νμ§λ§ μ΄κ²μ΄ κ³Όμ μ¬λ°λ₯Έ κ²μΌκΉ?λΌλ μκ°μ λ€μλ€.
μ΄λ ν μ΄μ λ‘ μΈν νλ©΄ λ λλ§μ λ¬Έμ λ‘ DOM μμ²΄κ° μμ μ μκ³ μ½λ μμ μ€λ₯λ‘ μ κ·Όμ λͺ»ν μλ μλ€. λλ¬Έμ μ΅μ λ 체μ΄λμΌλ‘ μλ€λ κ²μ κ°μ νμ¬ μ΄λ²€νΈλ₯Ό λ€λ κ²μ΄ μλλΌ κ·Έμ μ μμ λλ₯Ό λλΉνμ¬ μ€λ₯λ₯Ό λ°μμν€κΈ°λ‘ νμλ€. μλμ²λΌ λ§μ΄λ€.
if (!$targetRestaurant) return errorHandler.doesNotExistElement();
μ€μ λ‘ μ΄μ κ°μ νμ κ°λλ‘ μΈν΄ νλμ μ€λ₯λ₯Ό λ°κ²¬ν μ μμ΄κ³ ν΄κ²°νμλ€.
μ¬λ΄μΌλ‘ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄μ νμ μ κ°μ νλ κ²(νμ λ¨μΈ)λ³΄λ€ νμ μ μΈμ ν΅ν΄ νμ μ μ νμ¬ μ¬μ©νμ.
π₯ μ μ ν λ©μλ μ¬μ©
μλμ μ½λλ₯Ό 보μ.
const targetRestaurant = this.#restaurants.filter(
(restaurant) => restaurant.getName() === restaurantName
)[0];
μ μ½λλ νΉμ μ΄λ¦μ κ°μ§λ μμμ μ μ°Ύλ μ½λμ΄λ€. Array.filter()
λ©μλλ₯Ό μ¬μ©νκ³ μκ³ λ°°μ΄μ κ°μ μ κ·ΌνκΈ° μν΄ [0]
λ₯Ό μΆκ°νμλ€. κ³Όμ° Array.filter()
λ©μλκ° λ¨μΌ μμλ₯Ό μ°Ύλλ° μλ§μ λ©μλμΌκΉ?
λ¬Όλ‘ μ°Ύμ μ μλ€. νμ§λ§ μ΄λ³΄λ€ λ μ μ ν λ©μλκ° μλ€. λ°λ‘ Array.find()
μ΄λ€. μμ μ½λλ₯Ό μλμ κ°μ΄ 리ν©ν°λ§μ μλνλ€.
const targetRestaurant = this.#restaurants.find(
(restaurant) => restaurant.getName() === restaurantName
);
μ§κΈκΉμ§ λ¨μΌ μμκΉμ§λ Array.filter()
λ©μλλ₯Ό μ¬μ©ν μ΄μ λ₯Ό μκ°ν΄ 보면 λ³λ€λ₯Έ μ΄μ μμ΄ λ¬΄μ§μ±μΌλ‘ μ¬μ©νλ κ² κ°λ€. μ λ§ μ§κΈκΉμ§ μλ¬΄λ° μκ° μμ΄ Array.filter()
λ©μλλ§ μ¬μ©νμκ³ ν΄λΉ λ©μλλ₯Ό ν΅ν΄μλ κ°μ μ μ°ΎμμκΈ° λλ¬Έμ΄λ€. μ΄λ¬ν μ΅κ΄ λλ¬Έμ λ λ€μν κ·Έλ¦¬κ³ μν©μ μλ§μ λ©μλμ λν΄ κ³ λ―Όν μ μλ κΈ°νκ° μμλ€. νμ μλ¬Έμ κ°μ§λ©° λ©μλλ₯Ό μ¬μ©νλ μ΅κ΄μ λ€μ¬λ³΄μ. 무μμ΄ λ μ’μ λ©μλμΈμ§! κ³ λ―Ό!
πFalsy ν κ° νμ©νκΈ°
μλ°μ€ν¬λ¦½νΈμμ false
λ§ false
μΈ κ²μ΄ μλλ€. μ΄ λ§μ΄ 무μμ΄λ? μ«μ 0, λΉλ¬Έμμ΄ λν λΆλ¦¬μΈμΌλ‘ false
λ‘ λ°λ μ μλ€λ κ²μ΄λ€.
μμ§ λλμ΄ ν μλΏμ§ μμμ μ§κΈκΉμ§ ===
λ₯Ό μ¬μ©νμ¬ μ§μ λΉκ΅νλ©° 쑰건문μ μ¬μ©νμλ€. νμ§λ§ μμΌλ‘ λ μ΅μν΄μ§λλ‘ λ
Έλ ₯ν΄ λ΄μΌκ² λ€.
μλ₯Ό λ€μ΄ λ°°μ΄μ κΈΈμ΄κ° 0μΌ λ, μλ¬λ₯Ό λ°μμν€κ³ μΆλ€. κ·Έλ λ€λ©΄ νμμλ μλμ κ°μ΄ μ½λλ₯Ό μμ±νμ κ²μ΄λ€.
if (array.length === 0) throw new Error();
μ¬κΈ°μμ 0μ΄ false
λΌλ κ²μ μ΄μ©νλ©΄ μλμ²λΌ 리ν©ν°λ§μ ν μ μλ€.
if (!array.length) throw new Error();
μΆκ°μ μΌλ‘ μλλ MDNμμ μ€λͺ νλ Javascript falsy valuesμ΄λ€.
Value | Type | Description |
---|---|---|
null | Null | The keyword null - the abscence of any value. |
undefined | Undefined | undefined — the primitive value. |
false | Boolean | The keyword false. |
NaN | Number | NaN — not a number. |
0 | Number | The Number zero, also including 0.0, 0x0, etc. |
-0 | Number | The Number negative zero, also including -0.0, -0x0, etc. |
0n | BigInt | The BigInt zero, also including 0x0n, etc. Note that there is no BigInt negative zero — the negation of 0n is 0n. |
"" | String | Empty string value, also including '' and ``. |
document.all | Object | The only falsy object in JavaScript is the built-in document.all. |
π μν μ
- μΉ μ»΄ν¬λνΈμ λν μ’μ κ²½νμ νμλ€.
- νμ μ€ν¬λ¦½νΈ νμ΅μ λκΈ°λΆμ¬κ° λμλ€.
- μ»΄ν¬λνΈκ° 무μμΈμ§μ λν΄ λλ¦ λ§μ μκ°μ νλ€.
- λ©μμ§λ₯Ό 컀μ€ν¬νμ¬ μ¬μ©νμλ€. μ΄ λν μ»΄ν¬λνΈλ‘ λ§λ€μλ€.
π μμ¬μ΄ μ
- μλμ° λμ λν μ§μμ΄ λΆμ‘±νμ¬ μ΄λ₯Ό μ κ±°νμλ€.
- E2Eλ₯Ό μ λλ‘ λͺ¨λ₯΄λ μνμμ μ¬μ©ν΄μ μ°μ°νλ€.
π μμΌλ‘μ κ°μ€
- νμ΅ λͺ©νμ λλ¬νκΈ° μν΄ λ Έλ ₯νκΈ°
- μΆκ°μ μΈ νμ΅λ μ€μνμ§λ§ μΌλ¨μ νμ΅ λͺ©νμ΄λ€!
'π μ°μνν ν¬μ½μ€ > Level1' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λ 벨1 μν 리뷰 - step2 (0) | 2023.04.14 |
---|---|
λ 벨1 μν 리뷰 - step1 (2) | 2023.04.14 |
λ 벨1 μ μ¬ λ λ¨Ήμ§ - step1 (0) | 2023.04.14 |
λ 벨1 νμ΄μ λ‘λ - step2 (0) | 2023.04.13 |
λ 벨1 νμ΄μ λ‘λ - step1 (0) | 2023.04.13 |