연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다.
숫자 타입이 아닌 피연산자에 단항 연산자를 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다.
이때 피연산자를 변경하는 것은 아니고 숫자 타입으로 변환한 값을 생성해서 반환한다.
let x = 1;
console.log(+x); // 1
console.log(x); // "1"
+연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.
var a, b, c;
// 연쇄 할당, 오른쪽에서 왼쪽으로 진행
a = b = c = 0;
// 값으로 평가되는 표현식인 문이기 때문에 아래와 같이 동작
var x = 10;
console.log(x = 10); // 10
== 동등 비교 연산자는 좌항과 우항의 피연산자를 비교할때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다.
=== 일치 비교 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.
typeof 연산자로 null 값을 연산해보면 null이 아닌 object를 반환한다.
제어문은 조건에 따라 코드 블록을 실행하거나 반복 실행 할 때 사용한다.
블록문은 0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고 한다.
값의 타입은 개발자의 의도에 따라 다른 타입으로 변환할 수 있다.
자바스크립트 엔진은 산순 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
자바스크립트 엔진은 불리언 타입이 아닌 갓을 Truthy 값, Falsy 값으로 구분한다. Falsy 값은 아래와 같다.
명시적 타입 변환
단축 평가
옵셔널 체이닝 연산자
null 병합 연산자
자바스크립트는 객체 기반의 프로그래밍 언어이며, 자바스크립트를 구성하는 거의 모든 것이 객체다. 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다.
원시 값은 변경 불가능한 값 이지만, 객체 타입의 값, 즉 객체는 변경 가능한 값이다.
프로퍼티란 객체의 상태를 나타내는 값(data)을 말하며 메서드는 프로퍼티를 참조하고 조작할 수 있는 동작을 말한다.
프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.
이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.
ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략할 수 있다. 이때 프로퍼티 키는 변수 이름으로 자동 생성된다.
ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
const obj = {
name: 'Yoo',
// 기존에는 sayHi: function() {
sayHi() {
console.log(`Hi ${this.name}`);
}
}
원시 타입
객체 타입
자바스크립트의 문자열은 원시 타입이며, 변경 불가능하다. 이는 문자열이 생성된 이후에는 변경될 수 없음을 의미한다.
문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 각 문자에 접근할 수 있다.
유사 배열 겍체란 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체를 말한다. 원시 값을 객체처럼 사용하면 원시 값을 감싸는 래퍼 객체로 자동 변환된다.
자바스크립트 객체는 프로퍼티 키를 인덱스로 사용하는 해시 테이블이라고 생각할 수 있다. 대부분의 자바스크립트 엔진은 해시테이블과 유사하지만 높은 성능을 위해 일반적인 해시 테이블 보다 더 나은 방법으로 객체를 구현한다.
V8 자바스크립트 엔진에서는 프로퍼티에 접근하기 위해 동적 탐색 대신 히든 클래스 라는 방식을 사용해 성능을 높힌다. 히든 클래스는 자바와 같이 고정된 객체 레이아웃(클레스)과 유사하게 동작한다.
(참고: https://engineering.linecorp.com/ko/blog/v8-hidden-class/)
함수는 일련의 과정을 문으로 구성하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
함수 내부로 입력을 전달받는 변수를 매개변수, 입력을 인수, 출력을 반환값이라 한다.
함수 리터럴은 fucntion 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.
함수 선언문(기본적인 fucntion을 통한 함수 정의)은 표현식이 아닌 문이다. 하지만 아래 코드를 보면 함수 선언문이 변수에 할당되는 것으로 보인다.
const add = function add(x, y) {
return x + y;
};
console.log(add(2, 5)); // 7
이렇게 동작하는 이유는 자바스크립트 엔진이 코드의 문맥에 따라 동일한 함수 리터럴을 표현식이 아닌 문인 함수 선언문으로 해석하는 경우와 표현식인 문인 함수 리터럴 표현식으로 해석하는 경우가 있기 때문이다.
자바스크립트 엔진은 함수 선언문을 해석해 함수 객체를 생성한다. 이때 함수 이름은 함수 몸체 내부에서만 유효한 식별자이므로 함수 이름과 별도로 생성된 함수 객체를 가리키는 식별자가 필요하다.
// 대략적인 의사코드로는 이렇게 생각하면 된다.
const add = function add(x,y) {
return x + y;
};
console.log(add(2, 5)); // 7
함수 리터럴을 이용한 함수 표현식과 함수 선언문은 차이가 존재한다. 함수 생성 시점과 함수 호이스팅이 그것이다.
화살표 함수는 내부 동작이 간략화되어 있다.
함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 실행 흐름을 옮긴다. 이때 매개변수에 인수가 순서대로 할당하고 함수 몸체 문들이 실행되기 시작한다.
함수형 프로그래밍에서는 어떤 외부 상태에 의존하지 않고 변경하지도 않는, 즉 부수 효과가 없는 함수를 순수 함수라고 한다.