[TIL] 220121

Lee Syong·2022년 1ė›” 21ėž
0

TIL

ëŠĐ록 ëģīęļ°
156/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. react state

  2. unit converter

  3. array.filter(Boolean)


📚 ë°°ėšī ęēƒ

1. STATE

state란 데ėī터가 ė €ėžĨ되는 ęģģė„ 말한ë‹Ī.

바닐띾 JS ė―”ë“œė—ė„œëŠ” counterëĨž ėĶę°€ė‹œí‚Īęģ  ėīëĨž UIė— 디ėŠĪ플레ėī 하ęģ  ėžˆë‹Ī.
ėī때 바뀌는 데ėī터가 할ë‹đ되는 counter ëģ€ėˆ˜ëĨž state로 만ë“Ī ėˆ˜ ėžˆë‹Ī.

1) counter ëģ€ėˆ˜ ė—…데ėīíŠļ 후 render í•Ļėˆ˜ í˜ļėķœ

ëĻžė €, stateëĨž ė‚ŽėšĐ하ė§€ ė•ŠëŠ” ë°Đëē•ė„ ė‚īíŽīëģīėžëĐī ë‹ĪėŒęģž 같ë‹Ī.

  • counter ëģ€ėˆ˜ëĨž App í•Ļėˆ˜ 밖(React JS ė–ī플 밖)ė— ė„ ė–ļ한ë‹Ī.
  • counter ëģ€ėˆ˜ëĨž JSXė— ė „닎하ęļ° ėœ„í•īė„œëŠ” {} ė•ˆė— í•īë‹đ ëģ€ėˆ˜ė˜ ėīëĶ„ė„ ė ėœžëĐī 된ë‹Ī.
  • counter ëģ€ėˆ˜ëĨž ė—…데ėīíŠļ 하ęļ° ėœ„í•ī countUp í•Ļėˆ˜ëĨž ė„ ė–ļ하ęģ  buttonė— click ėīëēĪíŠļëĨž 등록한ë‹Ī.
  • 마ė§€ë§‰ėœžëĄœ UIė— ëģ€ęē― ė‚Ží•­ė„ 반ė˜í•˜ęļ° ėœ„í•īė„œëŠ” Appė„ ë‹Īė‹œ render í•īė•ž 한ë‹Ī.
const root = document.getElementById("root");
let counter = 0;
function countUp () {
  counter++; // 3. counter 값ė„ ė˜ŽëĶŽęģ 
  render(); // 4. 바뀐 counter 값ė„ 가ė§€ëŠ” App ėŧī폮넌íŠļëĨž ë‹Īė‹œ render 한ë‹Ī
}
function render () {
  ReactDOM.render(<App />, root);
}
function App() {
  return (
    <div>
      <h3>Total Click: {counter}</h3>
      <button onClick={countUp}>íīëĶ­</button>
    </div>
  );
} // 2. ëē„튞ė„ íīëĶ­í•  때마ë‹Ī ėīëēĪíŠļ ëĶŽėŠĪ너가 ė‹Ī행된ë‹Ī.
render(); // 1. ėē˜ėŒ App ėŧī폮넌íŠļëĨž render 하ė—Ž 화ëĐīė— ëģīė—ŽėĪ€ë‹Ī

ë‹Ī만, ėī ë°Đëē•ė„ ė‚ŽėšĐ할 때는 데ėī터가 바뀔 때마ë‹Ī ëĶŽë Œë”링 하ęļ° ėœ„í•ī ReactDOM.render() í•Ļėˆ˜ëĨž í˜ļėķœí•īė•žë§Œ 한ë‹Ī.

ðŸ’Ą React JSė—ė„œė˜ ëĶŽë Œë”링

바닐띾 JS ė―”ë“œëĨž ė‚ŽėšĐ하ëĐī ė§€ė •í•œ ėš”ė†Œ ė „ėēī가 ė—…데ėīíŠļ 된ë‹Ī.
개발ėž 도ęĩŽëĨž í†ĩí•ī ė‚īíŽīëģīëĐī span.innerTextė— ė˜í•ī counter ëģ€ėˆ˜ë§Œėī ė•„니띞 'Total Click' 텍ėŠĪíŠļęđŒė§€ 폎í•Ļ하ė—Ž span ėš”ė†Œ ė „ėēī가 ė—…데ėīíŠļ 되는 ęēƒė„ 확ėļ할 ėˆ˜ ėžˆë‹Ī.

반ëĐīė—, React JSëĨž ė‚ŽėšĐ하ëĐī UIė—ė„œ 바뀐 ëķ€ëķ„만ė„ ė—…데ėīíŠļ 할 ėˆ˜ ėžˆë‹Ī.
개발ėž 도ęĩŽëĨž í†ĩí•ī ė‚īíŽīëģīëĐī counter ëģ€ėˆ˜ė— í•īë‹đ하는 ëķ€ëķ„만 ė—…데ėīíŠļ 되는 ęēƒė„ ė•Œ ėˆ˜ ėžˆë‹Ī.
React JS는 ėīė „ė— 렌더링된 ėŧī폮넌íŠļ가 ëŽīė—‡ėļė§€ëĨž 확ėļ하ęģ , ë‹ĪėŒė— 렌더링될 ėŧī폮넌íŠļ는 ëŽīė—‡ėļė§€ëĨž 확ėļ하ė—Ž, 바뀐 ëķ€ëķ„만ė„ ė—…데ėīíŠļ í•īėĪ€ë‹Ī.

ë‹Īė‹œ 말í•ī, CountUp í•Ļėˆ˜ė— ė˜í•ī 데ėī터ëĨž 바ęūž 후 ëĶŽë Œë”링 하ęēŒ 되ëĐī 바뀐 데ėī터ëĨž 가ė§€ëŠ” App ėŧī폮넌íŠļ ė „ëķ€ę°€ ėžŽėƒė„ąë˜ė–ī rootė— ë°°ėđ˜ë˜ė§€ë§Œ, ė‹Īė œëĄœëŠ” ė˜Ī로ė§€ counter ëģ€ėˆ˜ë§Œėī 바뀔 ëŋėīë‹Ī.
ėī는 ėļ터렉티ëļŒí•œ ė–ī플ëĶŽėž€ėīė…˜ė„ 만드는 데 ë§Īėš° 큰 도ė›€ėī 된ë‹Ī.

2) React.useState() ė‚ŽėšĐ

React.useState()ëĨž ė‚ŽėšĐ하ëĐī (render í•Ļėˆ˜ëĨž ęģ„ė† í˜ļėķœí•  필ėš” ė—†ėī) React JS ė–ī플 ë‚īė— 데ėī터ëĨž ëģīęī€í•˜ęģ , ėžë™ėœžëĄœ ëĶŽë Œë”링ė„ ėžėœží‚Ž ėˆ˜ ėžˆë‹Ī.

  • App í•Ļėˆ˜ ė•ˆ(React JS ė–ī플 ė•ˆ)ė— React.useState()ëĨž ėīėšĐí•ī counter ëģ€ėˆ˜ė™€ setCounter í•Ļėˆ˜ëĨž ė„ ė–ļ한ë‹Ī.
  • counter ëģ€ėˆ˜ëĨž JSXė— ė „닎하ęļ° ėœ„í•īė„œëŠ” {} ė•ˆė— í•īë‹đ ëģ€ėˆ˜ė˜ ėīëĶ„ė„ ė ėœžëĐī 된ë‹Ī.
  • counter ëģ€ėˆ˜ëĨž ė—…데ėīíŠļ 하ęļ° ėœ„í•ī buttonė— click ėīëēĪíŠļëĨž 등록한ë‹Ī. ėīëēĪíŠļ ëĶŽėŠĪ너ė—ė„œëŠ” setCounter í•Ļėˆ˜ëĨž ė‹Ī행하도록 í•ĻėœžëĄœėĻ counter ëģ€ėˆ˜ė˜ 값ė„ 바ęūļ는 동ė‹œė— ėžë™ėœžëĄœ ëĶŽë Œë”링 되도록 한ë‹Ī.
  • 따띾ė„œ, UIė— ëģ€ęē― ė‚Ží•­ė„ 반ė˜í•˜ęļ° ėœ„í•ī ReactDOM.render() í•Ļėˆ˜ëĨž ë‹Īė‹œ í˜ļėķœí•  필ėš”ę°€ ė—†ë‹Ī.
const App = () => {
  const [counter, setCounter] = React.useState(0);
  const onClick = () => {
    setCounter(counter + 1);
  };
  return (
    <div>
      <h3>Total Click: {counter}</h3>
      <button onClick={onClick}>íīëĶ­</button>
   </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

React.useState()ė€ ë°°ė—īė„ return 하ëĐ°, ėļėžëĄœëŠ” 데ėī터ė˜ ėīˆęļ°ę°’ė„ ė „ë‹Ží•  ėˆ˜ ėžˆë‹Ī.
counter는 데ėī터, setCounter는 데ėī터ëĨž 바ęūļ는 데 ė‚ŽėšĐ되는 í•Ļėˆ˜ėīë‹Ī.

const [counter, setCounter] = React.useState(0);

// ėœ„ė™€ ė•„래는 같ė€ ė―”ë“œėīë‹Ī

const data = React.useState(0);
const counter = data[0];
const setCounter = data[1];

React.useState()가 반환하는 ë°°ė—īė˜ 두 ëēˆė§ļ ėš”ė†Œėļ setCounter í•Ļėˆ˜ëŠ”, counter ëģ€ėˆ˜ė˜ 값ė„ 바ęūž 후, ėīëĨž ėžë™ėœžëĄœ ëĶŽë Œë”링ęđŒė§€ í•īėĪ€ë‹Ī.

const OnClick = () => {
  setCounter(counter + 1);
};

// ėœ„ė™€ ė•„래는 같ė€ ė―”ë“œėīë‹Ī

const OnClick = () => {
  counter++;
  ReactDOM.render(<Container />, root);
};

ðŸ’Ą React JSė—ė„œė˜ ëĶŽë Œë”링

(1)ęģž 마ė°Žę°€ė§€ëĄœ 마ė°Žę°€ė§€ëĄœ UIė—ė„œ 바뀐 ëķ€ëķ„만ė„ ė—…데ėīíŠļ 할 ėˆ˜ ėžˆë‹Ī.

App ėŧī폮넌íŠļė˜ state, ėĶ‰ ė–ī플ëĶŽėž€ėīė…˜ė˜ 데ėī터가 바뀌ëĐī App ėŧī폮넌íŠļ ė „ëķ€ëĨž ėžŽėƒė„ą(ëĶŽë Œë”링)한ë‹Ī.
(App í•Ļėˆ˜ė—ė„œ return 하ęļ° ė „ė— ė―˜ė†” 로ę·ļëĨž ėķ”ę°€í•˜ëĐī íīëĶ­í•  때마ë‹Ī ė―˜ė†”ė— 값ėī ėķœë Ĩ된ë‹Ī.)

ę·ļ럮나 뎞률 ė—Žęļ°ė„œë„ ė‹Īė œëĄœëŠ” ė˜Ī로ė§€ counter ëģ€ėˆ˜ë§Œėī 바뀔 ëŋėīë‹Ī.
(개발ėž 도ęĩŽė˜ elements 탭ė„ ė‚īíŽīëģīëĐī ëē„튞ė„ íīëĶ­í•  때마ë‹Ī counter ëģ€ėˆ˜ ëķ€ëķ„만ėī ëģ€í•œë‹Ī.)

🔎 ėīė „ ë‹Ļęģ„ė˜ stateëĨž ėīėšĐí•īė„œ ë‹ĪėŒ ë‹Ļęģ„ė˜ state 바ęūļęļ°

stateëĨž ė„Īė •í•˜ëŠ” 데는 2가ė§€ ë°Đëē•ėī ėžˆë‹Ī.
하나는 ė§ė ‘ state 값ė„ ėž…ë Ĩí•īėĢžëŠ” ęēƒėīęģ (ex. setCounter(333)), ë‹ĪëĨļ 하나는 ėīė „ ë‹Ļęģ„ė˜ stateëĨž ėīėšĐí•ī ë‹ĪėŒ ë‹Ļęģ„ė˜ stateëĨž 바ęūļ는 ęēƒėīë‹Ī.(ex. setCounter(counter + 1))

const onClick = () => {
  // setCounter(counter + 1);
  setCounter(current => current + 1);
};

ėœ„ė—ė„œëŠ” ėīė „ ë‹Ļęģ„ė˜ stateëĨž ėīėšĐí•īė„œ ë‹ĪėŒ ë‹Ļęģ„ė˜ stateëĨž 바ęūļęļ° ėœ„í•ī setCounter(counter + 1)ëĨž ė‹Ī행한ë‹Ī.
ę·ļ럮나 ėī렇ęēŒ ėž‘ė„ąí•˜ëĐī ė˜ˆęļ°ėđ˜ ëŠŧ하ęēŒ ë‹ĪëĨļ ęģģė—ė„œ state가 ëģ€ęē―된 ęē―ėš° ė˜ˆėƒęģž ë‹ĪëĨļ ęē°ęģžę°€ 나ė˜Ž ėˆ˜ë„ ėžˆë‹Ī.
대ė‹ ė— setCounter(current => current + 1)ė„ ė‹Ī행하는 ęēƒėī 더 ė•ˆė „하ë‹Ī.


2. UNIT CONVERTER(ë‹Ļėœ„ ëģ€í™˜ ė•ą) 만ë“Īęļ°

1) minutesëĨž hours로 ëģ€í™˜

(1) htmlFor / className

foręģž class는 ėžë°”ėŠĪ큎ëĶ―íŠļė—ë„ ėĄīėžŽí•˜ëŠ” ė˜ˆė•―ė–īėīęļ° 때ëŽļė— JSX ė―”ë“œė—ė„œ ė‚ŽėšĐ하ë Īęģ  하ëĐī ė—ëŸŽę°€ 뜮ë‹Ī.
대ė‹ ė— JSX ëŽļëē•ė— 따띾 htmlForęģž classNameė„ ė‚ŽėšĐí•īė•ž 한ë‹Ī.

(2) React JSė—ė„œ formė„ ë‹ĪëĢĻ는 ë°Đëē•

React JS ė„ļęģ„ė—ė„œ ėƒė„ąí•œ inputė˜ value는 ė§ė ‘ í†ĩė œí•  ėˆ˜ ė—†ë‹Ī.(uncontrolled input)

따띾ė„œ, stateëĨž 만ë“Īė–īė„œ inputė˜ value ė†ė„ąėœžëĄœ ė „í•īėĪ€ 후(ėī때 React.useState()ė˜ ėļėžëĄœ ęļ°ëģļ값ė„ ė§€ė •í•īė•ž ęē―ęģ ę°€ ė•ˆëœļ) ė‚ŽėšĐėžę°€ inputė— ë‹ĪëĨļ 값ė„ ėž…ë Ĩ할 때마ë‹Ī inputė˜ valueëĨž ė—…데ėīíŠļ 하ė—Ž(onChange í•Ļėˆ˜) ę·ļ 값ė„ ė™ļëķ€ė—ė„œ 가ė ļė˜Ī도록 í•īė•ž 한ë‹Ī.({minutes} ėīėšĐ)

inputė˜ valueëĨž stateė™€ ė—°ęē°ė‹œí‚īėœžëĄœėĻ, inputė˜ valueëĨž ė™ļëķ€ė—ė„œë„ ėˆ˜ė •í•  ėˆ˜ ėžˆë‹Ī.

const App = () => {
  const [minutes, setMinutes] = React.useState(0);
  const onChange = (event) => setMinutes(event.target.value);
  return (
    <div>
      <label htmlFor="minutes">Minutes</label>
      <input
        value={minutes}
        id="minutes"
        placeholder="Minutes"
        type="number"
        onChange={onChange}
      />
      <label htmlFor="hours">Hours</label>
      <input id="hours" placeholder="Hours" type="number" />
      <h4>minutes inputė˜ value는 {minutes} ėž…니ë‹Ī</h4>
    </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

onChange í•Ļėˆ˜ ė•ˆė—ė„œ console.log(event) ëĨž ė‹Ī행하ëĐī ė―˜ė†” ė°―ė— SyntheticBaseEvent 객ėēī가 ėķœë Ĩ된ë‹Ī.
ėī는 nativeEventëĨž 가ė§€ëŠ”데 ėī ė•ˆė— targetėī inputė„ ė˜ëŊļ하ęģ  targetė€ valueëĨž 가ė§„ë‹Ī.

ėĶ‰, console.log(event.target.value) ëĨž ė‹Ī행하ëĐī ė―˜ė†” ė°―ė— inputė˜ value가 ėķœë Ĩ된ë‹Ī.
ėīė œ setMinutes í•Ļėˆ˜ëĨž ėīėšĐí•ī minutesëĨž ė—…데ėīíŠļ 한 후 Appp ėŧī폮넌íŠļëĨž ëĶŽë Œë”링í•īė•ž 한ë‹Ī.

ėīė œ minutes inputė— ė‚ŽėšĐėžę°€ 값ė„ ėž…ë Ĩ하ė—Ž inputė˜ value가 ëģ€í•  때마ë‹Ī ę·ļ ëģ€í™”ę°€ h4ė— ė‹Īė‹œę°„ėœžëĄœ 반ė˜ë˜ė–ī ëģīėīęēŒ 된ë‹Ī.

ðŸ’Ą ėī때 onChange={onChange} ė―”ë“œëĨž ė‚­ė œí•˜ëĐī ė•„ëŽīëĶŽ minutes inputė—ė„œ í‚Īëģī드ëĨž 눌럮 값ė„ ėž…ë Ĩí•ī도 input ė°―ė—ëŠ” ęģ„ė† 0만 ëģīėļë‹Ī.

ėī는 ė›ëž˜ inputė˜ valueėļ {minutes}ė˜ ęļ°ëģļ값ė„ 0ėœžëĄœ ė„Īė •í•œ 후
ė‚ŽėšĐėžę°€ í‚Īëģī드ëĨž 눌럮 값ė„ ëģ€ęē―할 때마ë‹Ī onChange ėīëēĪíŠļ ëĶŽėŠĪ너ė— ė˜í•ī minutes 값ėī ëģ€ęē―ëĻėœžëĄœėĻ
inputė˜ value도 ëģ€ęē―되ęģ  App ėŧī폮넌íŠļ가 ëĶŽë Œë”ë§ë˜ë„ëĄ 했는데

onChange ėīëēĪíŠļ ëĶŽėŠĪ너ëĨž ė‚­ė œí–ˆęļ° 때ëŽļė— minutesė˜ 값ėī 0ėļ ėƒíƒœė—ė„œ ė—…데ėīíŠļ 되ė§€ ė•Šęļ° 때ëŽļėīë‹Ī.

ë‹Īė‹œ 말í•ī, minutes inputė˜ ęē―ėš° ① ëĻžė € change event도 ëĶŽėŠĪ닝 í•īė•ž 하ęģ , ② change event가 발ėƒí–ˆė„ 때 inputė˜ valueëĨž ė—…데ėīíŠļ 하ęģ  UIė— ëģīė—ŽėĢžęļ°ë„ í•īė•ž 한ë‹Ī.
hours inputė˜ ęē―ėš° input ė°―ė„ ėˆ˜ė •í•  ėˆ˜ ė—†ë„록 change eventëĨž ëĶŽėŠĪ닝하ė§€ ė•ŠęēŒë” 했ë‹Ī.

(3) ë‹Ļėœ„ ëģ€í™˜ / ëĶŽė…‹ ëē„튞 ęĩŽí˜„

const App = () => {
  const [minutes, setMinutes] = React.useState(0);
  const onChange = (event) => setMinutes(event.target.value);
  const onClick = () => setMinutes(0); // reset ëē„튞 íīëĶ­ ė‹œ minutes(inputė˜ value) ėīˆęļ°í™”
  return (
    <div>
      <h1>Super Converter</h1>
      <div>
        <label htmlFor="minutes">Minutes</label>
        <input
          value={minutes}
          id="minutes"
          placeholder="Minutes"
          type="number"
          onChange={onChange}
        />
      </div>
      <div>
        <label htmlFor="hours">Hours</label>
        <input
          value={Math.round(minutes / 60)} // ë‹Ļėœ„ ëģ€í™˜
          id="hours"
          placeholder="Hours"
          type="number"
        />
      </div>
      <button onClick={onClick}>Reset</button>
    </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

2) hoursëĨž minutes로 ëģ€í™˜

(1) disabledė˜ ė ėšĐ ė—Žëķ€ëĨž ęē°ė •í•˜ëŠ” flip ëē„튞

ęļ°ëģļė ėœžëĄœ hours inputė— disabledëĨž ė ėšĐ하ęģ  minutes inputė€ enabled ėƒíƒœëĄœ 둔ë‹Ī.
stateëĨž 하나 더 만ë“Īė–ī flip ëē„튞ė„ 누ëĨīëĐī flipped ëģ€ėˆ˜ė˜ 값ėī 반대가 되도록 한ë‹Ī.

const App () => {
  ...
  const [flipped, setFlipped] = React.useState(false); // ęļ°ëģļ값 false
  const onFlip = () => setFlipped(current => !current); // flipped ëģ€ėˆ˜ 값 ė—…데ėīíŠļ & App ėŧī폮넌íŠļ ëĶŽë Œë”링
  return (
    <div>
      <div>
        <label htmlFor="minutes">Minutes</label>
        <input
        id="minutes"
        ...
        disabled={flipped} // {flipped === true} ė™€ 같ë‹Ī
        />
      </div>
      <div>
        <label htmlFor="hours">Hours</label>
        <input
        id="hours"
        ...
        disabled={!flipped} // {flipped === false} ė™€ 같ë‹Ī
        />
      </div>
      ...
      <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
    </div>
  );
};

(2) hours inputė— onChange ėīëēĪíŠļ 등록하ęļ°

minutes inputė— 값ė„ ėž…ë Ĩ했ė„ 때ė—ë§Œ hours inputė— {Math.round(minutes / 60)}ė˜ 값ėī ëģīė—Žė§€ë„록 하ęģ , hours inputė— 값ė„ ėž…ë Ĩ했ė„ 때는 hours inputė— ėž…ë Ĩ한 값ė„ ę·ļ대로 ëģīė—ŽėĢžë„록 í•īė•ž 한ë‹Ī.
minutes inputė˜ ęē―ėš°ė—ë„ 마ė°Žę°€ė§€ėīë‹Ī.

ėīëĨž ėœ„í•ī flipped ëģ€ėˆ˜ė˜ 값ė„ ėīėšĐí•ī ėĄ°ęąīëķ€ ė‚ží•­ ė—°ė‚°ėžëĨž ė‚ŽėšĐ한 ė―”ë“œëĄœ ėˆ˜ė •í•  ėˆ˜ ėžˆë‹Ī.

ė―”ë“œė˜ 혾동ė„ 픾하ęļ° ėœ„í•ī ėœ„ė—ė„œ ė„ ė–ļ한 minutesëĨž amount로, setMinutesëĨž setAmount로 바ęŋ”ėĢžė—ˆë‹Ī.

ę·ļ런데 ėī렇ęēŒ ėž‘ė„ąí•˜ëĐī ëŽļė œę°€ 하나 ėžˆë‹Ī.
flip ëē„튞ė„ íīëĶ­í•˜ëĐī 활ė„ąí™”된 inputė˜ valueė— amount ëģ€ėˆ˜ė˜ 값ėī 할ë‹đ되ė–ī ëģīėīęēŒ 된ë‹Ī.
ėīëĨž í•īęē°í•˜ęļ° ėœ„í•ī onFlip í•Ļėˆ˜ė— reset() ė―”ë“œëĨž ėķ”ę°€í–ˆë‹Ī.

const onFlip = () => {
  setAmount(current => !current);
  reset();
};
...
<input
  value={!flipped ? amount : amount * 60}
  id="minutes"
  ...
  disabled={flipped}
/>
...
<input
  value={flipped ? amount : Math.round(amount / 60)}
  id="hours"
  ...
  disabled={!flipped}
/>

3. airbnb/javascript: JavaScript Style Guide

1) array.filter(Boolean)

const array = [1, "hi", null, ``, false];

const truthyCount = array.filter(Boolean).length;
// ėœ„ ė•„래는 같ė€ ė―”ë“œėīë‹Ī.
// Boolean()ė€ ę·ļ ėļėžę°€ trueėž 땐 trueëĨž, falseėž 땐 falseëĨž ëĶŽí„ī하는 í•Ļėˆ˜ėīë‹Ī.
const truthyCount = array.filter((item) => Boolean(item)).length;

console.log(truthyCount); // ë°°ė—ī [1, "hi"]ė˜ ęļļėī는 2

âœĻ ë‚īėž 할 ęēƒ

  1. ë‹Ļėœ„ ëģ€í™˜ ė•ą ė™„ė„ą
profile
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€