javascript : BasicSyntax
오늘 배워볼 것은 JavaScript를 사용할 때 필요한 문법들을 배워볼 것이다. 3달전에 파이썬 문법 배울때가 새록새록한데 벌써 JS 문법을 배운다니... 정말 많이 배우고 있는 것 같다. 파이썬과 다른 부분이 많다보니 헷갈리는 문법들이 많은데, 그래도 뉘앙스가 비슷해서 이해하기는 쉬웠던 것 같다. 오늘도 화이팅.
아직 공식문서를 보는것이 익숙치는 않은데, 해당 페이지는 한국어로도 잘 해석되어있고 뭔가 귀여워서 보면서 하는게 좋을 것 같아서 링크를 첨부했다.
JavaScript Standard Style
English • Español (Latinoamérica) • Français • Bahasa Indonesia • Italiano (Italian) • 日本語 (Japanese) • 한국어 (Korean) • Português (Brasil) • 简体中文 (Simplified Chinese) • 繁體中文 (Taiwanese Mandarin) 이것은 Ja
standardjs.com
식별자(변수명) 작성 규칙
- 문자, 달러('$') 또는 밑줄('_')로 시작
- 대소문자를 구분
- 예약어 사용 불가 (for, if, function 등)
식별자(변수명) Naming case
- 카멜 케이스 (camelCase)
- 변수, 객체, 함수에 사용
- 파스칼 케이스 (PascalCase)
- 클래스, 생성자에 사용
- 대문자 스네이크 케이스(SNAKE_CASE)
- 상수(constants)에 사용
변수 선언
변수 선언하는 키워드는 3가지로 let, const, var이 있다. 이 중 var은 현재 쓰이지 않지만, let과 const를 사용하지 않고 변수를 설정하면 var로 자동 기본값 설정이 되니 주의하자.
변수 선언 키워드 | ||
let |
const | var |
- 블록 스코프(block scope)를 갖는 지역 변수를 선언 - 재할당 가능 - 재선언 불가능 - ES6에서 추가 |
- 블록 스코프(block scope)를 갖는 지역 변수를 선언 - 재할당 불가능 - 재선언 불가능 - ES6에서 추가 |
- ES6 이전에 변수 선언에서 사용했던 키워드 - 재할당 가능 - 재선언 가능 - 함수 스코프(function scope)를 가짐 - 변수 명시하지 않으면 기본값으로 사용 - 호이스팅(hoisting) 발생 |
블록스코프
: if, for, function 등의 '중괄호 { } 내부'를 가르키며 블록 스코프를 가지는 변수는 바깥에서 접근이 불가능하다. 이 부분은 파이썬과 굉장히 다른 점이므로 유의하자.
데이터 타입
데이터 타입은 크게 2가지로 원시 자료형, 참조 자료형으로 나뉜다. 파이선과 비교해서 어려운 것은 없지만, null과 undefined에 관련해서 짚고 넘어가야할 내용이 있다. 곧 다룰 내용이니 인지만 해두고 일단 넘어가자!
데이터 타입 | |
원시 자료형 (Primitive type) |
참조 자료형 (Reference type) |
변수에 값이 직접 저장되는 자료형 (불변, 값이 복사) |
객체의 주소가 저장되는 자료형 (가변, 주소가 복사) |
- Number - String - Boolean - null - undefined |
Objects(Object랑 다른 의미) - Object - Array - Function |
이러한 과정은 파이썬에서도 깊은복사 얕은복사와 유사한 개념이다.
Number 자료형
- Integer, Float, Infinity, NaN(Not a Number) 등 사용 가능하다.
String 자료형
- '+' 연산자를 사용해 문자열끼리 결합
- 뺄셈, 곱셈, 나눗셈 불가
Str의 + 연산은 파이썬과 동일하다. 하지만 파이썬에는 곱셈인 *까지 가능했지만, JavaScript에서는 허용하지 않는다.
null 과 undefined
null : 변수의 값이 없음을 의도적(직접)으로 표현할 때 사용
undefined : 변수 선언 이후 직접 값을 할당하지 않으면 자동으로 할당
'값이 없다'의 의미를 가진 null과 undefined 2가지 인 이유
- JavaScript의 설계 실수
- null이 원시 자료임에도 불구하고 object로 출력되는 이유는 설계 당시 버그를 해결하지 않음
- 이후로도 고치지 못하는 이유는 이미 null타입에 의존성을 띄고있는 수 많은 프로그램들이 호환성 문제가 생길 수있기 때문
Boolean (true / false)
- 조건문 또는 반복문에서 Boolean이 아닌 데이터 타입은 "자동 형변환 규칙"에 따라 true / false로 변환 가능
자동 형변환 | ||
데이터 타입 | false | true |
undefined | false | X |
null | false | X |
Number | 0, -0, NaN | false 외의 모든 경우 |
String | ' ' (빈 문자열) | false 외의 모든 경우 |
연산자
파이썬과 다른 부분이 다소 있으니 자세히 살펴봐야한다. 특히 파이썬에서는 암묵적 형변환, 존재하지 않는 증가&감소 연산자와 동등/일치 연산자는 꼭 알아두자! (물론 다 알아야함)
- 할당 연산자
- 증가&감소 연산자
- 비교 연산자
- 동등 연산자
- 일치 연산자
- 논리 연산자
// js 내에 암묵적 형변환
console.log(7 + 7 + 7); // 21
console.log(7 + 7 + "7"); // "147"
console.log("7" + 7 + 7); // "777"
console.log(true + 7 + 7);
console.log(7 + true + "7"); // "87"
console.log("7" + 7 + true); // "77true"
// -, *, / , % 연산자는 모든 변수를 먼저 Number 자료형으로 변환한다.
console.log(7 - true); // 6
console.log("13" - 3); // 10
할당 연산자
- 오른쪽에 있는 피연산자의 평가 결과를 왼쪽 피연산자에 할당하는 연산자
- 단축 연산자 지원(파이썬과 동일)
증가 & 감소 연산자 (++, --)
- 증가 연산자 ( ++ )
- 피연산자를 증가(1 증가)시키고 연산자의 위치에 따라 증가하기 전이나 후의 값을 반환
- 감소 연산자 ( -- )
- 피연산자를 감소(1 감소)시키고 연산자의 위치에 따라 감소하기 전이나 후의 값을 반환
비교 연산자
- 피연산자들(숫자, 문자열, Boolean 등)을 비교한 후 결과 값을 boolean으로 반환하는 연산자를 의미
- 파이썬과 달리 True > true / False > false로 바뀐것 헷갈리지 말자.
동등 연산자 ( == )
- 두 피연산자가 같은 값으로 평가되는지 비교 후 boolean 값을 반환
- '암묵적 타입 변환'을 통해 타입을 일치 시킨 후 같은 값인지 비교한다
- 피연산자 모두 객체일 경우 메모리의 같은 객체를 바라보는지 판별한다
// == 동등 비교 연산자로 비교할 때에 암시적 형변환 순서
// 피연산자 중에서 Boolean/String 자료형은 Number 로 형변환
// 피연산자 중에서 Null 과 Undefined 자료형 - > 양 측이 모두 Null or Undefined인 경우에만 true
// 피연산자 중에서 객체(참조형)을 원시자료형과 비교하는 경우 - > 객체를 원시 자료형으로 강제 형변환
console.log(1 == 1); // true
console.log("1" == 1); // 1 == 1 - > true
console.log(null == undefined); //true
console.log(0 == null); // false
console.log(0 == undefined); // false
console.log([] == false); // true
// toPrimitive([])
// '' == false
// 0 == false
// 0 == 0
console.log({} == false); // false
// toPrimitive([])
// '[object Object]' == false
// NaN == false
// NaN == 0
일치 연산자 ( === )
- 두 피연산자의 값과 타입이 모두 같은 경우 true를 반환한다
- 같은 객체를 가리키거나, 같은 타입이면서 같은 값인지 비교한다
- 엄격한 비교가 이뤄지며, 암묵적 타입 변환은 발생하지 않는다
- 특수한 경우(null과 undefined)를 제외하고는 동등 연산자가 아닌 일치 연산자 사용을 권장
- 파이썬에서 일반적으로 사용했던 ( is )과 동일하나 차이가 있다.
논리 연산자
- && (and 연산)
- || (or 연산)
- ! (not 연산)
- !! (논리 부정 연산)
- 단축 평가를 지원한다
- Falsy 조건들이 존재한다
if 조건문
: 조건 표현식의 결과값을 boolean 타입으로 변환 후 참 / 거짓을 판단한다
삼항 연산자 (if 조건이 들어가기 때문에 조건문으로 정리했다)
- condition : 평가할 조건 (true or false로 평가)
- expression1 : 조건이 true일 경우 반환할 값 또는 표현식
- expression2 : 조건이 false일 경우 반환할 값 또는 표현식
반복문
- while
- for
- for ... in
- for ... of
이 부분은 파이썬이 매우 그리워진다. 파이썬은 반복문 2개면 되는데.. javascript에서는 어떤 자료형이냐에 따라 활용 방법이 있어서 적절히 활용해줘야한다.
while 반복문
: 조건문이 참이면 표현식을 계속해서 수행
for 반복문
: 특정한 조건이 거짓으로 판별될 때까지 반복
반복문 내부에 들어가있는 ' ; ' 의 경우 괄호 내부에서 문장이 끝난 것을 명시해줘야 하기 때문에 반드시 필요
for ... in 반복문
: 객체의 열거 가능한 속성(property)에 대해 반복
여기서 객체를 열거 가능한 속성이지만 iterable하지 않다. 따라서 다음에 나올 for ... of에는 사용이 불가하다. 하지만 Array경우 객체라고 배웠지만, 특수하기 때문에 for ... in / for ... of 둘 다 사용 가능하다. 하지만 주로 for ... of를 사용한다
for ... of 반복문
: 반복 가능한 객체(배열, 문자열 등)에 대해 반복
파이썬에서 for 반복문 사용시 range를 사용하지 않고 list를 순회하는 방법과 동일하다. array 경우 for in도 사용 가능한데, 위와 동일한 결과를 출력하려면 index를 통해 array에 접근하는 방식이다.
for ... in 과 for ... of 비교
- 객체 관점에서 배열의 인덱스는 정수 이름을 가진 열거 가능한 속성
- for ... in 은 정수가 아닌 이름과 속성을 포함하여 열거 가능한 모든 속성을 반환
- 내부적으로 for ... in 배열의 반복자가 아닌 속성 열거를 사용하기 때문에 특정 순서에 따라 인덱스를 반환하는 것을 보장할 수 없다. (위에서 순서가 있어보이지만 실제로는 그렇지 않을 수 있다는 뜻)
- 따라서 인덱스가 중요한 배열(Array)에서는 사용하지 않는다
- 배열의 경우 for 문 or for ... of 를 사용한다
부록
반복문 종합
키워드 | 특징 | 스코프 |
while | . | 블록 스코프 |
for | . | |
for ... in | object 순회 | |
for ... of | iterable 순회 |
세미콜론(semicolon)
- javascripts는 문장 마지막 세미콜론 ( ; ) 을 선택적으로 사용 가능
- 세미콜론이 없으면 ASI(Automatic Semicolon Insertion, 자동 세미콜론 삽입 규칙)에 의해 삽입된다
함수 스코프 (function scope)
- 함수의 중괄호 내부를 가리킴
- 함수 스코프를 가지는 변수는 함수 바깥에서 접근 불가능
호이스팅 (hoisting)
- 변수를 선언 이전에 참조할 수 있는 현상
- 변수 선언 이전의 위치에서 접근 시 undefined를 반환한다
NaN을 반환하는 경우 예시
- 숫자로서 읽을 수 없을 때
- 결과가 허수인 수학 계산식
- 피연산자가 NaN일 경우
- 정의할 수 없는 계산식
- 문자열을 포함하면서 덧셈이 아닌 계산식
언어를 배우는 초기에는 정의 되는 것도 많고 외워야 할 것이 많아서 머리가 아파오는거 같다. 하지만 Python보다는 현업에서 많이 사용되는 언어이기 때문에 동기부여는 충분히 되고 있는 것 같다. 나는 과연 front와도 어울릴까..? 모르면 열심히하자.