* python, C/C++과 비교하는 부분이 많습니다
기본적인 문법(틀)은 세미콜론(;
)과 중괄호({}
)를 사용한다는 점에서 C/C++과 유사하다.
console.log(내용);
<내용>을 출력한다.
C/C++과 동일하게 Javascript는 문장의 끝마다 세미콜론(;)을 필요로 한다.
console.log(0)
console.log(1); console.log(2)
console.log(3); console.log(4);
console.log(1) console.log(2)
C/C++과 동일하게 //
와 /* */
을 사용한다.
//내용
/*내용*/
Ctrl+/
단축기 통해 선택한 영역을 전부 주석 처리하거나 주석 처리를 해제할 수 있다.브라우저의 창을 대변하는 객체이면서, javascript에서 최상단에 존재하는 객체. 그리고 어디서나 접근할 수 있기 때문에 전역 객체(Global Object)라고도 부른다. 흔히 말하는 내장 객체/함수는 이 window 객체의 property이다.
window
객체의 내장 객체/함수는 앞에 window.
을 생략해도 작동한다.일반적으로 변수에 할당할 때 생성자 앞에 new
키워드를 붙여서 생성한다.
변수 = new 객체명();
일부만 작성하였다.
typeof
는 연산자이다. typeof 뒤에 띄어쓰고 원하는 내용을 넣으면 자료형을 문자열 형태로 알려준다.
null
은 object
로 반환된다. 자세한 내용은 이곳 참고.function
을 반환한다.console.log(typeof "s"+'tring'); //stringtring
console.log(typeof ("s"+'tring')); //string
console.log(typeof typeof 1); //string
console.log(typeof null); //object
NaN
(Not a Number)가 이용되는데, NaN
도 숫자(number)형이니 주의하도록 하자.2^53 - 1
~ -(2^53 - 1)
이다.let a = 3.2e+4; console.log(a); //32000
let b = -6.4e5; console.log(b); //-640000
let c = 9.6e-6; console.log(c); //0.0000096
let bi = 0b11111111; console.log(bi); //255
let oct = 0o377; console.log(oct); //255
let hex = 0xfF; console.log(hex); //255
num
진법으로 표기를 변환하여 문자열을 반환한다.
소수점 num
자리로 반올림하여 자릿수를 맞춘 형태의 문자열을 반환한다.
변수 형태로 메소드를 사용하면 별 문제가 없으나 변수가 아닌 일반적인 10진수 숫자 형태로 사용하면 오류가 발생한다.
console.log(255..toString(16)); //ff
console.log(255.356..toFixed(1)); //Error!
console.log((255).toString(16)); //ff
console.log((255.356).toFixed(1)); //255.4
python과 유사하게 작용한다. 다만 다른 점은 백틱(`)을 사용할 수 있다는 점이다.
'
)와 큰 따옴표("
), 백틱backtick(`
) 모두 문자열을 나타낸다.'
,"
,`
) 안에 다른 문자열 기호를 넣으면 정상적으로 출력된다.console.log("`마치 '이것'처럼 말이다.`"); //`마치 '이것'처럼 말이다.`
console.log('"아주 `자유자재`로 쓸 수 있지만"'); //"아주 `자유자재`로 쓸 수 있지만"
console.log(`헷갈리지 않도록 '주의'하자. "명심!"`); //헷갈리지 않도록 '주의'하자. "명심!"
console.log("Hello"+`World`); //HelloWorld
console.log('2'+1); //21
String.slice(num1,num2)
메소드를 활용하면 slicing을 할 수 있다.python의 f-string과 비슷한 기능으로, 백틱(backtick)으로 감싼 문자열에만 사용 가능하다.
${ }
을 넣어 사용하며, 중괄호 안에는 변수, 함수, 연산식 등 다양하게 넣을 수 있다.let a = 1, b = 2;
console.log(`${a}와 ${b}을 더하면 ${a+b}이다.`);
//1와 2을 더하면 3이다.
소문자로 true
, false
라고 나타낸다.
boolean으로 형변환을 했을 때 true
가 되는 값을 truthy하다고 하고, false
가 되는 값을 falsy하다고 한다.
자료형 | falsy | truthy |
---|---|---|
Number | 0, NaN | 그 외 |
String | 빈 문자열 | 그 외 |
Boolean | false | true |
Object | - | 모두 |
기타 | null, undefined |
null
과 undefined
는 다른 자료형이다.null
은 일반적으로 의도적으로 값이 없음을 나타내기 위해 사용한다.undefined
는 별도로 건드리거나 설정하지 않았을 경우에, null
은 그렇지 않은 경우에 나타난다.undefined
를 갖는다.undefined
를 반환한다.undefined
로 들어간다.undefined
를 반환한다.undefined
가 들어간다.유일한 값을 만들 때 사용하는 자료형. ES2015(ES6)에서 추가되었다. 내장 객체 Symbol
을 통하여 활용한다. Symbol
값은 어떤 값과 비교해도 다르다고 나온다.
const sym1 = Symbol(undefined);
let sym2 = Symbol(undefined);
console.log(sym1 == null); //false
console.log(sym1 == undefined); //false
console.log(sym1 == Symbol(undefined)); //false
console.log(sym1 == sym2); //false
매우 큰 정수를 다룰 때 사용하는 자료형. ES2020에서 추가되었다. 내장 객체 BigInt
을 통하여 활용하거나 정수 뒤에 n
을 붙여서 쓸 수 있다.
참조 자료형은 변수에 원시 자료형이 아닌 메모리 주소값이 들어간다.
즉 객체(혹은 배열)을 가리키는 주소 값이 그 변수에 들어간다.
자세한 내용은 이쪽 참고.
python의 dictionary에 대응되는 자료형. 값의 수정/추가 모두 dictionary와 거의 동일한 문법을 활용한다.
let obj = {
name: "홍길동",
//└key┘└──value──┘
//└───property───┘
age: 20,
"introduce-words": "안녕하세요."
}
주의사항으로는 만일 key 값이 음이 아닌 정수(0 또는 자연수)라면 자동으로 key 값이 음이 아닌 정수인 property들을 맨 앞으로 보내 오름차순으로 나열한 뒤 그 뒤에 추가한 순서대로 property들이 나열된다. for문 사용 시 유의하도록 하자.
obj = {
키: 값,
[표현식]: 값,
변수/함수명,
함수명 (인자) {
명령문;
}
}
key: value
식으로 콜론으로 구분하여 작성한다.key
자리에 표현식을 대괄호로 씌워 작성하면 표현식의 결과값이 key가 된다.console.log(obj.name); //홍길동
console.log(obj.introduce-words); //Error
let n = 'name';
console.log(obj[n]); //홍길동
console.log(obj["introduce-words"]); //안녕하세요.
delete
키워드를 이용하면 객체의 property를 삭제할 수 있다. delete
키워드 뒤에 해당하는 객체의 property를 적으면 된다.
delete obj.name, obj.age, obj["introduce-words"];
console.log(obj);
// { age: 20, 'introduce-words': '안녕하세요.' }
undefined
를 이용할 수도 있지만 일반적으로는 in
키워드를 사용하는 것이 권장된다.
//<property name> in <object name>
console.log("introduce-words" in obj); //true
delete obj["introduce-words"];
console.log("introduce-words" in obj); //false
python의 list에 대응되는 자료형. object(객체)의 한 종류이다. 일반적인 객체와는 달리 대괄호를 이용하여 선언한다.
delete
를 사용할 경우 값이 삭제되지 않고 empty
가 남아 있어 완벽히 삭제되었다고 보기 어렵다. 이때는 delete
가 아니라 메소드를 보통 사용한다.python과 비슷한 형태를 띈다.
NaN
으로 변환한다. 빈 문자열의 경우엔 0을 반환한다.true
는 1로, false
는 0으로 변환한다.NaN
으로 변환한다.console.log(Number("3.14")); //3.14
console.log(Number('ab')); //NaN
console.log(Number('1.2.3')); //NaN
console.log(Number('')); //0
console.log(Number(true)); //1
console.log(Number(false)); //0
console.log(String(12)); //12
console.log(String(false)); //false
console.log(Boolean(12)); //true
console.log(Boolean(0)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean('hi')); //true
console.log(Boolean("0")); //true
console.log(Boolean(``)); //false
일반적인 프로그래밍 언어들과는 다르게 javascript는 서로 다른 자료형의 연산을 지원한다. 이런 경우엔 알아서 자동 형변환을 한다. 어떻게 자동 형변환을 하는지는 아래 연산자 문단에서 더 서술하겠다.
식별자는 변수, 함수, 클래스 등의 이름을 말한다.
_
), 달러 기호($
) 를 사용할 수 있다.+
,-
,*
,/
정수/정수
여도 실수가 반환된다. %
실수%실수
등도 가능하기는 하다. **
a**b
일 경우 a의 b제곱을 계산해 반환한다.
+
을 제외하고는 모두 숫자(Number)로 자동 형변환을 한다.+
는 한쪽이 문자열이라면 문자열 연산, 문자열이 없다면 숫자 자동 형변환을 한다.- 양쪽이 숫자(Number)로 형변환이 됐고, 한쪽이
NaN
일 시 연산의 결과는 무조건NaN
으로 나온다.
우선순위는 **
> *
/
%
> +
-
++
--
산술 연산자와 같이 숫자로 자동 형변환을 하며,
NaN
가 들어갈 경우NaN
을 반환한다.
=
+=
, -=
, *=
. /=
, %=
, **=
배열이나 객체의 값을 나눠서 각 변수에 하나씩 할당하는 방식. 변수들을 ,
(comma)로 구분하여 늘어놓고 [ ]
(대괄호)를 씌워준 뒤 배열이나 객체를 할당하면 된다.
...
을 붙이면 남는 요소를 배열/객체로 묶어서 받는다.[변수1, 변수2, ~] = 배열;
[변수1, 변수2, ~ , ...변수n] = 배열;
응용하여 값을 swap하는 것도 가능하다. ([변수1, 변수2] = [변수2, 변수1]
)
변수명이 객체의 property name(key)와 같다면 배열처럼 작성해도 되지만, 그렇지 않다면 key: variable
식으로 작성해야 한다.
[표현식]
과 같은 형식으로도 쓸 수 있다.// 변수와 key 이름이 같은 경우
{변수1, 변수2, ~} = 객체;
{변수1, 변수2, ~ , ...변수n} = 객체;
// 변수와 key 이름이 같은 경우 : 기본값
{변수1 = 기본값, 변수2 = 기본값, ~} = 객체;
{변수1 = 기본값, 변수2 = 기본값, ~ , ...변수n} = 객체;
// 같지 않은 경우
{키1: 변수1, 키2: 변수2, ~} = 객체;
{키1: 변수1, 키2: 변수2, ~ , ...변수n} = 객체;
응용하여 함수의 parameter로 활용하여 객체의 특정 property만 가져올 수 있다.
>
, <
, >=
, <=
- 양 변이 같은 자료형이 아닐 경우 양 변을 숫자로 자동 형변환 하여 연산한다.
- 한 쪽에
NaN
이 들어가 연산이 불가능할 경우 무조건적으로false
를 반환한다.
==
과 부등 연산자 !=
- 양 변이 같은 자료형이 아닐 경우 양 변을 숫자로 자동 형변환 하여 연산한다.
- 한 쪽에
NaN
이 들어가 연산이 불가능할 경우 무조건적으로false
를 반환한다.
console.log('1' == true); //true
console.log("1" != 1); //false
===
과 불일치 연산자 !=
console.log('1' == true); //false
console.log("1" !== 1); //true
&&
, OR ||
, NOT !
, null 병합 연산자 ??
!
>> &&
>> ||
중요한 점은 두 연산자는 반환값이 항상 boolean인 것이 아니다.
- 첫번째 값이 truthy한 값이라면 두번째 값을 반환한다.
- 첫번째 값이 falsy한 값이라면 첫번째 값을 반환한다.
console.log(true && {}); //{} (not true)
console.log('1' && NaN); //NaN (not false)
console.log(null && 31); //null (not false)
console.log(false && 0); //false
- 첫번째 값이 truthy한 값이라면 첫번째 값을 반환한다.
- 첫번째 값이 falsy한 값이라면 두번째 값을 반환한다.
console.log(true || {}); //true
console.log('1' || NaN); //1 (not true)
console.log(null || 31); //31 (not true)
console.log(false || 0); //0 (not false)
NOT 연산자 !
는 항상 boolean값을 반환한다.
!!
으로 특정 변수/값이 truthy한지 falsy한지 판독할 수 있다.console.log(!![]); //true
console.log(!!undefined); //false
OR 연산자 ||
과 유사하나 truthy falsy가 아니라 null
이나 undefined
인지 아닌지를 판단한다.
- 첫번째 값이
null
이나undefined
가 아니면 첫번째 값을 반환한다.- 첫번째 값이
null
이나undefined
이면 두번째 값을 반환한다.console.log('null' ?? true); //null console.log(NaN ?? ['a']); //NaN console.log(null ?? 10); //10 console.log(undefined ?? {}); //{}
...배열 (또는 객체)
스프레드 연산자는 iterable 자료형(객체, 배열, 문자열)을 풀어서 전개해준다.
ES2015(ES6)에서 추가되었다.
/* 예시 */
let obj1 = { first: 1, second: 2 };
let obj2 = { ...obj1, third: 3 };
console.log(obj2);
//{ first: 1, second: 2, third: 3 }
조건 ? 값1 : 값2
C/C++과 동일하다.
조건 연산자는 조건이 truthy하면 앞쪽 값을, falsy하다면 뒤쪽 값을 반환하는 연산자이다.
ES2015(ES6)에서 추가되었다.
객체?.프로퍼티
객체의 점(.
) chaining 연산자와 같이 쓰이나, ?.
앞의 객체가 null
혹은 undefined
면 (없다면) property를 찾지 않고 undefined
를 반환한다.
/* 주로 사용하는 방식 : 중첩 객체를 찾을 때 보통 사용 */
const obj = {
name: "홍길동",
birthday: {
year: 1000,
month: 1
}
}
console.log(obj.birthday?.month); //1
console.log(obj.birthday?.date); //undefined
console.log(obj.name?.lastName); //undefined
변수나 함수가 어디까지 유효한지 범위를 일컫는다.
블록이나 함수 안에 선언하지 않고 기본 영역에 선언하는 경우의 범위. 유의할 점은 파일 내에서의 전역이 아니라, 파일을 넘어서 전역 범위라는 것이다. script
태그로 html 파일에 여러 js 파일을 불러올 경우, js 파일들은 전역 범위의 변수와 함수를 공유하게 된다.
블록, 즉 제어문이나 반복문 같이 중괄호({ }
)로 감싸진 영역을 말한다.
함수 내부 영역을 말한다.
전역 스코프와 달리 파일 간에 구분되지 않는 것이 아닌 하나의 파일 안의 영역이 되는 것을 말한다. 모듈 스코프 안의 요소는 export
와 import
없이는 다른 파일에서 접근할 수 없다.
C/C++나 python에서의 기본적인 전역 스코프와 유사하다.
위에서 말하는 scope의 개념과는 조금 다르다.
Javascript의 변수와 함수는 기본적으로 선언된 위치를 기준으로 변수와 함수를 찾는다. 이것을 Lexical scope라고 한다.
반대의 개념은 호출된 위치를 기준으로 하는 Dynamic scope다.
let year = 2000; function print() { console.log(year); } function yearPrint() { let year = (new Date()).getFullYear(); print(); } yearPrint(); //2000
여기서
yearPrint
함수는year
변수를 출력하는 것이 아닌,year
변수인 전역year
변수를 가지고 와서 2020을 출력한다.
let
, var
, const
뒤에 변수명을 붙여 선언한다. 다만 빼먹고 python처럼 선언해도 돌아가기는 한다.
var
: 재할당 가능, 재선언 가능. hoisting이 일어나며 전역/함수 영역.let
: 재할당 가능, 재선언 불가.const
: 재할당 불가, 재선언 불가.let
과 var
는 선언한 뒤에도 값을 변경할 수 있는 변수를 선언하는 키워드다.
var a = 0;
let b = 1;
let
는 같은 범위(scope) 내에서 같은 이름의 변수 선언(재선언)이 불가하나, var
는 가능하다. (덮어쓰기처럼 된다고 생각하라)var
는 scope(범위)의 구분이 function(함수)만 되고, 다른 중괄호 안에서는 불분명하다. (기본적으로 global scope(전역 영역)을 가진다.)var
는 선언에 있어 hoisting(호이스팅)이 일어나지만, let
과 후술할 const
는 그렇지 않다.일반적으로 현재는 위의 차이점으로 인해 var
보다 let
을 쓰는 것이 권장된다.
const
는 한 번 선언한 뒤 값을 변경할 수 없는 변수를 선언하는 키워드다.
const c = 2;
js에서 값으로서의 함수는 엄밀히 따지면 객체 형태이다.
기본적으로 function
, 함수명
(선택), (매개변수)
(선택), { }
형태로 이루어져 있다.
function 함수명(매개변수, ...) {
명령;
...
}
/*예시*/
var/let/const 변수명 = function (매개변수, ...) {
명령;
...
};
함수 표현식은 함수를 값처럼 사용하는 것을 말한다. 변수에 함수를 할당하는 식으로 사용된다.
var/let/const 변수명 = function 함수명 (매개변수, ...) {
명령;
...
};
여기서 변수명
은 외부에서 함수처럼 쓰이지만, 함수명
은 외부에서 쓸 수 없고 주로 함수 내부에서 자기 자신(재귀함수)를 지칭할 때 사용한다.
var/let/const 변수명 = (매개변수, ...) => 반환값;
var/let/const 변수명 = (매개변수, ...) => {
명령;
...
};
더욱 간략화된 함수 표현식. 명령이 없고 반환값만 있다면 더욱 단순하게 표현할 수 있다.
arguments
객체가 없다.(function (매개변수, ...) {
명령;
...
})();
함수 선언문을 소괄호로 감싸고 뒤에 소괄호를 붙이면 선언과 동시에 실행되고 다시 사용할 수 없는 즉시 실행 함수(Immediately Invoked Function Expression)가 된다. 함수명이 있더라도 재귀 함수로만 사용이 가능하다.
함수의 인자(매개변수/파라미터)로 전달되는 함수, 즉 argument가 되는 함수를 콜백 함수(Callback function)이라고 한다.
함수를 반환하는 함수를 고차 함수(High order function)이라고 한다.
고차 함수 뒤에 소괄호를 두 번 붙여 바로 반환된 함수를 사용할 수 있다.
고차함수(~)(~);
undefined
가 들어간다.parameter의 초기값/기본값을 설정하는 방법. ES2015(ES6)에서 등장한 문법이다.
function 함수명(..., 매개변수=초기값) {
명령;
...
}
undefined
값을 전달받았을 때도 기본값으로 설정된다.여러 개의 parameter를 배열로 받는 방법. (가변항 함수) ES2015(ES6)에서 등장한 문법이다.
함수의 마지막 parameter 앞에 ...
을 붙이면 앞선 parameter를 채우고 남은 argument를 배열로 묶는다.
function 함수명(~, ...매개변수) {
명령;
~
}
함수 내부에서 arguments
객체는 들어온 argument 값들을 유사 배열의 형태로 가지고 있다.
위 구문 모두 C/C++과 동일하게 사용하면 되지만 주의할 점이 있다.
===
과 동일)for
~ in
형태를 사용할 수 있으나 for 뒤를 소괄호로 감싸주고 변수를 선언해야 한다는 것을 잊지 말자.for
~ of
은 객체는 사용할 수 없고 배열, 문자열 등 iterable 자료형이 사용할 수 있다. 요소(element, value)값이 변수에 들어간다.상위(자신이 속한) 객체를 참조하는 키워드. 기본값은 전역 객체인 window
이며, 객체의 메소드일 경우 호출 됐을 때의 (상위) 객체를 가리킨다.
this
가 아니라 선언되었을 때의 this
를 가리킨다.