21.01.28

μ΄μ†Œμž„Β·2021λ…„ 1μ›” 28일
1

TIL

λͺ©λ‘ 보기
8/12

πŸ’‘

Javascript Koans(const, hoisting, closure, this, Shallow Copying&Deep Copying)

  • λ”ν•˜κΈ°(+) μ—°μ‚°μžλŠ” μˆ«μžλ³΄λ‹€ λ¬Έμžμ—΄μ΄ μš°μ„ μ‹œ 되기 λ•Œλ¬Έμ—, μˆ«μžν˜•μ΄ λ¬Έμžν˜•μ„ λ§Œλ‚˜λ©΄ λ¬Έμžν˜•μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ—°μ‚°λœλ‹€. (문자 > 숫자) (ex. 123 - '1' = 122μ§€λ§Œ, '1' + true = '1true'λ‹€.) 이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” λ³„λ‚œ 뢀뢄듀이 μ‘΄μž¬ν•œλ‹€. μ΅œλŒ€ν•œ 같은 νƒ€μž…λΌλ¦¬ μ—°μ‚°ν•˜κ³ (μ—„κ²©ν•œ λ™μΉ˜ μ—°μ‚° === μ‚¬μš©), 쑰건문에 비ꡐ 연산을 λͺ…μ‹œν•˜μž.

  • constλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

    • const λ³€μˆ˜μ˜ νƒ€μž…μ΄ 객체인 경우, 객체에 λŒ€ν•œ μ°Έμ‘° 변경을 막을 뿐이기 λ•Œλ¬Έμ— ν• λ‹Ήλœ 객체의 λ‚΄μš©(ν”„λ‘œνΌν‹° μΆ”κ°€, μ‚­μ œ, ν”„λ‘œνΌν‹° κ°’ λ³€κ²½)은 κ°€λŠ₯ν•˜λ‹€.
    • 값을 λ³€κ²½ν•˜λŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 일은 생각보닀 λ§Žμ§€ μ•Šλ‹€. constλŠ” μ˜λ„ν•˜μ§€ μ•Šμ€ μž¬ν• λ‹Ήμ„ 막아주고, μ„ μ–Έν•œ κ°’μ˜ νƒ€μž…μ„ μœ μ§€ν•˜μ—¬ μ‹€μˆ˜λ₯Ό λ§‰λŠ” 데 큰 도움이 λœλ‹€. (ex. μž¬ν• λ‹ΉμœΌλ‘œ 객체 -> λ¬Έμžμ—΄λ‘œ λ³€κ²½λ˜λŠ” κ±Έ λ§‰μŒ)
    • 단, 반볡문처럼 μž¬ν• λ‹Ήμ΄ ν•„μš”ν•  λ•ŒλŠ” let을 μ“΄λ‹€. λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ 쒁게 λ§Œλ“ λ‹€.
    • ꡬ글 μŠ€νƒ€μΌ κ°€μ΄λ“œ / let, const와 블둝 레벨 μŠ€μ½”ν”„

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ„ 객체닀. λ”°λΌμ„œ λ‹€λ₯Έ 객체와 λ§ˆμ°¬κ°€μ§€λ‘œ λ„˜κΈ°κ±°λ‚˜ ν• λ‹Ήν•  수 μžˆλ‹€. ν•¨μˆ˜λ₯Ό 객체 ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•  μˆ˜λ„ μžˆλ‹€. 객체의 속성 κ°’μœΌλ‘œ 담겨진 ν•¨μˆ˜λ₯Ό λ©”μ†Œλ“œ(method)라고 λΆ€λ₯Έλ‹€.

  • ν•¨μˆ˜ν‘œν˜„μ‹: λ³€μˆ˜κ°’μ— ν•¨μˆ˜ ν‘œν˜„μ„ λ‹΄μ•„ 놓은 ν˜•νƒœ. ν΄λ‘œμ € ν˜Ήμ€ 콜백(λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 λ„˜κΉ€)으둜 μ‚¬μš©ν•  수 μžˆλ‹€.

  • ν˜Έμ΄μŠ€νŒ…(Hoisting)

    • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜κΈ° 전에 ν•¨μˆ˜ μ•ˆμ— ν•„μš”ν•œ λ³€μˆ˜κ°’λ“€μ„ λͺ¨μ•„μ„œ 유효 λ²”μœ„(ν•¨μˆ˜ 블둝 {} λ‚΄λΆ€)의 μ΅œμƒλ‹¨μ— μ„ μ–Έν•œλ‹€.
    • μžλ°”μŠ€ν¬λ¦½νŠΈ Parserκ°€ ν•¨μˆ˜ μ‹€ν–‰ μ „ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν•œλ²ˆ ν›‘μ–΄ ν•¨μˆ˜ μ•ˆμ— μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜/ν•¨μˆ˜μ„ μ–Έμ— λŒ€ν•œ 정보λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλ‹€κ°€ μ‹€ν–‰μ‹œν‚¨λ‹€. μ‹€μ œλ‘œ μ½”λ“œκ°€ λŒμ–΄μ˜¬λ €μ§€λŠ” 건 μ•„λ‹ˆλ©°, μžλ°”μŠ€ν¬λ¦½νŠΈ Parser λ‚΄λΆ€μ μœΌλ‘œ λŒμ–΄μ˜¬λ €μ„œ μ²˜λ¦¬ν•˜λŠ” 것이닀.
    • ν•¨μˆ˜μ„ μ–Έλ¬Έμ€ ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 λ°›μ§€λ§Œ, ν•¨μˆ˜ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 받지 μ•ŠλŠ”λ‹€. var λ³€μˆ˜ μ„ μ–Έκ³Ό ν•¨μˆ˜μ„ μ–Έλ¬Έμ—μ„œλ§Œ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚œλ‹€. var λ³€μˆ˜ μ„ μ–Έλ§Œ μœ„λ‘œ λŒμ–΄μ˜¬λ €μ§€λ©°, 할당은 λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠλŠ”λ‹€. ν•¨μˆ˜λŠ” 전체가 λŒμ–΄μ˜¬λ €μ§„λ‹€. ν•˜μ§€λ§Œ, ν˜Όλ™μ„ λ°©μ§€ν•˜λŠ” λͺ…μ‹œμ μΈ μ½”λ“œλ₯Ό μœ„ν•΄ ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄μ„œλŠ” κ°œλ…λ§Œ μˆ™μ§€ν•˜κ³  μ‹€ν–‰ μˆœμ„œλŒ€λ‘œ μ½”λ“œλ₯Ό 짜자.

  • νŒ©ν† λ¦¬ ν•¨μˆ˜(factory function)

    • ν•¨μˆ˜κ°€ 객체λ₯Ό λ°˜ν™˜ν•  λ•Œ, κ·Έ ν•¨μˆ˜λ₯Ό νŒ©ν† λ¦¬ ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€. 객체 μžμ²΄κ°€ λΆ€ν’ˆμΈ 곡μž₯. λΉ„μŠ·ν•œ 객체 ν”„λ‘œνΌν‹°μ™€ 값을 μ—¬λŸ¬ 번 생성할 수 μžˆλ‹€.
    • new λ˜λŠ” this없이 μž„μ˜λ‘œ λ³΅μž‘ν•œ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•  수 μžˆλ‹€.
    • μžμ„Έν•œ μ“°μž„μƒˆλŠ” 더 곡뢀해 λ³Ό 것!

  • namespace pattern

    • λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” 이름이 μ‘΄μž¬ν•˜λŠ” 곡간이닀. κ°μ²΄λ‚˜ λ³€μˆ˜μ˜ 이름이 κ²ΉμΉ  경우 값이 λ°”λ€Œκ±°λ‚˜ μ—λŸ¬κ°€ λ‚  수 있기 λ•Œλ¬Έμ—, 이름 곡간을 μ„ μ–Έν•˜μ—¬ μ•ˆμ „ν•œ μ½”λ“œλ₯Ό λ§Œλ“€ 수 있게 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ κΈ°λŠ₯이 μ—†κΈ° λ•Œλ¬Έμ— 주둜 객체λ₯Ό μ‚¬μš©ν•΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•œλ‹€.
    • 객체 λ¦¬ν„°λŸ΄ λ„€μž„μŠ€νŽ˜μ΄μ‹±(Object Literal Namespacing): κ°€μž₯ 기본적인 λ„€μž„μŠ€νŽ˜μ΄μ‹± 방식. ν•˜λ‚˜μ˜ μ „μ—­ 객체λ₯Ό λ§Œλ“  ν›„, λͺ¨λ“  ν•¨μˆ˜, 객체, λ³€μˆ˜λ₯Ό 여기에 μΆ”κ°€ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.
    • λ²”μš© λ„€μž„μŠ€νŽ˜μ΄μŠ€ ν•¨μˆ˜: ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§€λ©΄, μ½”λ“œμ˜ 각 뢀뢄듀이 λ³„κ°œμ˜ 파일둜 λΆ„λ¦¬λ˜μ–΄ μ„ νƒμ μœΌλ‘œ λ¬Έμ„œμ— ν¬ν•¨λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. κ·Έλ ‡κ²Œ 되면 이미 μžˆλŠ” 것을 μž¬μ •μ˜ν•˜λŠ” 일도 생길 수 μžˆλ‹€. λ”°λΌμ„œ 객체λ₯Ό μ„ μ–Έν•˜κΈ° 전에, μ „μ—­ 객체의 μ‘΄μž¬μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•œλ‹€. (μ½”λ“œλŠ” 아직 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ² μŒ. μΆ”ν›„ 볡슡 ν•„μš”) μ°Έκ³ 

  • private variables: λ³€μˆ˜λ₯Ό μ•„λ¬΄λ‚˜ μˆ˜μ •ν•  수 μ—†κ²Œ ν•¨μˆ˜ μ•ˆμ— λ‘” 것. μ™ΈλΆ€μ—μ„œ λ³€μˆ˜λ₯Ό 직접 μˆ˜μ •ν•  수 μ—†κ³ , ν•¨μˆ˜ ν˜ΈμΆœμ„ ν†΅ν•΄μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.

  • 전역객체

    • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λͺ¨λ“  κ°μ²΄λŠ” μ „μ—­κ°μ²΄μ˜ ν”„λ‘œνΌν‹°λ‹€.
    • μ „μ—­κ°μ²΄μ˜ 이름은 ν˜ΈμŠ€νŠΈν™˜κ²½μ— λ”°λΌμ„œ λ‹€λ₯΄λ‹€. (μ›ΉλΈŒλΌμš°μ €: window, node.js: global)

  • μƒμ„±μžμ™€ new

    • μƒμ„±μž(constructor)λŠ” 객체λ₯Ό λ§Œλ“œλŠ” 역할을 ν•˜λŠ” ν•¨μˆ˜λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ 둜직의 묢음이 μ•„λ‹ˆλΌ 객체λ₯Ό λ§Œλ“œλŠ” 창쑰자라고 ν•  수 μžˆλ‹€.
    • new funName()으둜 μ‚¬μš©ν•˜λ©°, λΉ„μ–΄ μžˆλŠ” 객체(이름은 ν•¨μˆ˜λͺ…κ³Ό 동일)λ₯Ό λ§Œλ“€κ³  λ°˜ν™˜ν•œλ‹€.
    • μƒμ„±μž λ‚΄μ—μ„œ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λ©΄(μ΄ˆκΈ°ν™”), μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ 높아진닀.
    function Person(name){
      this.name = name;
      this.introduce = function(){
        return 'My name is '+this.name; 
      }   
    }
    const p1 = new Person('egoing');
    const p2 = new Person('leezche');

  • this

    • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜ μ•ˆμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μΌμ’…μ˜ λ³€μˆ˜, μ•½μ†λ˜μ–΄ μžˆλŠ” λ³€μˆ˜.
    • λ©”μ†Œλ“œμ˜ thisλŠ” λ©”μ†Œλ“œκ°€ μ†Œμ†λ˜μ–΄ μžˆλŠ” 객체λ₯Ό 가리킨닀. μ „μ—­μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  κ²½μš°μ—λŠ” 사싀 (window.)funcName μ΄λ―€λ‘œ windowλ₯Ό 가리킨닀.
    • μƒμ„±μž μ•ˆμ˜ thisλŠ” μƒˆλ‘œ μƒμ„±λœ 객체닀.

  • 객체의 κΉŠμ€ 볡사와 얕은 볡사

    • 얕은 볡사(Shallow Copying)

      • μ•„λž˜ λ°©λ²•λ“€λ‘œ 객체λ₯Ό 볡사할 λ•Œ, 객체 내뢀에 μ€‘μ²©λœ 뢀뢄이 μžˆλ‹€λ©΄ μ™„λ²½ν•˜κ²Œ λ³΅μ‚¬λ˜μ§€ μ•ŠλŠ”λ‹€. (ex. λ°°μ—΄ [1, 2, [3, 4]] λ₯Ό λ³΅μ‚¬ν•˜μ˜€μ„ λ•Œ, 1, 2λŠ” μƒˆλ‘œμš΄ λ°μ΄ν„°κ°’μœΌλ‘œ λ³΅μ‚¬λ˜λ‚˜ 3, 4λŠ” 참쑰값이 λ³΅μ‚¬λ˜μ–΄ 원본과 데이터값을 κ³΅μœ ν•œλ‹€. 1 depth만 볡사함.)
      • arr.slice([begin[, end]])
      • Object.assign()
    • κΉŠμ€ 볡사(Deep Copying)

      • 쀑첩 ꡬ쑰도 볡사할 수 μžˆλŠ” 방법이 μžˆλ‹€. JSON.stringifyλŠ” μž…λ ₯ κ°’μœΌλ‘œ λ„˜μ–΄μ˜¨ 데이터λ₯Ό 문자둜 λ³€ν˜•μ‹œμΌœμ£ΌλŠ” λ©”μ†Œλ“œμ΄λ©°, JSON.parseλŠ” μ΄λ ‡κ²Œ λ³€ν˜•λœ 문자λ₯Ό λ‹€μ‹œ μ›λž˜ 객체둜 λ˜λŒλ €μ£ΌλŠ” 역할을 ν•œλ‹€.
      • JSON.parse(JSON.stringify(obj))
    • μ°Έκ³ 


CSS Selector

  • HTML μš”μ†Œμ˜ νŠΉμ • 뢀뢄에 μŠ€νƒ€μΌμ„ μ μš©ν•˜κ³ μž ν•  λ•Œ μ…€λ ‰ν„°κ°€ μ‚¬μš©λœλ‹€.

  • 전체 μ…€λ ‰ν„°

    • HTML νŽ˜μ΄μ§€ λ‚΄λΆ€μ˜ λͺ¨λ“  νƒœκ·Έλ₯Ό 선택.
    • * { }
  • Tag μ…€λ ‰ν„°

    • νƒœκ·Έλͺ…이 (name)인 νƒœκ·Έλ₯Ό 선택.
    • h1 { }
    • div { }
    • section, h1 { } : μ‰Όν‘œλŠ” λ‹€μ€‘μœΌλ‘œ μ„ νƒν•œλ‹€.
  • ID μ…€λ ‰ν„°

    • id 속성값이 name으둜 μ§€μ •λœ μš”μ†Œλ₯Ό 선택
    • #only { }
  • class μ…€λ ‰ν„°

    • class 속성값이 name 으둜 μ§€μ •λœ μš”μ†Œλ₯Ό 선택
    • .widget { }
    • .center { }
  • attribute μ…€λ ‰ν„°(μ™ΈμšΈ ν•„μš” μ—†μŒ)

    • a[href] { } : a μš”μ†Œ 쀑 herf 속성을 κ°–λŠ” μš”μ†Œ 선택
    • p[id="only"] { } : p μš”μ†Œ 쀑 id 속성 값에 "only"λ₯Ό κ°–λŠ” μš”μ†Œ 선택
    • p[class~="out"] { } : p μš”μ†Œ 쀑 class 속성 값에 "out"을 λ‹¨μ–΄λ‘œ ν¬ν•¨ν•˜λŠ” μš”μ†Œ(곡백으둜 λΆ„λ¦¬λ˜μ–΄μ•Ό 함)
    • p[class|="out"] { } : p μš”μ†Œ 쀑 class 속성 값이 "out"κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ "out"으둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œ 선택
    • section[id^="sect]" { } : section μš”μ†Œ 쀑 id 속성 값이 "sect"둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œ 선택
    • div[class$="2"] : div μš”μ†Œ 쀑 class 속성 값이 "2"둜 λλ‚˜λŠ” μš”μ†Œ 선택
    • div[class*="w"] { } : div μš”μ†Œ 쀑 class 속성 값에 "w"λ₯Ό ν¬ν•¨ν•˜λŠ” μš”μ†Œ 선택
  • 후손 μ…€λ ‰ν„°

    • header h1 { } : header μ•„λž˜ μžˆλŠ” h1 νƒœκ·Έλ₯Ό λͺ¨λ‘ 선택 (h1 μ•„λž˜ μš”μ†Œ 포함)
  • μžμ† μ…€λ ‰ν„°

    • header > p { } : header λ°”λ‘œ μ•„λž˜ μžˆλŠ” p νƒœκ·Έλ§Œμ„ 선택 (p μ•„λž˜ μš”μ†Œ 미포함)
  • 인접 ν˜•μ œ μ…€λ ‰ν„°

    • section + p { } : 같은 λΆ€λͺ¨λ₯Ό 가지고, section λ°”λ‘œ 뒀에 μ˜€λŠ” p만 선택
  • ν˜•μ œ μ…€λ ‰ν„°

    • section ~ p { } : 같은 λΆ€λͺ¨λ₯Ό 가지고, section 뒀에 μ˜€λŠ” pλ₯Ό λͺ¨λ‘ 선택 (μΈμ ‘ν•˜μ§€ μ•Šμ•„λ„ 선택함)
  • 가상 클래슀

    • a:link { } : λ°©λ¬Έ μ „ 링크
    • a:visited { } : λ°©λ¬Έ ν›„ 링크
    • a:hover { } : 마우슀 μ˜€λ²„ν–ˆμ„ λ•Œ
    • a:active { } : 마우슀λ₯Ό 클릭할 λ•Œ
    • a:focus { } : μš”μ†Œμ— 초점이 맞좰질 λ•Œ
  • μš”μ†Œ μƒνƒœ μ…€λ ‰ν„°

    • input:checked + span { }
    • input:enabled + span { }
    • input:disabled + span { }
  • ꡬ쑰 가상 클래슀 μ…€λ ‰ν„°(μ™ΈμšΈ ν•„μš” μ—†μŒ)

    • p:first-child { }
    • ul > li:last-child { }
    • ul > li:nth-child(2n) { }
    • section > p:nth-child(2n+1) { }
    • ul > li:first-child { }
    • li:last-child { }
    • div > div:nth-child(4) { }
    • div:nth-last-child(2) { }
    • section > p:nth-last-child(2n + 1) { }
    • p:first-of-type { }
    • div:last-of-type { }
    • ul:nth-of-type(2) { }
    • p:nth-last-of-type(1) { }
  • λΆ€μ • μ…€λ ‰ν„°

    • input:not([type="password"]) { }
    • div:not(:nth-of-type(2)) { }
  • μ •ν•©μ„± 확인 μ…€λ ‰ν„°

    • input[type="text"]:valid { }
    • input[type="text"]:invalid { }




γ€€

πŸ“

μ˜μ–΄ μ‹€λ ₯의 뢀쑱함을 λΌˆμ €λ¦¬κ²Œ λŠλΌλŠ” 쀑. 정말 μ–΄λ ΅λ‹€... 파고 λ“€μ–΄κ°ˆμˆ˜λ‘ μ–΄λ ΅λ‹€... μ‹€μ œλ‘œ λ‚΄κ°€ κ΅¬ν˜„μ„ ν•΄λ³Έ 것도 μ•„λ‹ˆλ‹ˆ κ°œλ…μ€ μ•Œκ² λŠ”λ° μ–΄λ–»κ²Œ μ“°μ΄λŠ”μ§€ 감이 μ „ν˜€ μ•ˆ μž‘νžŒλ‹€. 특히 λ„€μž„μŠ€νŽ˜μ΄μ‹±μ€ μ–΄λ–»κ²Œ μ“°μ΄λŠ”μ§€ λͺ¨λ₯΄κ² λŠ” 건 물둠이며 μ˜ˆμ‹œ μ½”λ“œλ₯Ό 봐도 λͺ¨λ₯΄κ² κ³ , νŒ©ν† λ¦¬ ν•¨μˆ˜λŠ” μ“°λŠ” 법은 μ•Œκ² λŠ”λ° μ–΄λ–€ λ•Œ μ“°μ΄λŠ”μ§€ 잘 감이 μ•ˆ μ˜¨λ‹€. 쑰금 λ§‰λ§‰ν•œ 밀이닀. 혼자 ν•˜λ‹€λ³΄λ‹ˆ μ—„μ²­ 빈λ‘₯거리기도 ν–ˆκ³ . μ •μ‹  차리자. 😀

0개의 λŒ“κΈ€