[πŸ“’JS ] μžλ°”μŠ€ν¬λ¦½νŠΈ 기초

μ‚¬μš”Β·2024λ…„ 9μ›” 2일
0

☁️ kakao x goorm DEEP DIVE

λͺ©λ‘ 보기
3/3
post-thumbnail

Console 객체

λΈŒλΌμš°μ €μ˜ 디버깅 μ½˜μ„€μ— μ ‘κ·Όν•  수 μžˆλŠ” λ©”μ„œλ“œ 제곡.
λΈŒλΌμš°μ§• λ¬Έλ§₯μ—μ„œλŠ” Window, μ›Œμ»€μ—μ„œλŠ” WorkerGlobalScope μ†μ„±μœΌλ‘œ 포함

var, let, const

var

  • ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ : μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정, μ½”λ“œ 블둝 λ‚΄μ—μ„œ 선언해도 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€.
  • 쀑볡 μ„ μ–Έκ³Ό μž¬ν• λ‹Ή κ°€λŠ₯

let

  • 블둝 레벨 μŠ€μ½”ν”„ : λͺ¨λ“  μ½”λ“œλΈ”λ‘ ( if, for, while, try/catchλ¬Έ ) 을 μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정
  • 쀑볡 선언은 λΆˆκ°€, μž¬ν• λ‹Ή κ°€λŠ₯

const

  • λΈ”λ‘λ ˆλ²¨ μŠ€μ½”ν”„ : λͺ¨λ“  μ½”λ“œλΈ”λ‘ ( if, for, while, try/catchλ¬Έ ) 을 μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정
  • 쀑볡 μ„ μ–Έκ³Ό μž¬ν• λ‹Ή λͺ¨λ‘ λΆˆκ°€

ν˜Έμ΄μŠ€νŒ…

λ³€μˆ˜ 선언문이 μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” 것

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

var

  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜ 선언문이 μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘
  • β€œμ„ μ–Έ 단계”와 β€œμ΄ˆκΈ°ν™” 단계”가 λ™μ‹œμ— μ§„ν–‰
  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜ μ„ μ–Έλ¬Έ 이전에 μ°Έμ‘°ν•  수 μžˆλ‹€.
// 이 μ‹œμ μ—λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ 이미 foo λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€(1. μ„ μ–Έ 단계)
// λ³€μˆ˜ fooλŠ” undefined둜 μ΄ˆκΈ°ν™”λœλ‹€. (2. μ΄ˆκΈ°ν™” 단계)
console.log(foo); // undefined

// λ³€μˆ˜μ— 값을 ν• λ‹Ή(3. ν• λ‹Ή 단계)
foo = 123;

console.log(foo); // 123

// λ³€μˆ˜ 선언은 λŸ°νƒ€μž„ 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ μ‹€ν–‰λœλ‹€.
var foo;

let / const

  • λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘
  • β€œμ„ μ–Έ 단계”와 β€œμ΄ˆκΈ°ν™” 단계”가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰
  • 선언은 λŸ°νƒ€μž„ 이전에 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ μ΄ˆκΈ°ν™”λŠ” λ³€μˆ˜ 선언문에 λ„λ‹¬ν–ˆμ„ λ•Œ μ‹€ν–‰.
  • μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점 ~ μ΄ˆκΈ°ν™” μ „κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ”(referenceError) ꡬ간 β‡’ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ TDZ
// λŸ°νƒ€μž„ 이전에 μ„ μ–Έ 단계가 μ‹€ν–‰λœλ‹€. 아직 λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜λ‹€.
// μ΄ˆκΈ°ν™” μ΄μ „μ˜ μΌμ‹œμ  사각 μ§€λŒ€μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.
console.log(foo); // ReferenceError: foo is not defined

let foo; // λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ μ΄ˆκΈ°ν™” 단계가 μ‹€ν–‰λœλ‹€.
console.log(foo); // undefined

foo = 1; // ν• λ‹Ήλ¬Έμ—μ„œ ν• λ‹Ή 단계가 μ‹€ν–‰λœλ‹€.
console.log(foo); // 1

κ²°λ‘ 

πŸ—¨οΈ ꢌμž₯ κ°€μ΄λ“œλΌμΈ

  • ES6 λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ var ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ κ²½μš°μ— ν•œμ •ν•΄ let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. μ΄λ•Œ λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ΅œλŒ€ν•œ 쒁게 λ§Œλ“ λ‹€.
  • 변경이 λ°œμƒν•˜μ§€ μ•Šκ³  읽기 μ „μš©μœΌλ‘œ μ‚¬μš©ν•˜λŠ”(μž¬ν• λ‹Ήμ΄ ν•„μš” μ—†λŠ” μƒμˆ˜)μ›μ‹œ κ°’κ³Ό κ°μ²΄μ—λŠ” const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. const ν‚€μ›Œλ“œλŠ” μž¬ν• λ‹Ήμ„ κΈˆμ§€ν•˜λ―€λ‘œ var, let ν‚€μ›Œλ“œλ³΄λ‹€ μ•ˆμ „ν•˜λ‹€.

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ μ„ μ–Έλ¬Έ

ν•¨μˆ˜ 선언문은 μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 λ©”λͺ¨λ¦¬μ— 미리 λ‘œλ“œ
=> ν•¨μˆ˜κ°€ μ½”λ“œμ—μ„œ μ„ μ–Έλ˜κΈ° 전에 ν˜ΈμΆœλ˜λ”λΌλ„ 였λ₯˜κ°€ λ°œμƒ x

// ν•¨μˆ˜ 호좜이 ν•¨μˆ˜ 선언문보닀 μœ„μ— 있음
greet(); // 'Hello, world!' 좜λ ₯

function greet() {
 console.log('Hello, world!');
}

ν•¨μˆ˜ ν‘œν˜„μ‹

λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” λ°©μ‹μœΌλ‘œ, μ„ μ–ΈλΆ€κ°€ ν˜Έμ΄μŠ€νŒ…λ˜λ”λΌλ„ ν• λ‹Ήλœ ν•¨μˆ˜ μžμ²΄λŠ” ν˜Έμ΄μŠ€νŒ…λ˜μ§€ x

// ν•¨μˆ˜ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•œ 경우
sayHello(); // ReferenceError: Cannot access 'sayHello' before initialization

let sayHello = function() {
  console.log('Hello!');
};
  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ: μ„ μ–Έ μœ„μΉ˜μ™€ 상관없이 μ½”λ“œ μ‹€ν–‰ 전에 λ©”λͺ¨λ¦¬μ— λ“±λ‘λ˜μ–΄ 호좜 κ°€λŠ₯.
  • ν•¨μˆ˜ ν‘œν˜„μ‹: λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…λ§Œ λ°œμƒν•˜κ³ , ν•¨μˆ˜ 할당이 μ‹€ν–‰ μ‹œμ μ— 이루어짐.

μžλ°”μŠ€ν¬λ¦½νŠΈ νƒ€μž…

  • μ›μ‹œ νƒ€μž… : Boolean, String, Number, Null, Undefined, Symbol
  • μ°Έμ‘° νƒ€μž… : Object, Array

기본적으둜 μ›μ‹œ νƒ€μž… 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ Call Stack λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜μ§€λ§Œ,
μ°Έμ‘° νƒ€μž…μ˜ 경우 Heap μ΄λΌλŠ” λ³„λ„μ˜ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•œλ‹€.
이 κ²½μš°μ— Call Stack 은 개체 및 λ°°μ—΄ 값이 μ•„λ‹Œ Heap λ©”λͺ¨λ¦¬ μ°Έμ‘° IDλ₯Ό κ°’μœΌλ‘œ μ €μž₯

동적 νƒ€μž… μ–Έμ–΄

JSλŠ” 미리 μ„ μ–Έν•œ νƒ€μž…μ˜ κ°’λ§Œ ν• λ‹Ή ν•  수 μžˆλŠ” 것이 μ•„λ‹Œ,
μ–΄λ– ν•œ 데이터 νƒ€μž…μ˜ 값이라도 자유둭게 ν• λ‹Ήν•  수 μžˆλ‹€.

  • 값을 ν• λ‹Ήν•˜λŠ” μ‹œμ μ— λ³€μˆ˜μ˜ νƒ€μž…μ΄ λ™μ μœΌλ‘œ κ²°μ •λ˜κ³  νƒ€μž…μ„ μ–Έμ œλ“ μ§€ 자유둭게 λ³€κ²½ν•  수 μžˆλ‹€.
  • 선언이 μ•„λ‹Œ 할당에 μ˜ν•΄ νƒ€μž…μ΄ κ²°μ •(νƒ€μž… μΆ”λ‘ ) λœλ‹€.
  • μž¬ν• λ‹Ήμ— μ˜ν•΄ λ³€μˆ˜μ˜ νƒ€μž…μ€ μ–Έμ œλ“ μ§€ λ™μ μœΌλ‘œ λ³€ν•  수 μžˆλ‹€. β‡’ 동적 타이핑
  • λ³€μˆ˜λŠ” νƒ€μž…μ„ κ°€μ§€μ§€ μ•Šμ§€λ§Œ, 값은 νƒ€μž…μ„ κ°–λŠ”λ‹€. λ³€μˆ˜λŠ” 값에 λ¬Άμ—¬μžˆλŠ” 값에 λŒ€ν•œ 별λͺ…일뿐이닀.

νƒ€μž… λ³€ν™˜

  • λͺ…μ‹œμ  νƒ€μž…λ³€ν™˜ / νƒ€μž… μΊμŠ€νŒ… : κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것
  • 암묡적 νƒ€μž…λ³€ν™˜ / νƒ€μž… κ°•μ œλ³€ν™˜ : 개발자의 μ˜λ„μ™€ 상관없이 ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 JS엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜λŠ” 것

=> λ‘˜ λ‹€ κΈ°μ‘΄ μ›μ‹œ 값을 직접 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.
=> νƒ€μž… λ³€ν™˜μ΄λž€ κΈ°μ‘΄ μ›μ‹œ 값을 μ‚¬μš©ν•΄ λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•˜λŠ” 것이닀.

암묡적 νƒ€μž…λ³€ν™˜

λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜

λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž + κ°€ ν™œμš©λœ ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κΈ° μœ„ν•΄μ„œ ν”Όμ—°μ‚°μžλ₯Ό λͺ¨λ‘ λ¬Έμžμ—΄λ‘œ 암묡적 νƒ€μž…λ³€ν™˜

// 숫자 νƒ€μž…
0 + ''              // "0"
  -0 + ''             // "0"
1+ ''               // "1"
  -1 + ''             // "-1"
NaN + ''            // "NaN"
Infinity + ''       // "Infinity"
  -Infinity + ''      // "-Infinity"

// boolean νƒ€μž…
true + ''           // "true"
false + ''          // "false"

// null νƒ€μž…
null + ''           // "null"

// undefined νƒ€μž…
undefined + ''      // "undefined"

// μ‹¬λ²Œ νƒ€μž…
(Symbol()) + ''     // "TypeError"

// 객체 νƒ€μž…
({}) + ''           // "[object Object]"
Math + ''           // "[object Math]"
[] + ''             // ""
[10, 20] + ''       // "10, 20"
(function(){}) + '' // "function()"
Array + ''          // "function Array() {[native code]}"

숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜

μ‚°μˆ  μ—°μ‚°μž ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κΈ° μœ„ν•΄ μ‚°μˆ  μ—°μ‚°μžμ˜ ν”Όμ—°μ‚°μž μ€‘μ—μ„œ 숫자 νƒ€μž…μ΄ μ•„λ‹Œ ν”Όμ—°μ‚°μžλ₯Ό 숫자 νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜

// 숫자 νƒ€μž…
+''               // 0
+'0'              // 0
+'1'              // 1
+'string'         //  NaN

// boolean νƒ€μž…
+true             //  1
+false            //  0

// null νƒ€μž…
+null             //  0

// undefined νƒ€μž…
+undefined        //  NaN

// μ‹¬λ²Œ νƒ€μž…
+Symbol()         //  TypeError

// 객체 νƒ€μž…
+{}               //  NaN
+[]               //  0
+[10, 20]         //  NaN
+(function(){})   //  NaN

객체와 빈 배열이 μ•„λ‹Œ λ°°μ—΄, undefinedλŠ” λ³€ν™˜λ˜μ§€ μ•Šμ•„ NaN이 λœλ‹€λŠ” 것에 주의

λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜

μ‘°κ±΄μ‹μ˜ 평가 κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜

if(' ') console.log('1'); //λΉˆλ¬Έμžμ—΄μ€ Falsyν•œ κ°’
if(true) console.log('2');
if(0) console.log('3');		//0은 Falsyν•œ κ°’
if('str') console.log('4'); //λ¬Έμžμ—΄μ€ Truthyν•œ κ°’
if(null) console.log('5');	//null은 Falsyν•œ κ°’

πŸ’‘ false둜 ν‰κ°€λ˜λŠ” Falsy κ°’

  • false
  • undefined
  • null
  • 0, -0
  • NaN
  • β€˜ β€˜ (빈 λ¬Έμžμ—΄)

β‡’ Falsy κ°’ μ™Έμ˜ λͺ¨λ“  값은 λͺ¨λ‘ true둜 ν‰κ°€λ˜λŠ” Truthy 값이닀.

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜

  1. String μƒμ„±μž ν•¨μˆ˜λ₯Ό newμ—°μ‚°μž 없이 호좜
//숫자->λ¬Έμžμ—΄νƒ€μž…
String(1);		//-> '1'
String(NaN);		//-> 'NaN'

//λΆˆλ¦¬μ–Έ νƒ€μž… -> λ¬Έμžμ—΄νƒ€μž…
String(true) 		//->'true'
String(false)		//->'false'
  1. Object.prototype.toString λ©”μ„œλ“œ μ‚¬μš© ->Β toString()
  //숫자->λ¬Έμžμ—΄νƒ€μž…
  (1).toString();	//-> '1'
  (NaN).toString();	//-> 'NaN'

  //λΆˆλ¦¬μ–Έ -> λ¬Έμžμ—΄νƒ€μž…
  (true).toString();	//-> 'true'
  (false).toString();	//-> 'false'
  1. +(λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž) 이용
  //숫자 -> λ¬Έμžμ—΄ νƒ€μž…
  1 + ''; 	//-> '1'
  //λΆˆλ¦¬μ–Έ -> λ¬Έμžμ—΄ νƒ€μž…
  true + '' //'true'

λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜

  1. Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜
 //λ¬Έμžμ—΄ -> λΆˆλ¦¬μ–Έ
  Boolean('x');			//true
  Boolean(' ');			//false
  Boolean('false');		//true
  1. ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό λ‘λ²ˆ μ‚¬μš©
  //λ¬Έμžμ—΄ -> λΆˆλ¦¬μ–Έ
  !!'x';			//true
  !!' ';			//false
    //숫자 -> λΆˆλ¦¬μ–Έ
  !!0;				//false
  !!1;				//true
  !!NaN;			//false
  !!Infinity		//true

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—°μ‚° 및 Math Object

Template literals

λ°±ν‹± ``` 을 μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ ν‘œν˜„ν•œ 것
μ€„λ°”κΏˆμ„ μ‰½κ²Œν•  수 있고, 내뢀에 ν‘œν˜„μ‹μ„ 포함할 수 있게 λœλ‹€.

Loops

μ—…λ‘œλ“œμ€‘..

profile
ν•˜λ£¨ν•˜λ£¨ λ‚˜μ•„κ°€λŠ” μƒˆμ‹Ή 개발자 🌱

0개의 λŒ“κΈ€