์ƒ๊ฐ/javascript

JavaScript ์ •๋ฆฌ

kyunghoonk00k 2022. 9. 23. 11:09
๋ฐ˜์‘ํ˜•

 ๐Ÿค JavaScript์˜ ์ž๋ฃŒํ˜•๊ณผ JavaScript๋งŒ์˜ ํŠน์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ ?

JavaScript๋งŒ์˜ ํŠน์„ฑ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript)๋Š” ๊ฐ์ฒด(object) ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋Š” ์›น์˜ ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ๋˜๋‚˜, Node.js์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์ ์ด๋ฉฐ, ํƒ€์ž…์„ ๋ช…์‹œํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
    : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์†๋„๋Š” ๋น ๋ฅด์ง€๋งŒ ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ž… ์–ธ์–ด์ด๊ธฐ ๋–„๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ์ง€๋งŒ, ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ชจ๋‘ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด

๋Š์Šจํ•œ ํƒ€์ž…์€ ํƒ€์ž… ์—†์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ’์€ ํ•ญ์ƒ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์žํ˜• ๊ฐ™์€ ํŠน์ •ํ•œ ์ž๋ฃŒํ˜•์— ์†ํ•œ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜๋Š” ์ž๋ฃŒํ˜•์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ์ˆœ๊ฐ„์— ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ˆœ๊ฐ„์—” ์ˆซ์ž๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
-> JavaScript์˜ ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ํŠน์ • ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ,
๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น (๋ฐ ์žฌํ• ๋‹น) ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ด์ฒ˜๋Ÿผ ์ž๋ฃŒ์˜ ํƒ€์ž…์€ ์žˆ์ง€๋งŒ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์€ ์–ธ์ œ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ฅผ
    ‘๋™์  ํƒ€์ž…(dynamically typed)’ ์–ธ์–ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

 


==, ===

JavaScript์—์„œ ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด == ์—ฐ์‚ฐ์ž์™€ === ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๋‘ ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

== ์—ฐ์‚ฐ์ž

JavaScript๋Š” ํƒ€์ž… ๋ณ€ํ™˜์— ๋Œ€ํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

== ์—ฐ์‚ฐ์ž๋Š” ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์˜ ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ผ๋ถ€ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

 

ํƒ€์ž…์„ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ === ์—ฐ์‚ฐ์ž์— ๋น„ํ•ด ๋Š์Šจํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

=== ์—ฐ์‚ฐ์ž

== ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ์ „์— ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ํƒ€์ž…์„ ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, === ์—ฐ์‚ฐ์ž๋Š” ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ == ์—ฐ์‚ฐ์ž์— ๋น„ํ•ด ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์ด ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, === ์—ฐ์‚ฐ์ž๋Š” ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

=== ์—ฐ์‚ฐ์ž์˜ ํŠน์ง•

  • NaN ๊ฐ’์€ ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฐ’๊ณผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, === ์—ฐ์‚ฐ์ž์— NaN ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ false์ž…๋‹ˆ๋‹ค.
  • ์ •ํ™•ํ•œ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” localeCompare ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์€ ๋ˆˆ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ, ๋™์ผํ•˜๋”๋ผ๋„ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ฒŒ ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://developer-talk.tistory.com/184 [ํ‰๋ฒ”ํ•œ ์ง์žฅ์ธ์˜ ๊ณต๋ถ€ ์ •๋ฆฌ:ํ‹ฐ์Šคํ† ๋ฆฌ]

๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ด๊ณ  ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.

 

type์„ ์ž˜๋ชป ์ž‘์„ฑํ•œ ์—๋Ÿฌ ์ฐพ๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Œ
: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ์–ธ์–ด๋Š” ํ•ด์„ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…ธ๋“œ๋‚˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ณ ์œ ํ•œ ํŠน์ˆ˜์„ฑ ๋•Œ๋ฌธ์—, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ์—ฌ๊ฒจ์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์†Œํ•œ ์˜คํƒ€ ์—๋Ÿฌ๋„ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋…ธ๋“œ์— ๋„์›Œ์„œ์•ผ ํ™•์ธ ๊ฐ€๋Šฅํ•จ
: ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €์— ํŽผ์ณ๋ณด๊ณ  ์ง์ ‘ ๋ Œ๋”๋ง์ด ๋œ ํ›„์— ์ฝ˜์†”๋กœ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•ด์•ผ ํ•จ

๋™์ ํƒ€์ž… ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ํ™•์ธํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋‚˜ Folw๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

undefined์™€ null์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋“ค์„ ๋น„๊ตํ•ด๋ณด์„ธ์š”.

undefined์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ์ƒํƒœ, null์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋นˆ ๊ฐ’์„ ํ• ๋‹นํ•œ ์ƒํƒœ(๋นˆ ๊ฐ์ฒด)์ด๋‹ค. ์ฆ‰, undefined๋Š” ์ž๋ฃŒํ˜•์ด ์—†๋Š” ์ƒํƒœ์ด๋‹ค.
๋”ฐ๋ผ์„œ typeof๋ฅผ ํ†ตํ•ด ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•ด๋ณด๋ฉด null์€ object๋กœ, undefined๋Š” undefined๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

typeof null // 'object'
typeof undefined // 'undefined'
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true

#undefined

undefined๋Š” ์›์‹œ๊ฐ’(Primitive Type)์œผ๋กœ, ์„ ์–ธํ•œ ํ›„์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋‚˜ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€ ์•Š์€ ์ธ์ˆ˜์— ์ž๋™์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ์ด ๊ฐ’์€ ์ „์—ญ ๊ฐ์ฒด์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ, ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ์˜ ๋ณ€์ˆ˜์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ undefined ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ ๊ฐ’์€ undefined ์›์‹œ ๊ฐ’์ด๋‹ค.

cf) undefined๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ „์—ญ ๋ฒ”์œ„ ์™ธ์—์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ์ง€๋ณด์ˆ˜์™€ ๋””๋ฒ„๊น…์— ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์•„๋ž˜์˜ ๊ฒฝ์šฐ์— ๋ณ€์ˆ˜๊ฐ€ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜
  • ๋ฉ”์„œ๋“œ์™€ ์„ ์–ธ์—์„œ ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋ฐ›์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ return ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

#null

null์€ ์›์‹œ๊ฐ’(Primitive Type) ์ค‘ ํ•˜๋‚˜๋กœ, ์–ด๋–ค ๊ฐ’์ด ์˜๋„์ ์œผ๋กœ ๋น„์–ด์žˆ์Œ์„ ํ‘œํ˜„ํ•œ๋‹ค. undefined๋Š” ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ, null์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

cf) null์€ undefined์ฒ˜๋Ÿผ ์ „์—ญ ๊ฐ์ฒด์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์ด๋‹ค

์ถœ์ฒ˜: https://2ssue.github.io/common_questions_for_Web_Developer/docs/Javascript/13_undefined&null.html#undefined



๐Ÿค JavaScript ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ์ด๋ž€ ?

javascript์˜ ์›์‹œ ํƒ€์ž…(primitive data type)์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value)์ด๋‹ค.

  • Boolean
  • null
  • undefined
  • Number
  • String
  • Symbol (New in ECMAScript 6)

์›์‹œ ํƒ€์ž… ์ด์™ธ์˜ ๋ชจ๋“  ๊ฐ’์€ ๊ฐ์ฒด(Object) ํƒ€์ž…์ด๋ฉฐ ๊ฐ์ฒด ํƒ€์ž…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’(mutable value)์ด๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋‹ค์‹œ ๋งŒ๋“ค ํ•„์š”์—†์ด ์ง์ ‘ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ดํŽด๋ณด์ž. C ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Javascript์˜ ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value) ์ด๋‹ค. ์ด๋Ÿฐ ๊ฐ’์„ “primitive values” ๋ผ ํ•œ๋‹ค. (๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ์˜ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค. ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค)

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

var str = 'Hello';
str = 'world';

์ฒซ๋ฒˆ์งธ ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌธ์ž์—ด ‘Hello’๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‹๋ณ„์ž str์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด ‘Hello’์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋˜๋ฉด ์ด์ „์— ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด ‘Hello’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ‘world’๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•˜๊ณ  ์‹๋ณ„์ž str์€ ์ด๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด๋•Œ ๋ฌธ์ž์—ด ‘Hello’์™€ ‘world’๋Š” ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ๋ณ€์ˆ˜ str์€ ๋ฌธ์ž์—ด ‘Hello’๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฌธ์ž์—ด ‘world’๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋ฟ์ด๋‹ค.

 

๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์•Œ์•„๋ณด์ž.

var user = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var myName = user.name; // ๋ณ€์ˆ˜ myName์€ string ํƒ€์ž…์ด๋‹ค.

user.name = 'Kim';
console.log(myName); // Lee

myName = user.name;  // ์žฌํ• ๋‹น
console.log(myName); // Kim

user.name์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ๋ณ€์ˆ˜ myName์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜ myName์— user.name์„ ํ• ๋‹นํ–ˆ์„ ๋•Œ user.name์˜ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ immutableํ•œ ๊ฐ’ ‘Lee’๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ณ  myName์€ ์ด๊ฒƒ์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ user.name์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค ํ•˜๋”๋ผ๋„ ๋ณ€์ˆ˜ myName์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ‘Lee’๋Š” ๋ณ€ํ•จ์ด ์—†๋‹ค.

var user1 = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var user2 = user1; // ๋ณ€์ˆ˜ user2๋Š” ๊ฐ์ฒด ํƒ€์ž…์ด๋‹ค.

user2.name = 'Kim';

console.log(user1.name); // Kim
console.log(user2.name); // Kim

์œ„์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด user2์˜ name ํ”„๋กœํผํ‹ฐ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ฐ์ฒด user2๋Š” ๋ณ€๊ฒฝ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ณ€๊ฒฝํ•˜์ง€๋„ ์•Š์€ ๊ฐ์ฒด user1๋„ ๋™์‹œ์— ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋Š” user1๊ณผ user2๊ฐ€ ๊ฐ™์€ ์–ด๋“œ๋ ˆ์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

  • ๋ถˆ๋ณ€( immutability )์ด๋ž€ ๋ญ˜๊นŒ? ๋‹จ์–ด์—์„œ ์œ ์ถ”ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค์‹œํ”ผ '๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋œป'์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ทธ๋Ÿผ '๋ถˆ๋ณ€ ๊ฐ์ฒด'๋ž€? '๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด' ์ฆ‰ ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€ ์ธ๋ฐ const์™€ Object.freeze()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ป์ด๋‹ค.

โ€‹

โ€‹

[ const ]

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜์ธ const์ด๋‹ค.

ES6 ๋ฌธ๋ฒ•๋ถ€ํ„ฐ let ๊ณผ const๋ฅผ ์ง€์›ํ•œ๋‹ค.

โ€‹

constํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์ผ๊นŒ?

const test = {}; test.name = "apple" console.log(test); // {"apple"}

 

ES6์—์„œ์˜ const๋Š” ํ• ๋‹น๋œ ๊ฐ’์ด ์ƒ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’์ด ์ƒ์ˆ˜๊ฐ€ ๋˜๋Š”, ์ฆ‰ test๋ณ€์ˆ˜๊ฐ€ ์ƒ์ˆ˜๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ test ๋ณ€์ˆ˜์—๋Š” ๊ฐ์ฒด ์žฌํ• ๋‹น์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€‹

์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ์ด์œ ๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ’(๊ฐ์ฒด) ์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜์ธ test๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๊ฒƒ์ด๊ณ 

๊ฐ์ฒด์˜ ์†์ƒ์ด ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ํ•œ ์ด์œ ๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ์€ ๋˜์ง€๋งŒ ({} -> name: "apple") ๊ฐ์ฒด์™€ ๋ณ€์ˆ˜ (test)์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ์€ ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

โ€‹

๋•Œ๋ฌธ์— ๋น„๋ก ์žฌํ• ๋‹น์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•จ์œผ๋กœ ์ธํ•ด ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ๊นŒ์ง€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๊ณ  ํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค.

๋”ฐ๋ผ์„œ Object.freeze()๋ผ๋Š” JS๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๋„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

โ€‹

โ€‹

[Object.freeze()]

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ธ Object.freeze() ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” "๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ"๋ผ๋„ ์ ํ˜€ ์žˆ๋‹ค.

โ€‹

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ? ๋จผ์ € ์ด ๋ฉ”์†Œ๋“œ์˜ ์‚ฌ์šฉ๋ฒ•๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋ฉด,

let test = { name : 'kim' } Object.freeze(test);
 

์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. test๋ณ€์ˆ˜์— key value๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ›„ Object.freeze(test)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”์ธ๋”ฉ๋œ ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.๋•Œ๋ฌธ์— test๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.

โ€‹

 

test.name = 'Jung'; console.log(test) //{name: 'kim'}

์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ฌด์‹œ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Object.freeze()๋Š” ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€‹

test = { age : 15 }; console.log(test); // {age: 15}

์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋•Œ๋ฌธ์— Object.freeze()๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋Ÿผ ๊ฒฐ๊ตญ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋ƒ๋ฉด

โ€‹

const์™€ Object.freeze()๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

(const์˜ ์žฌํ• ๋‹น๋ถˆ๊ฐ€ + Object.freeze()์˜ ๊ฐ์ฒด ์†์„ฑ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)

โ€‹

๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

const test = { 'name' : 'jung' }; Object.freeze(test);

๋จผ์ € const ํ‚ค์›Œ๋“œ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚จ ๋‹ค์Œ, Object.freeze()๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น๊ณผ ๊ฐ์ฒด์˜ ์†์„ฑ ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด

Primitive Type (๊ธฐ๋ณธํ˜• ํƒ€์ž…) / Reference Type (์ฐธ์กฐํ˜• ํƒ€์ž…) โ€‹โ€‹์ด ์žˆ๋‹ค.

โ€‹

โ€‹

[ Primitive Type ]

๊ธฐ๋ณธํ˜•์€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•œ๋‹ค.

  • Number (์ˆซ์ž)
  • String (๋ฌธ์ž)
  • Boolean(๋ถˆ๋ฆฌ์–ธ)
  • null
  • undefined
  • Symbol(ES6์— ์ถ”๊ฐ€, ๊ฐ์ฒด ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…)

โ€‹

[ Reference Type ]

๊ฐ’์ด ์ €์žฅ ๋œ ์ฃผ์†Œ๊ฐ’์„ ํ• ๋‹น

  • Object (๊ฐ์ฒด)
  • Array (๋ฐฐ์—ด)
  • Function (ํ•จ์ˆ˜)
  • Date (๋‚ ์งœ)
  • RegExp(์ •๊ทœํ‘œํ˜„์‹) ๋“ฑ

โ€‹

+ ES6์—์„œ Map, WeakMap, Set, WeakSet ๋“ฑ ์ถ”๊ฐ€๋จ.

๊ฐ์ฒด์˜ ํ•˜์œ„ ๋ถ„๋ฅ˜์— ์†ํ•œ๋‹ค.

โ€‹

โ€‹

[ ๊ธฐ๋ณธํ˜• VS ์ฐธ์กฐํ˜• ]

  • ๊ธฐ๋ณธํ˜•์€ ๋ถˆ๋ณ€์„ฑ์„ ๋›ด๋‹ค.
  • ๊ธฐ๋ณธํ˜•์€ ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Ÿ๊ฐ’์„ ๋ฐ”ํ˜ธ ๋ณต์ œ
  • ์ฐธ์กฐํ˜•์€ ๊ฐ’์ด ๋‹ด์‹  ์ฃผ์†Ÿ๊ฐ’๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๋ณต์ œ

โ€‹

[ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์™œ ํ•„์š”ํ• ๊นŒ? ]

  • ๊ฐ’์„ ์ง€์ •ํ•  ๋•Œ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด
  • ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ ํ•œ ๋ฒˆ์— ์ฝ์–ด ๋“ค์—ฌ์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด
  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด ๋“ค์ธ 2์ง„์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด

JavaScript ํ˜•๋ณ€ํ™˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž…์ด ๋งค์šฐ ์œ ์—ฐํ•œ ์–ธ์–ด๋กœ (Dynamic typing: dynamically type language - Runtime์—์„œ type์ด ์ •ํ•ด์ง)
ํ•„์š”์— ๋”ฐ๋ผ โ‘  ์•”์‹œ์  ๋ณ€ํ™˜ ๋˜๋Š” โ‘ก ๋ช…์‹œ์ ๋ณ€ํ™˜ (๊ฐœ๋ฐœ์ž์˜ ์˜๋„์— ๋”ฐ๋ผ) ์ง„ํ–‰ํ•œ๋‹ค.

 

1. ์•”์‹œ์  ๋ณ€ํ™˜

  • ์‚ฐ์ˆ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์•”์‹œ์  ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    : ๋”ํ•˜๊ธฐ(+) ์—ฐ์‚ฐ์ž๋Š” ์ˆซ์ž๋ณด๋‹ค ๋ฌธ์ž์—ด์ด ์šฐ์„ ์‹œ ๋˜๊ธฐ๋•Œ๋ฌธ์—, ์ˆซ์žํ˜•์ด ๋ฌธ์žํ˜•์„ ๋งŒ๋‚˜๋ฉด ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์—ฐ์‚ฐ๋œ๋‹ค. (๋ฌธ์ž > ์ˆซ์ž)
number + number // number
number + string // string
string + string // string
string + boolean // string
number + boolean // number

50 + 50; //100
100 + “์ ”; //”100์ ”
“100” + “์ ”; //”100์ ”
“10” + false; //”100"
99 + true; //100

2. ๋ช…์‹œ์  ๋ณ€ํ™˜

ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ Object(), Number(), String(), Boolean() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.

1) A Type → Number Type : ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ์ˆซ์žํƒ€์ž…์œผ๋กœ

  • Number()๋Š” ์ •์ˆ˜ํ˜•๊ณผ ์‹ค์ˆ˜ํ˜•์˜ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
Number(“12345”); //12345
Number(“2”*2); //4
  • parseInt()๋Š” ์ •์ˆ˜ํ˜•์˜ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
parseInt(“27”) //27
parseInt(0033); //27
parseInt(0x1b); //27
parseInt(“ 2”); //2
parseInt(“ 2ใ…Ž”); //2
parseInt(“ ใ…Ž2”); //NaN
  • parseFloat()๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    parseInt()์™€๋Š” ๋‹ฌ๋ฆฌ parseFloat()๋Š” ํ•ญ์ƒ 10์ง„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ parseFloat() ๋˜ํ•œ ์•ž๋ถ€๋ถ„ ๋นˆ ๊ณต๋ฐฑ์„ ๋‘๊ณ  ๋‚˜์˜ค๋Š” ๋ฌธ์ž๋Š” ๋ชจ๋‘ ๋ฌด์‹œ๋˜์–ด NaN์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
parseFloat(“!123”); //NaN
parseFloat(“123.123456”); //123.123456
parseInt(“123.123456”); //123
parseFloat(“ 123.123456”); //123.123456
parseFloat(“ a123.123456”); //NaN

2) A Type → String Type : ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ๋ฌธ์ž ํƒ€์ž…์œผ๋กœ

  • String()
String(123); //”123"
String(123.456); //”123.456"
  • toString()๋Š” ์ธ์ž๋กœ ๊ธฐ์ˆ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
var trans = 100;
trans.toString(); //”100"
trans.toString(2); //”1100100"
trans.toString(8); //”144"
  • toFixed()์˜ ์ธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์ธ์ž๊ฐ’๋งŒํผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์†Œ์ˆ˜์ ์„ ํ‘œํ˜„ํ•˜๋ฉฐ ์†Œ์ˆ˜์ ์„ ๋„˜์น˜๋Š” ๊ฐ’์ด ์ธ์ž๋กœ ๋“ค์–ด์˜ค๋ฉด 0์œผ๋กœ ๊ธธ์ด๋ฅผ ๋งž์ถ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
var trans = 123.456789;
var roundOff = 99.987654;
trans.toFixed(); //”123"
trans.toFixed(0); //”123"
trans.toFixed(2); //”123.46"
trans.toFixed(8); //”123.45678900"

3) A Type → Boolean Type : ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ๋ถˆ๋ฆฐ ํƒ€์ž…์œผ๋กœ

Boolean(100); //true
Boolean(“1”); //true
Boolean(true); //true
Boolean(Object); //true
Boolean([]); //true
Boolean(0); //false
Boolean(NaN); //false
Boolean(null); //false
Boolean(undefined); //false
Boolean( ); //false

์ถœ์ฒ˜: https://velog.io/@happyvirusoojin/JavaScript-%ED%8A%B9%EC%84%B1-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
์ถœ์ฒ˜:https://bestalign.github.io/dev/understanding-loose-typing-in-javascript/

์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

[ ์–•์€ ๋ณต์‚ฌ (Shallow copy)]

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋“ฏ์ด, ๊ฐ์ฒด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด calll by reference(๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐ)๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋˜์–ด, ํ•œ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

 

const personq1 = {name:'inyong'}; 

const person2 = person1; 

person1.name = 'jung';

// result 
person2.name // 'jung'

person1 === person2; // true - ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋‘ ๋ณ€์ˆ˜

 

๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜ ๋” ์ƒ์„ฑ๋œ ๊ฒƒ์ด ์•„๋‹Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋ผ์„œ, ๊ฒฐ๊ตญ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

โ€‹

[ ๊นŠ์€ ๋ณต์‚ฌ (Depth copy) ]

ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ณต์œ ๊ฐ€ ์•„๋‹Œ, ๋˜‘๊ฐ™์€ ๊ตฌ์กฐ์˜ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•˜์—ฌ ๋”ฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

โ€‹

์ด๋Ÿด ๋•Œ ์šฐ๋ฆฌ๋Š” '๊นŠ์€ ๋ณต์‚ฌ'๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค.

โ€‹

const person1 = { name : "inyong"}; 

const person2 = Object.assign({}, person1); 

person1.name = "jung"; 

//result 
person2.name // 'inyong' - ์ „ํ˜€ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ, person2์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์Œ.

person1 === person2 // false - ํ˜•ํƒœ๋งŒ ๊ฐ™๊ณ , ๊ฐ์ž ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋‹ค.โ€‹


 

๐Ÿค ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?

ํ˜ธ์ด์ŠคํŒ…

JavaScript์—์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ undefined๋กœ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”. ๋ฐ˜๋ฉด let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ.

ํ˜ธ์ด์ŠคํŒ…์„ ์„ค๋ช…ํ•  ๋• ์ฃผ๋กœ "๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•œ ํ›„, ์„ ์–ธ๋งŒ ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ธฐ๋Š”" ๊ฒƒ์œผ๋กœ ๋งํ•˜๊ณค ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•ž์„œ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ์„ ์–ธ ์ฝ”๋“œ๊นŒ์ง€ ์‹คํ–‰ํ•ด์•ผ ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ๊ฐ€ ๋จ์„ ์ฃผ์˜.

 

์ถœ์ฒ˜:https://developer.mozilla.org/ko/docs/Glossary/Hoisting

 

ํ˜ธ์ด์ŠคํŒ…์˜ ๋Œ€์ƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ES6์—์„œ ๋„์ž…๋œ let, const๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์„ ์–ธ(var, let, const, function, function*, class)์„ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค.  
let/const ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

 foo();
  foo2();

  function foo() { // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ
          console.log("hello");
  }
  var foo2 = function() { // ํ•จ์ˆ˜ํ‘œํ˜„์‹
          console.log("hello2");
  }

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ์œ„์น˜์™€ ๊ด€๊ณ„์—†์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง•์ธ ํ˜ธ์ด์ŠคํŒ…์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ ํ•  ๋•Œ ๋งจ์œ„๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„๋‹ค.

/* ์ •์ƒ ์ถœ๋ ฅ */
function printName(firstname) { // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ 
    var result = inner(); // "์„ ์–ธ ๋ฐ ํ• ๋‹น"
    console.log(typeof inner); // > "function"
    console.log("name is " + result); // > "name is inner value"

    function inner() { // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ 
        return "inner value";
    }
}

printName(); // ํ•จ์ˆ˜ ํ˜ธ์ถœ 

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ์„ ์–ธ๊ณผ ํ˜ธ์ถœ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ •์ƒ์ ์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ๋Š” ์„ ์–ธ๊ณผ ํ• ๋‹น์˜ ๋ถ„๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค.
/* ์˜ค๋ฅ˜ */
 function printName(firstname) { // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ
     console.log(inner); // > "undefined": ์„ ์–ธ์€ ๋˜์–ด ์žˆ์ง€๋งŒ ๊ฐ’์ด ํ• ๋‹น๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ
     var result = inner(); // ERROR!!
     console.log("name is " + result);

     var inner = function() { // ํ•จ์ˆ˜ํ‘œํ˜„์‹ 
         return "inner value";
     }
 }
printName(); // > TypeError: inner is not a function

ํ˜ธ์ด์ŠคํŒ…์€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋Œ์–ด ์˜ฌ๋ ค์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ๋Š” ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„ ๊ทœ์น™์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค.

Q. printName์—์„œ “inner is not defined” ์ด๋ผ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๊ณ , “inner is not a function”์ด๋ผ๋Š” TypeError๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ?

A. printName์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ (Hoisting์— ์˜ํ•ด) inner๋Š” ‘undefined’์œผ๋กœ ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ
inner๊ฐ€ undefined๋ผ๋Š” ๊ฒƒ์€ ์ฆ‰, ์•„์ง์€ ํ•จ์ˆ˜๋กœ ์ธ์‹์ด ๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์„ ์–ธ์ด ํ˜ธ์ถœ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ๋Š” ๊ฒฝ์šฐ

/* ์˜ค๋ฅ˜ */
 function printName(firstname) { // ํ•จ์ˆ˜์„ ์–ธ๋ฌธ
     console.log(inner); // ERROR!!
     let result = inner();  
     console.log("name is " + result);

     let inner = function() { // ํ•จ์ˆ˜ํ‘œํ˜„์‹ 
         return "inner value";
     }
 }

printName(); // > ReferenceError: inner is not defined

console.log(inner);์—์„œ inner์— ๋Œ€ํ•œ ์„ ์–ธ์ด ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— inner is not defined ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ

ํ˜ธ์ด์ŠคํŒ… ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•  ์ 

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•จ.

  • ํ˜ธ์ด์ŠคํŒ…์„ ์ œ๋Œ€๋กœ ๋ชจ๋ฅด๋”๋ผ๋„ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๊ธ‰์  ์ฝ”๋“œ ์ƒ๋‹จ๋ถ€์—์„œ ์„ ์–ธํ•˜๋ฉด, ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ์ธํ•œ ์Šค์ฝ”ํ”„ ๊ผฌ์ž„ ํ˜„์ƒ์€ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    var๋ฅผ ์“ฐ๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์™œ var์™€ ํ˜ธ์ด์ŠคํŒ…์„ ์ดํ•ดํ•ด์•ผ ํ• ๊นŒ?
  • ES6๋ฅผ ์–ด๋””์„œ๋Š” ์“ธ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์•„์ง ์‹œ๊ฐ„์ด ๋” ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ES5๋กœ ํŠธ๋žœ์Šค ์ปคํŒŒ์ผ์„ ํ•ด์•ผํ•œ๋‹ค.
    ์œ„์˜ ์ด์œ ๋กœ ์•„์ง์€ var๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์Šค์ฝ”ํ”„

  • ์Šค์ฝ”ํ”„(scope)๋Š” ์‹๋ณ„์ž(ex. ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช…, ํด๋ž˜์Šค๋ช… ๋“ฑ)์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๋œปํ•˜๋ฉฐ, ์„ ์–ธ๋œ ์œ„์น˜์— ๋”ฐ๋ผ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ์ „์—ญ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ, ์ง€์—ญ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์–ด๋””์—์„œ๋“ ์ง€ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋‹ค. ๋ฐ˜๋ฉด, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด ๋‚ด๋ถ€๋ฅผ ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ž์‹ ์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„์™€ ๊ทธ ํ•˜์œ„ ์ง€์—ญ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•˜๋‹ค.
  • ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก(if, for, while, try/catch ๋“ฑ)์ด ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค๋ฉฐ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์˜ค๋กœ์ง€ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ์„ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•œ๋‹ค. ์ด๋ฅผ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ผ ํ•œ๋‹ค.
var a = 1

if (true) {
  var a = 5
}

console.log(a) // output: 5

ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ณณ์—์„œ var ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด a๋ฅผ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ๊ธฐ์กด์— ์žˆ๋˜ a ๋ณ€์ˆ˜๊ฐ€ ์ค‘๋ณต ์„ ์–ธ๋˜๋ฉด์„œ, ์ตœํ•˜๋‹จ์˜ console์—์„œ๋„ ์ถœ๋ ฅ ๊ฐ’์ด 5๋กœ ๋ฐ”๋€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์˜ˆ์ œ๋Š” ์ฝ”๋“œ๊ฐ€ ์งง์•„์„œ ์–ด๋””์—์„œ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚œ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ธํ•ด ์žฌํ• ๋‹น์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์— ๋™์ผํ•œ ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋กœ์ง€ ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ์„ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•˜๋Š” var ๋Œ€์‹ , ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•˜๋Š” const์™€ let์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์ด๋‹ค. (ECMAScript ๋ช…์„ธ์— ์ •์˜๋˜์–ด ์žˆ์Œ)

์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๊ทธ๋Ÿฐ ๊ทœ์ •์ด ์—†์ง€๋งŒ, ๋ณ€์ˆ˜๋ฅผ ๊ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์—ฐ๊ด€๋œ ๊ฐ์ฒด(call object)์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ค ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ํ•ด๋‹น ์ฝ”๋“œ์˜ ์œ ํšจ ๋ฒ”์œ„(in scope) ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์˜ ์ฒด์ธ, ๋ฆฌ์ŠคํŠธ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€์ˆ˜ ๊ฐ’์„ ์–ป์œผ๋ ค๊ณ  ํ•  ๋•Œ(variable resolution, ๋ณ€์ˆ˜ ํ•ด์„) ์Šค์ฝ”ํ”„ ์ฒด์ธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค. ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์œ„์—์„œ ๋งํ–ˆ๋‹ค์‹œํ”ผ ๊ฐ์ฒด์˜ ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ, ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ณ , ์—†์œผ๋ฉด ๊ทธ ๋‹ค์Œ ๊ฐ์ฒด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ณ , ์—ฌ๊ธฐ๋„ ์—†์œผ๋ฉด ๊ทธ ๋‹ค์Œ ๊ฐ์ฒด์—์„œ ์ฐพ๋Š” ์‹์ด๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ๋„ ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด reference error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ตœ์ƒ์œ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ(์–ด๋– ํ•œ ํ•จ์ˆ˜์—๋„ ์†ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ)์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์—๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์žˆ๊ณ , ๊ทธ๊ฒƒ์ด ์ „์—ญ ๊ฐ์ฒด์ด๋‹ค. ์ค‘์ฒฉ๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ 2๊ฐœ์˜ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ํ•˜๋‚˜๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ „์—ญ ๊ฐ์ฒด๋‹ค.

 

ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ, ํ•จ์ˆ˜๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ์ €์žฅํ•œ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ํ•จ์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘” ์Šค์ฝ”ํ”„ ์ฒด์ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.


๋ณ€์ˆ˜ ์€๋‹‰ํ™”

(function () {
  var a = 'a';
})();

console.log(a); // a is not defined

 

ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ a๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด, ์•„์ง ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค(a is not defined)๋Š” ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹๊ณผ ๊ฐ™์ด ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๊ฒƒ์„ ์€๋‹‰ํ™”๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์€๋‹‰ํ™”๊ณผ์ •์„ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 ํด๋กœ์ €๋ฅผ ํ†ตํ•œ ์€๋‹‰ํ™”

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ prototype๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ฐ์ฒด ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์†์„ฑ์„ ์ƒ์„ฑํ•  ๋•Œ this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Prototype์„ ํ†ตํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ์˜ ์ฃผ์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Private variables์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ๋ฌธ์ œ์ด๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด๋„๋ก ํ•˜์ž.

function Hello(name) {
  this._name = name;
}

Hello.prototype.say = function() {
  console.log('Hello, ' + this._name);
}

let a = new Hello('์˜์„œ');
let b = new Hello('์•„๋ฆ„');

a.say() //Hello, ์˜์„œ
b.say() //Hello, ์•„๋ฆ„

a._name = 'anonymous'
a.say() // Hello, anonymous

ํ˜„์žฌ Hello() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์€ ๋ชจ๋‘ _name์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋ณ€์ˆ˜๋ช… ์•ž์— underscore(_)๋ฅผ ํฌํ•จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ JavaScript ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ƒ๊ฐํ•ด ๋ดค์„๋•Œ ์ด ๋ณ€์ˆ˜๋Š” Private variable์œผ๋กœ ์“ฐ๊ณ ์‹ถ๋‹ค๋Š” ์˜๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์—ฌ์ „ํžˆ ์™ธ๋ถ€์—์„œ๋„ ์‰ฝ๊ฒŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ง์ ‘์ ์œผ๋กœ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์บก์Šํ™”(์€๋‹‰ํ™”)ํ•  ์ˆ˜ ์žˆ๋‹ค.

function hello(name) {
  let _name = name;
  return function () {
    console.log('Hello, ' + _name);
  };
}

let a = new hello('์˜์„œ');
let b = new hello('์•„๋ฆ„');

a() //Hello, ์˜์„œ
b() //Hello, ์•„๋ฆ„

์ด๋ ‡๊ฒŒ a์™€ b๋ผ๋Š” ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ํ•จ์ˆ˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

function a(){
  let temp = 'a' 
  
  return temp;
} 

// console.log(temp)  error: temp is not defined
const result = a()
console.log(result); //a

ํ˜„์žฌ ์œ„ ํ•จ์ˆ˜ ๋‚ด๋ถ€์ ์œผ๋กœ ์„ ์–ธ๋œ temp์—๋Š” ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ํ•จ์ˆ˜ a๋ฅผ ์‹คํ–‰์‹œ์ผœ ๊ทธ ๊ฐ’์„ result๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ temp์˜ ๊ฐ’์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜ ์•ˆ์— ๊ฐ’์„ ์ˆจ๊ธฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.


 Temporal Dead Zone(TDZ)

Temporal Dead Zone(TDZ)์ด๋ž€?

์„ ์–ธ ์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋น„ ํ—ˆ์šฉํ•˜๋Š” ๊ฐœ๋…์ƒ์˜ ๊ณต๊ฐ„์ด๋‹ค.
const ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์ž. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์ดˆ๊ธฐํ™” ํ•˜๋ฉด ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

const white = '#FFFFFF';

white; // => '#FFFFFF'

์ด๋ฒˆ์—๋Š” ์„ ์–ธ ์ „์— white ๋ณ€์ˆ˜์— ์ ‘๊ทผ

white; // throws `ReferenceError`
const white = '#FFFFFF';

white; // => '#FFFFFF'

const white ='#FFFFFF' ๊ตฌ๋ฌธ ์ „ ์ค„ ๊นŒ์ง€, white ๋ณ€์ˆ˜๋Š” TDZ์— ์žˆ๋‹ค.
TDZ์— ์žˆ๋Š” white ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด, ReferenceError: Cannot access 'white' before initialization ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

TDZ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ตฌ๋ฌธ

 

ํ˜„์žฌ ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ TDZ ๋™์ž‘

TDZ๋Š” ์„ ์–ธ๋ฌธ์ด ์กด์žฌํ•˜๋Š” ์Šค์ฝ”ํ”„ ๋ฒ”์œ„ ์•ˆ์—์„œ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค€๋‹ค.


let, const, var, function ์›๋ฆฌ

[ var ]

es6 ์ด์ „์• ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ var๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์˜€๋‹ค.

โ€‹

var์˜ ๊ฒฝ์šฐ์—” function ๋‹จ์œ„์˜ scope๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ํ•จ์ˆ˜์•ˆ์—์„œ๋งŒ ์„ ์–ธ ๋  ๊ฒฝ์šฐ์— scope๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

if๋‚˜ for๋ฌธ์•ˆ์—์„œ var๋ฅผ ์„ ์–ธํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” scope๋ฅผ if๋‚˜ for๊ฐ€ ์•„๋‹Œ ์ƒ์œ„์˜ ํ•จ์ˆ˜(์—†์œผ๋ฉด ์ „์—ญ)๋ฅผ scope๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

function func() { 
var a = 1; // func scope 
}
console.log(a) // error

for(var i =0; i<10;i++) {
var b = 2; // ์ „์—ญ scope 
}
console.log(b) // 2

 

b๊ฐ€ scope๊ฐ€ ์ „์—ญ์œผ๋กœ ์„ค์ •์ด ๋˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

โ€‹

function scope์™€ ํ˜ธ์ด์ŠคํŒ… ๊ฐœ๋…์ด ๋งŒ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋™์ž‘๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.(์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง„ ์•Š๋Š”๋‹ค.

var b;
function func() {
	var a; a = 1; 
} 
console.log(a) // error 
for(var i =0; i<10;i++) {
	b = 2;
}
console.log(b) // 2

โ€‹

[ let, const ]

let๊ณผ const๋Š” es6 ์ดํ›„์— ์„ ์–ธ ๋˜์—ˆ๋‹ค.

์œ„์— ์ฒ˜๋Ÿผ ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ํ—ท๊ฐˆ๋ฆด ๋งŒํ•œ ์š”์†Œ๊ฐ€ ๋งŽ์•„ block scope๋กœ ์„ค์ •๋˜์—ˆ๋‹ค.

block scope๋Š” ์ค‘๊ด„ํ˜ธ ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ์„ค์ •๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋กœ์ธํ•ด for๋ฌธ๊ณผ if๋ฌธ์•ˆ์—์„œ ์„ ์–ธํ•  ๊ฒฝ์šฐ์—๋Š” if๋ฌธ๊ณผ for๋ฌธ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋กœ ์„ค์ •์ด ๋œ๋‹ค.

โ€‹

const b = 1; for(var i =0; i<10; i++) { coonsole.log(b) // error const b = 2; }
const b = 1;
for(var i =0; i<10; i++) {
	coonsole.log(b) // error
	const b = 2; 
}

[ let, const๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋‚˜์š”? ]

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด, const, let ์—์„  ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

ํ•˜์ง€๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ๊ฐœ๋…์€ ๊ฒฐ๊ตญ ์‹คํ–‰์ปจํ…์ŠคํŠธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ž„์œผ๋กœ const, let, var ๋ชจ๋‘ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์™œ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฑธ๊นŒ?

์ด๋Š” const์™€ let์˜ ๊ฐ’ ํ• ๋‹น ์‹œ์ ์ด var์™€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โ€‹

์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋œ๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ > ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” > ๋ณ€์ˆ˜ ๊ฐ’ ํ• ๋‹น

โ€‹

var ์˜ ๊ฒฝ์šฐ๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค.

์ด๋ง์ธ ์ฆ‰ ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋Š”๋ฐ ํ• ๋‹น์ด ๋˜๊ธฐ ์ด์ „์˜ ์ƒํƒœ๋กœ undefiend์ƒํƒœ๋กœ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

โ€‹

๊ทธ๋Ÿฌ๋‚˜ let๊ณผ const๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋ณ€์ˆ˜์˜ ์„ ์–ธ๋งŒ ์ธ์ •๋˜์–ด ์‹คํ–‰ ์ปจํƒ์ŠคํŠธ์—๋Š” ๋‹ด๊ธฐ๊ฒŒ ๋˜๋‚˜ (ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค.) ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์ด์ „์— console ๋กœ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋˜๋ฉด error๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

โ€‹

[ ๊ฒฐ๋ก  ]

var

  • function scope
  • ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค
  • ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰

โ€‹

let, const

  • pblock scope
  • ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค
  • ๋ณ€์ˆ˜์˜ ์„ ์–ธ๋งŒ ์ผ์–ด๋‚œ๋‹ค. ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

 

[ ํ•จ์ˆ˜ ์‹คํ–‰์— ๋Œ€ํ•œ ์ดํ•ด ]

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๋‹จ 1๊ฐœ์˜ ๋™์‹œ์„ฑ๋งŒ ๋‹ค๋ฃจ๋Š” ์–ธ์–ด
    • ํ•œ๋ฒˆ์— 1๊ฐœ์˜ ์ž‘์—…๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
    • JS์˜ Heap Queue Stack => ํฌ๋กฌ์˜ V8 ๋‚ด๋ถ€์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

โ€‹

  1. ์ฝœ์Šคํƒ CallStack
  • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๊ธฐ๋กํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ์œ„์น˜ํ•œ ๊ณณ
  • ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ์Šคํƒ์— push ๋œ๋‹ค.
  • ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ ๋ฐ›์„ ๋•Œ, ์Šคํƒ์—์„œ pop๋œ๋‹ค.

โ€‹

2. ํž™ Heap

  • ์˜ค๋ธŒ์ ํŠธ(๊ฐ์ฒด)๋“ค์€ ํž™ ๋‚ด๋ถ€์— ํ• ๋‹น
  • ๊ฑฐ์˜ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ์˜์—ญ(unsteuctured)์˜ ๋ฉ”๋ชจ๋ฆฌ
  • ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด๋“ค์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚จ

โ€‹

3. ํ Queue

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ๋ฉ”์„ธ์ง€ ํ
    • ์‹คํ–‰๋  ์ฝœ๋ฐฑํ•จ์ˆ˜๋‚˜ ์‹คํ–‰๋  ๋ฉ”์„ธ์ง€๋“ค์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ
  • ์Šคํƒ์ด ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„(capacity)๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๋•Œ, ๋ฉ”์„ธ์ง€๋Š” ํ ๋ฐ–์œผ๋กœ ๋‚˜์˜ค๊ณ  ๋ฉ”์„ธ์ง€๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ•จ์ˆ˜ ๋ชฉ๋ก๋“ค์ด ์‹คํ–‰๋œ๋‹ค. -> ์ดˆ๊ธฐ ์Šคํƒ ํ”„๋ ˆ์ž„
  • ์Šคํƒ์ด ๋‹ค์‹œ ๋นŒ ๋•Œ ๋ฉ”์„ธ์ง€ ์ˆ˜ํ–‰๋„ ๋๋‚œ๋‹ค.
  • ์ด๋ฒคํŠธ๋“ค์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ œ๊ณต๋˜์—ˆ๋‹ค๋ฉด ๋ฉ”์„ธ์ง€๋“ค์€ ์™ธ๋ถ€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋“ค์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ์— ์Œ“์ธ๋‹ค.
  • ์™ธ๋ถ€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋“ค์ด๋ž€ ๋งˆ์šฐ์Šค ํด๋ฆญ, HTTP์š”์ฒญ ๋“ฑ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์ผ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๋„ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์–ด๋– ํ•œ ๋ฉ”์‹œ์ง€๋„ ํ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€๋“ค์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ธ์ œ๋“  ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ถ”๊ฐ€ ๋œ๋‹ค.

โ€‹

โ€‹

[ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ]

  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” scope, hoistiong, this, function, closure ๋“ฑ์˜ ๋™์ž‘์›๋ฆฌ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ์›๋ฆฌ์ด๋‹ค.
  • ESMAScript ์ŠคํŽ™์— ๋”ฐ๋ฅด๋ฉด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ํ˜•์„ฑํ™”ํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค.์ข€ ๋” ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
  • ์ „์—ญ ์ฝ”๋“œ : ์ „์—ญ ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ
  • Eval ์ฝ”๋“œ : eval ํ•จ์ˆ˜๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
  • ํ•จ์ˆ˜ ์ฝ”๋“œ : ํ•จ์ˆ˜ ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ์ „์—ญ ์ฝ”๋“œ์™€ ํ•จ์ˆ˜ ๋‚ด ์ฝ”๋“œ์ด๋‹ค.

eval ํ•จ์ˆ˜ :

eval()์€ ์ „์—ญ ๊ฐ์ฒด์˜ ํ•จ์ˆ˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

eval()์˜ ์ธ์ž๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ธ์ž๊ฐ€ ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด eval()์€ ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ JavaScript ๋ช…๋ น๋ฌธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ๋ชจ๋‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์‹์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด eval()์„ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฐ์‚ฐ์‹์„ ์•Œ์•„์„œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

โ€‹

โ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‹คํ–‰์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์‹คํ–‰์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ž€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • ๋ณ€์ˆ˜ : ์ „์—ญ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ
  • ํ•จ์ˆ˜ ์„ ์–ธ
  • ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„(Scope)
  • this

์ด์™€ ๊ฐ™์ด ์‹คํ–‰์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํ˜•์ƒํ™”ํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌผ๋ฆฌ์  ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์ปจํŠธ๋กค์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ์ด๋™ํ•˜๋ฉด ๋…ผ๋ฆฌ์  ์Šคํƒ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ์ƒ์„ฑ๋œ๋‹ค. ์Šคํƒ์€ LIFO(Last In First Out, ํ›„์ž… ์„ ์ถœ)์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋‚˜์—ด ๊ตฌ์กฐ์ด๋‹ค.
  • ์ „์—ญ ์ฝ”๋“œ(Global code)๋กœ ์ปจํŠธ๋กค์ด ์ง„์ž…ํ•˜๋ฉด ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ์Œ“์ธ๋‹ค. ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ(์›น ํŽ˜์ด์ง€์—์„œ ๋‚˜๊ฐ€๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์„ ๋•Œ)๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ์ง์ „์— ์‹คํ–‰๋œ ์ฝ”๋“œ ๋ธ”๋ก์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์œ„์— ์Œ“์ธ๋‹ค.
  • ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ํŒŒ๊ธฐํ•˜๊ณ  ์ง์ „์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์ปจํŠธ๋กค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋Š๋‚€์ 

- ๋‚˜๋ฆ„  js๋ฅผ ์จ๋ดค๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋™์ž‘์›๋ฆฌ๋‚˜ ์„ธ๋ถ€์ ์ธ ์˜ค๋ฅ˜ ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณธ์ ์ด ์—†์—ˆ๋‹ค.

- js๋ฅผ ์“ฐ๋ฉด์„œ ์–ด๋– ํ•œ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ์กฐ๊ธˆ์€ ๋” ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

 

[์ถœ์ฒ˜] ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?|์ž‘์„ฑ์ž ์€๋‘ฅ์ด

์ถœ์ฒ˜: https://velog.io/@mmzgpgp/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EA%B3%BC-TDZ%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

๋ฐ˜์‘ํ˜•