표현식과 연산자

ex) 상수, 변수이름

4.1 기본 표현식

  1. 변수 참조
i          // 변수 i
sum        // 변수 sum
undefined  // 전역 객체의 "undefined" 프로퍼티 값
  1. 일부 키워드

    this : 다른 키워드와 달리 일정한 값이 아니며 프로그램에서 사용한 위치에 따라 다른 값으로 평가 됨, OOP(객체 지향 프로그래밍)에서 사용

    true
    false
    null
    this // '현재' 객체로 평가
    
  2. 리터럴 값

    1.23      // 숫자 리터럴
    "hello"   // 문자열 리터럴
    /partern/ // 정규 표현식
    

4.2 객체와 객체 초기화 표현식

[]
[1+2,3+4]

** 배열 초기화 표현식 내 요소 표현식 → 중첩된 배열을 반환

let matrix = [[1,2,3],[4,5,6],[7,8,9]];

** 배열 초기화 표현식에서 ,와, 사이 값이 없다면 undefined

let sparseArray = [1,,,,5]; // 총 3개의 undefined 존재
let p = {x : 2, y: 3};
let rectangle = {
									upperleft : { x: 2, y : 3},
									lowerleft : { x: 4, y : 5}
								};

** ES6 이후로 객체 리터럴은 중첩이 가능하다!

4.3 함수 정의 표현식

let square = function(x){return x * x;};
let arrowFct = (x) => {return x + x }; // ES6 부터 화살표 함수 가능(간결한 표현)
<함수 정의 표현식>
  1. function 키워드로 시작
  2. 괄호 안 0개 이상의 식별자(매개변수) 작성
  3. 중괄호 안 JS 코드 작성

4.4 프로퍼티 접근 표현식

expression.identifier     // 표현식 뒤에 마침표 쓰고 그 뒤에 식별자 쓰는 형태 
expression[expression]    // 표현식 뒤에 대괄호를 쓰고 그 안에 다른 표현식을 쓰는 형태
let o = {x : 1, y: {z :3}};
o.x.    // 1
o.y.z.  // 3
o["x"]  // 1

** .식별자 문법이 더 간결하지만 접근하고자 하는 이름이 유효한 식별자 or 그 이름을 알고 있을 경우 모두 만족 시켜야함.

4.4.1 조건부 프로퍼티 접근

expression?.identifier
expression?.[expression]
let a = {b:null};
a.b?.c.d   // => undefined
(a.b?.c).d // => typeerror
let a;
let index = 0;
try {
	a[index++];
} catch(e) {
	index
}

a?.[index++]   // undefined
index          // => 1 (?.[]는 단축 평가이므로 index가 증가하진 x
a[index++]     // TypeError a가 존재하지 않기 때문에 에러 발생

4.5 호출 표현식

<과정>

  1. 함수 표현식으로 시작
  2. 함수 표현식 다음에 여는 괄호를 쓰고 콤마로 구분된 0개 이상의 함수 인자 표현식 리스트를 쓰고 닫는 괄호 사용
f(0)      // f는 함수 표현식 0은 인자 표현식
a.sort()

<호출 표현식 평가>

  1. 함수 표현식 평가
  2. 인자 표현식 평가 후 인자 값 리스트 생성
  3. 매개변수에 순서대로 할당 후 함수 바디 실행
  4. 함수가 return 문 사용 시 그 값이 호출 표현식의 값

** 메서드 호출 : 호출 표현식 맨 앞 표현식이 프로퍼티 접근 표현식

4.5.1 조건부 호출

function square(x, log) {
	log?.(x);
	return x * x;
}
o.m()    // 일반적인 프로퍼티 접근, 일반적 호출
o?.m()   // 조건부 프로퍼티 접근, 일반적 호출
o.m?.()  // 일반적인 프로퍼티 접근, 조건부 호출

4.6 객체 생성 표현식