javascript in depth all you need to know about expressions statements and expression statements - Lee-hyuna/33-js-concepts-kr GitHub Wiki

Javascript의 Expressions, Statements 및 Expression Statements에 λŒ€ν•΄ μ•Œμ•„μ•Ό ν•  λͺ¨λ“  것

원문: All you need to know about Javascript's Expressions, Statements and Expression Statements

이 ν¬μŠ€νŒ…μ„ 닀보고 λ‚˜λ©΄ μ•„λž˜ μ½”λ“œκ°€ μž‘λ™ν•˜λŠ” 방식과 μž‘λ™ 원리에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ… ν•  수 μžˆμ–΄μ•Όν•œλ‹€.

{} + 1 // 1
{2} + 2 // 2
{2+2} + 3 // 3
{2+2} - 3 // -3

Javascriptμ—λŠ” 크게 두 가지 문법 μΉ΄ν…Œκ³ λ¦¬κ°€ μžˆλ‹€.

  1. Statements (ꡬ문)
  2. Expressions (ν‘œν˜„μ‹)

ν‘œν˜„μ‹μ€ ꡬ문처럼 λ™μž‘ ν•  수 μžˆκΈ°μ— ꡬ별 ν•˜λŠ” 것은 μ€‘μš”ν•˜λ‹€. ν‘œν˜„μ‹ ꡬ문도 μ‘΄μž¬ν•œλ‹€. λ°˜λ©΄μ— ꡬ문은 ν‘œν˜„μ‹ 처럼 λ™μž‘ν•  수 μ—†λ‹€.

EXPRESSIONS (ν‘œν˜„μ‹)

ν‘œν˜„μ‹μ€ 단일 값을 μƒμ„±ν•œλ‹€

ν‘œν˜„μ‹μ€ 단일 값이 λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ μŠ€λ‹ˆνŽ«μ΄λ‹€. ν‘œν˜„μ‹μ€ μ›ν•˜λŠ” 만큼 κΈΈ 수 μžˆμ§€λ§Œ, 항상 단일 κ°’μ΄λœλ‹€.

2 + 2 * 3 / 2

(Math.random() * (100 - 20)) + 20

functionCall()

window.history ? useHistory() : noHistoryFallback()

1+1, 2+2, 3+3

declaredVariable

true && functionCall()

true && declaredVariable

μœ„μ˜ λͺ¨λ“  ν‘œν˜„μ‹μ€ 단일 값을 λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ μ•„λž˜μ˜ console.log μΈμžλŠ” 단일 값을 λ°˜ν™˜ν•˜κ²Œ 되고 화면에 좜λ ₯λœλ‹€.

console.log(true && 2 * 9) // 18

ν‘œν˜„μ‹μ΄ λ°˜λ“œμ‹œ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€

예λ₯Ό λ“€μ–΄,

const assignedVariable = 2; //this is a statement, assignedVariable is state

assignedVariable + 4 // expression

assignedVariable * 10 // expression

assignedVariable - 10 // expression

console.log(assignedVariable) // 2

μœ„μ˜ μ˜ˆμ œμ— μžˆλŠ” λͺ¨λ“  ν‘œν˜„μ‹μ—λ„ λΆˆκ΅¬ν•˜κ³  assignedVariable의 값은 μ—¬μ „νžˆ ​​2이닀. ν‘œν˜„μ‹μ΄ 무쑰건 μƒνƒœ(λ³€μˆ˜)λ₯Ό λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹Œ 것이닀.

ν•˜μ§€λ§Œ ν•¨μˆ˜λŠ” λ‹€λ₯΄λ‹€. ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄μ§€λ§Œ, ν•¨μˆ˜λŠ” μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ꡬ문을 포함 ν•  수 μžˆλ‹€.

foo () => {
  // ...
}

μœ„μ˜ μ˜ˆμ œμ—μ„  foo()ν•¨μˆ˜λŠ” μ›ν•˜λŠ” λ‚΄μš©μ„ μ±„μš΄λ‹€λ©΄ 값을 λ°˜ν™˜ν•˜κ±°λ‚˜ λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ•„λž˜μ™€ 같이 μž‘μ„±λœλ‹€λ©΄ μ–΄λ–¨κΉŒ?

const foo = foo () => {
  assignedVariable = 14
}

μ—¬μ „νžˆ foo() ν•¨μˆ˜λŠ” ν‘œν˜„μ‹μ΄μ§€λ§Œ, ν˜ΈμΆœμ„ ν•œλ‹€λ©΄ μƒνƒœ 변경이 κ°€λŠ₯ν•˜λ‹€. 즉 ν‘œν˜„μ‹κ³Ό ꡬ문의 경계가 λͺ¨ν˜Έν•˜λ‹€. foo() ν•¨μˆ˜λ₯Ό 더 λ‚˜μ€ λ°©μ‹μœΌλ‘œ λ°”κΎΈμ–΄ 보자.

const foo = foo () => {
  return 14 //explicit return for readability
}
assignedVariable = foo()

μΆ”κ°€λ‘œ 더 λ‚˜μ€ 방법은 μ•„λž˜μ™€ κ°™λ‹€.

const foo = foo (n) => {
  return n//explicit return for readability
}
assignedVariable = foo(14)

μ΄λ ‡κ²Œν•˜λ©΄ μ½”λ“œκ°€ 더 읽기 쉽고 ν˜Έν™˜λ˜λ©°, ν‘œν˜„μ‹κ³Ό ꡬ문 사이에 λͺ…ν™•ν•œ ꡬ별과 뢄리가 μžˆλ‹€. 이것은 κΈ°λŠ₯적이고 선언적인 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 기본이닀.

STATEMENTS (ꡬ문)

ꡬ문은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 골칫거리이닀. 기본적으둜 ꡬ문은 행동을 μˆ˜ν–‰ν•˜λŠ” 역할을 가진닀.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„  값이 κΈ°λŒ€λ˜λŠ” κ³³μ—μ„œλŠ” ꡬ문을 μ‚¬μš©ν•  수 μ—†λ‹€. ν•¨μˆ˜μ˜ 인수, ν• λ‹Ήμ˜ 였λ₯Έμͺ½(right-side), ν”Όμ—°μ‚°μž, λ°˜ν™˜ κ°’ λ“±μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.

foo(if () {return 2}) //js engine mind = blown

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ ꡬ문은 μ•„λž˜μ˜ ν˜•νƒœλ‘œ μ‘΄μž¬ν•œλ‹€.

  1. if
  2. if-else
  3. while
  4. do-while
  5. for
  6. switch
  7. for-in
  8. with (deprecated)
  9. debugger
  10. variable declaration

λΈŒλΌμš°μ €μ˜ μ½˜μ†”μ— μ•„λž˜μ˜ μŠ€λ‹ˆνŽ«μ„ μž…λ ₯ν•˜κ³  μ—”ν„°λ₯Ό 눌러보자.

if (true) {9+9}

이 μŠ€λ‹ˆνŽ«μ΄ 18을 λ°˜ν™˜ν•˜λŠ” κ²°κ³Όλ₯Ό λ³Ό 것이닀. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©ν•  수 μ—†μœΌλ©°, 값을 κΈ°λŒ€ν•˜λŠ” κ³³μ—μ„œ μ‚¬μš©ν•  수 μ—†λ‹€. ꡬ문이 아무것도 λ°˜ν™˜μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ˜ˆμƒν•˜κΈ° λ•Œλ¬Έμ— μ΄μƒν•˜λ‹€. λ°˜ν™˜ 값은 μ‚¬μš©ν•  수 μ—†λ‹€λ©΄ 거의 μ“Έλͺ¨κ°€ μ—†λ‹€. μ΄μƒν•˜λ‹€.

ν•¨μˆ˜ μ„ μ–Έ, ν•¨μˆ˜ ν‘œν˜„μ‹ 및 이름이 μžˆλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹

ν•¨μˆ˜ 선언은 ꡬ문이닀.

function foo (func) {
  return func.name
}

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μ΄λ‹€. μ•„λž˜λŠ” 읡λͺ… ν•¨μˆ˜λΌκ³  λΆˆλ¦¬λŠ” ν•¨μˆ˜λ‹€.

console.log(foo(function () {} )) // ""

이름이 μžˆλŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 읡λͺ… ν•¨μˆ˜μ™€ 같은 ν‘œν˜„μ‹μ΄μ§€λ§Œ 이름이 μž‡λ‹€λŠ” 차이 점이 μžˆλ‹€.

console.log(foo(function myName () {} )) // "myName"

ν‘œν˜„μ‹μœΌλ‘œμ„œμ˜ ν•¨μˆ˜μ™€ μ„ μ–Έλ¬ΈμœΌλ‘œμ„œμ˜ ν•¨μˆ˜ μ‚¬μ΄μ˜ ꡬ별을 ν•  쀄 μ•Œλ©΄ μ•„λž˜μ˜ λ‚΄μš©λ„ 이해할 수 μžˆμ„ 것이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 값을 κΈ°λŒ€ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œλ§ˆλ‹€ 값을 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€λ©΄, 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€. 블둝 ꡬ문 (즉, 값을 κΈ°λŒ€ν•˜μ§€ μ•ŠλŠ” 경우)의 슀크립트, λͺ¨λ“ˆ λ˜λŠ” μ΅œμƒμœ„ 레벨의 κΈ€λ‘œλ²Œ μˆ˜μ€€μ—μ„œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ ν•¨μˆ˜ 선언이 λ°œμƒν•œλ‹€.

예λ₯Ό λ“€μ–΄

if () {
  function foo () {} // top level of block, declaration
}

function foo () {} //global level, declaration

function foo () {
  function bar() {} //top level of block, declaration
}

function foo () {
  return function bar () {} // named function expression
}

foo(function () {}) // anonymous function expression

function foo () {
  return function bar () {
    function baz () {} // top level of block, declaration
  }
}

function () {} // SyntaxError: function statement requires a name

if (true){
  function () {} //SyntaxError: function statement requires a name
}

ν‘œν˜„μ‹μ„ ꡬ문으둜 λ³€ν™˜: ν‘œν˜„μ‹ ꡬ문

이것은 맀우 κ°„λ‹¨ν•˜λ‹€.

2+2; //expression statement
foo(); //expression statement

ν‘œν˜„μ‹μ„ ν‘œν˜„μ‹ ꡬ문으둜 λ³€ν™˜ν•  수 μžˆλ‹€. 단지 라인 끝에 μ„Έλ―Έμ½œλ‘ μ„ μΆ”κ°€ν•˜κ±°λ‚˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μžλ™ μ„Έλ―Έμ½œλ‘  μ‚½μž…μ„ ν—ˆμš©ν•˜λ©΄ λœλ‹€. 2+2 μžμ²΄λŠ” ν‘œν˜„μ‹μ΄μ§€λ§Œ μ™„μ „ν•œ 라인은 λ¬Έμž₯이닀.

2+2 // on its own is an opposition

foo(2+2) //so you can use it anywhere a value is expected

true ? 2+2 : 1 + 1

function foo () {return 2+2}

2+2; //expression statement
foo(2+2;) //syntaxError

μ„Έλ―Έμ½œλ‘  vs μ‰Όν‘œ μ—°μ‚°μž

μ„Έλ―Έμ½œλ‘ μœΌλ‘œ μ—¬λŸ¬ ꡬ문을 같은 쀄에 μœ μ§€ν•  수 μžˆλ‹€.

const a; function foo () {}; const b = 2

μ‰Όν‘œ μ—°μ‚°μžλŠ” 닀쀑 ν‘œν˜„μ‹μ„ μ—°κ²°ν•˜κ³ , λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ‹ λ°˜ν™˜ν•  수 μžˆλ„λ‘ ν•œλ‹€.

console.log( (1+2,3,4) ) //4

console.log( (2, 9/3, function () {}) ) // function (){}

console.log( (3, true ? 2+2 : 1+1) ) // 4

Javascript 엔진에 값을 κΈ°λŒ€ν•˜λŠ” ν•œ 가지 방법은 κ΄„ν˜Έμ—†μ΄ ()λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀. 각 ν‘œν˜„μ‹μ€ console.log의 인수둜 μ²˜λ¦¬λœλ‹€.

function foo () {return 1, 2, 3, 4}
foo() //4

λͺ¨λ“  ν‘œν˜„μ‹μ€ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ κ³„μ‚°λ˜κ³  λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ΄ λ°˜ν™˜λœλ‹€.

IIFEs (μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ ν‘œν˜„μ‹)

읡λͺ…ν•¨μˆ˜λŠ” ν‘œν˜„μ‹μ΄ 될 수 μžˆλ‹€ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 값을 κΈ°λŒ€ν•˜λŠ” κ³³μ—μ„œ 읡λͺ…ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, κ΄„ν˜Έλ‘œ 값을 κΈ°λŒ€ ν•˜λ„λ‘ μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ§€μ‹œν•  수 μžˆλ‹€λ©΄, 읡λͺ…ν•¨μˆ˜λ₯Ό ν•΄λ‹Ή κ°’μœΌλ‘œ 전달할 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

function () {}

κ·Έλž˜μ„œ μœ„μ˜ μ˜ˆμ œλŠ” μœ νš¨ν•˜μ§€ μ•Šμ§€λ§Œ μ•„λž˜μ˜ μ˜ˆμ œλŠ” μœ νš¨ν•˜λ‹€.

(function () {}) // this returns function () {}

읡λͺ…μ˜ ν•¨μˆ˜λ₯Ό κ΄„ν˜Έ μ•ˆμ— λ„£μœΌλ©΄ 읡λͺ…μ˜ ν•¨μˆ˜κ°€ μ¦‰μ‹œ μ‹€ν–‰λ˜μ–΄ λ°˜ν™˜λœλ‹€. 즉, λ‹€μŒκ³Ό 같이 μ¦‰μ‹œ ν˜ΈμΆœν•  수 μžˆλ‹€.

(function () {
  //do something
})()

κ·Έλž˜μ„œ μ•„λž˜ μ˜ˆμ œλ“€μ€ κ°€λŠ₯ν•˜λ‹€.

(function () {
  console.log("immediately invoke anonymous function call")
})() // "immediately invoke anonymous function call"

(function () {
  return 3
})() // 3

console.log((function () {
  return 3
})()) // 3

//you can also pass an argument to it
(function (a) {
  return a
})("I'm an argument") // I'm an argument

객체 λ¦¬ν„°λŸ΄ vs 블둝 ꡬ문

r: 2+2 // valid

foo()

const foo = () => {}

μœ„μ˜ λ‚΄μš©μ€ κΈ€λ‘œλ²Œ μŠ€μ½”ν”„μ—μžˆλŠ” 일련의 ꡬ문으둜, μœ νš¨ν•œ ꡬ문으둜 λΆ„μ„λ˜μ–΄ μ‹€ν–‰λœλ‹€ .r은 λ ˆμ΄λΈ”μ΄λΌκ³  λΆ€λ₯΄λ©° 루프λ₯Ό κΉ¨λŠ” 데 주둜 μœ μš©ν•©λ‹ˆλ‹€. 예:

loop: {
  for (const i = 0; i < 2; i++) {
    for (const n = 0; n <2; n++) {
      break loop //breaks outer loop and stops entire loop
    }
  }
}

ν‘œν˜„μ‹μ΄λ‚˜ ν‘œν˜„μ‹ ꡬ문에 λ ˆμ΄λΈ”μ„ 미리 μ„€μ •ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œν•¨μœΌλ‘œμ¨ κ°€λ³€ μ‹€ν—˜μ‹€μ„ λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€λŠ” 점에 μœ μ˜ν•˜λΌ.

lab: function a () {}
console.log(lab) //ReferenceError: lab is not defined

μ€‘κ΄„ν˜Έ { }λ₯Ό μ‚¬μš©ν•˜λ©΄, μ•„λž˜μ™€ 같이 ν‘œν˜„μ‹ ꡬ문과 λͺ…령문을 κ·Έλ£Ήν™”ν•  수 μžˆλ‹€.

{var a = "b"; func(); 2+2} // 4

μœ„μ˜ λ‚΄μš©μ„ λΈŒλΌμš°μ € μ½˜μ†”μ— λΆ™μ—¬ λ„£μœΌλ©΄ 4λ₯Ό λ°˜ν™˜ν•˜κ³  console.log (a)λ₯Ό μˆ˜ν–‰ν•˜λ©΄ λ¬Έμžμ—΄ bλ₯Ό μ–»λŠ”λ‹€. μ΅μˆ™ν•œ 객체 λ¦¬ν„°λŸ΄κ³ΌλŠ” λ‹€λ₯Έ 블둝 ꡬ문 호좜 ν•  수 μžˆλ‹€.

console.log({a: 'b'}) // {a: 'b'}

console.log({var a = "b", func(), 2+2}) // SyntaxError

const obj = {var a = "b", func(), 2+2} // SyntaxError

블둝 문을 κ°’ λ˜λŠ” ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€. console.logλŠ” ν•¨μˆ˜μ΄λ―€λ‘œ 인수둜 ꡬ문을 μ‚¬μš©ν•  수 μ—†λ‹€. κ·ΈλŸ¬λ‚˜ κ°μ²΄λŠ” λ¦¬ν„°λŸ΄μ€ ν—ˆμš©ν•œλ‹€.

{} + 1 //1

{2} + 2 // 2

{2+2} + 3 // 3

{2+2} -3 // -3

ꡬ문 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κ±°λ‚˜ 각각 1, 4, 7을 λ°˜ν™˜ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•  수 μžˆλ‹€. ꡬ문은 κ°’μœΌλ‘œ μ‚¬μš©λ  수 μ—†κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 것도 λ°˜ν™˜ν•΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” 것을 λͺ…μ‹¬ν•˜λΌ. λ”°λΌμ„œ JavascriptλŠ” 였λ₯˜λ₯Ό λ˜μ§€κΈ°λ³΄λ‹€λŠ” + μ—°μ‚°μžμ˜ ν”Όμ—°μ‚°μžλ₯Ό 숫자 λ˜λŠ” λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λ €κ³  μ‹œλ„ν•œλ‹€. λ”°λΌμ„œ 블둝 문에 μ˜ν•΄ λ°˜ν™˜λ˜λŠ” 것은 ν”Όμ—°μ‚°μžλ‘œ μ‚¬μš©λ˜λŠ” 0으둜 μ•”λ¬΅μ μœΌλ‘œ κ°•μš”λœλ‹€.