프로그래밍 언어에서 처리해야 되는 데이터를 담고 있음, 변경될 수 있는 값
JS에서 변수를 선언할 수 있는 키워드
let name = 'dustkim'; // name이라는 변수에 'dustkim'이라는 값을 할당함
console.log(name); // dustkim 출력
name = 'hello'; // name이라는 변수에 다시 'hello'라는 값을 할당함
console.log(name); // hello 출력
⇒ var hoisting
어디에서 선언했는지 상관 없이 항상 제일 위로 선언을 끌어 올려 주는 것
값을 선언함과 동시에 한번 할당하면 절대 값을 변경할 수 없음(immutable data), 읽기만 가능함
const dayInweek = 7;
변수의 값이 계속 바뀌어야 될 이유가 없다면 웬만해서는 const를 이용하는 것이 바람직함
보안상의 이유 → 해킹으로 코드의 값이 바뀌는 것을 방지
안전한 스레드
애플리케이션이 실행되면 한가지 프로세스가 할당 되고 그 프로세스 안에서 다양한 스레드가 동시에 돌아가면서 애플리케이션이 조금 더 효율적으로 빠르게 동작할 수 있도록 도와줌
→ 다양한 스레드들이 동시에 변수에 접근해서 값을 변경 할 수 있는데 이는 안정적인 방법이 아님
→ 가능한 값이 변하지 않는 것을 사용하는게 좋음
코드를 변경하거나 다른 개발자가 코드를 바꿀 때 실수를 방지해 줄 수 있음
더 이상 작은 단위로 나누어질 수 없는 한 가지의 아이템
c언어와 java와는 다르게 JS에서는 숫자에 대한 number type은 number 하나만 존재함
const count = 17; // integer
const size = 17.1; // decimal number
number - special numeric values:
양수를 0으로 나누게 되면 무한대의 숫자값인 Infinity
값이 생김
const infinity = 1 / 0;
음수의 값을 0으로 나누게 되면 -Infinity
값이 생김
const negativeInfinity = -1 / 0;
문자열을 숫자로 나누게 되면 NaN
값이 생김
const nAn = 'not a number' / 2;
DOM 요소를 JS를 이용해서 포지션을 바꾸거나 다양한 계산을 해야 될 때 나누고자 하는 값을 제대로 확인하지 않고 연산을 하면 이러한 값을 받을 수 있기 때문에 사용자에게 에러가 발생할 수 있음
bigInt
JS에서 number는 -2의 53승 부터 2의 53승 까지 범위의 숫자만 표현이 가능했으나 bigInt라는 type이 추가 되어 숫자끝에 n만 붙이면 bigInt로 간주됨
const bigInt = 1234567890123456789012345678901234567890n; // over (-2**53) ~ 2*53
JS에서는 한 글자 또는 여러 개의 글자이든 간에 스트링 타입으로 할당됨
const char = 'c';
const brendan = 'brendan';
일반 스트링과 다른 변수를 플러스 기호를 이용해서 스트링을 붙이는 것도 가능함
const greeting = 'hello' +brendan;
template literals
`을 이용해서 원하는 스트링을 적고 $과 기호를 이용하면 변수의 값이 자동적으로 붙여져서 나옴
const helloBob = `hi ${brendan}!`;
// template literals을 사용 하지 않으면
console.log('value: ' + helloBob + 'type:' + typeof helloBob);
// template literals을 사용 하면
console.log(`value: ${helloBob}, type: ${typeof helloBob}`);
참과 거짓으로 나누어지는 값
false
: 0, null, undefined, NaN, ''(공백)true
: any, other, valueconst canRead = true;
const test = 3 < 1; // false
명확하게 비어있는 값
let nothing = null;
선언은 되었지만 아무런 값이 할당되지 않은 경우
let x;
맵이나 다른 자료구조에서 고유한 식별자가 필요하거나 동시에 다발적으로 일어날 수 있는 코드에서 우선순위를 줄 때 쓰임
const symbol1 = Symbol('id');
const symbol2 = Symbol('id');
console.log(symbol1 === symbol2); // false
const gSymbol1 = Symbol.for('id');
const gSymbol2 = Symbol.for('id');
console.log(gSymbol1 === gSymbol2); //true
console.log(`value: ${symbol1.description}, type: ${typeof symbol1}`);
한 가지의 아이템들을 여러개 묶어서 한 단위로 관리할 수 있게 해주는 것 (box container)
const ellie = {name: 'ellie', age: 20 };
ellie.age = 20;
const로 지정 되어 있어 한번 할당된 오브젝트는 다른 오브젝트로 변경이 불가능함
→ 오브젝트 안의 레퍼런스는 dustkim.name, dustkim.age 이런식으로 하면 다른 값으로 할당이 가능함
Primitivie type은 데이터 자체가 변수에 담겨져있어서 데이터 자체가 복사되어 들어오지만 Object는 Object를 가리키고 있는 주소가 들어 있기 때문에 그 주소만 복사 되어서 들어옴
JS에서는 function도 다른 데이터 타입처럼 변수에 할당이 가능하고 그렇기 때문에 함수의 파라미터 인자로도 전달이 되고 함수에 리턴 타입으로도 function return 할 수 있는 것이 가능하다.
→ first-class function
console.log('my' + 'cat');
console.log('1' + 2);
string literlas
$을 이용하면 변수값을 계산해서 문자열로 포함해서 문자열을 만들게 됨console.log(`string literlas:
''''
1 + 2 = ${1 + 2}`);
console.log('ellie\'s book');
console.log(1 + 1); // add
console.log(1 - 1); //substract
console.log(1 / 1); // divide
console.log(1 * 1); // multiply
console.log(5 % 2); // remainder, 나머지 값
console.log(2 ** 3); // exponentiatian, ~의 ~승
let counter = 2;
// 전치 연산자
// counter = counter + 1;
// preIncrement = counter;
const preIncrement = ++counter;
console.log(`preIncrement: ${preIncrement}, counter: ${counter}`);
const preDecrement = --counter;
console.log(`preDecrement: ${preDecrement}, counter: ${counter}`);
//후치 연산자
// postIncrement = counter;
// counter = counter + 1;
const postIncrement = counter++;
console.log(`postIncrement: ${postIncrement}, counter: ${counter}`);
const postDecrement = counter--;
console.log(`postDecrement: ${postDecrement}, counter: ${counter}`);
let x = 3;
let y = 6;
x += y; // x = x + y;
x -= y;
x *= y;
x /= y;
console.log(10 < 6); // less than
console.log(10 <= 6); // less than or equal
console.log(10 > 6); // greater than
console.log(10 >= 6); // greatwe than or equal
||
(or) 하나라도 참이면 참&&
(and) 모두 참이면 참익스프레션이나 연산을 많이 하는 함수를 호출할 때 제일 뒤에다가 배치하는 것이 효율적
const value1 = false;
const value2 = 4 < 2;
console.log(`or: ${value1 || value2 || check()}`); // true
console.log(`and: ${value1 && value2 && check()}`); // false
//check는 true로 리턴 된다.
function check() {
for (let i = 0; i < 10; i++) {
console.log('🥲');
}
return true;
}
!
(not) 부정, 값을 반대로 바꿈console.log(!value1); // true
==
type이 다르면 type을 변경해서 연산 함===
type이 다르면 연산 불가const stringFive = '5';
const numberFive = 5;
// == loose equality, with type conversion
console.log(stringFive == numberFive); // true
console.log(stringFive != numberFive); // false
// === strict equality, no type conversion
console.log(stringFive === numberFive); // false
console.log(stringFive !== numberFive); // true
if 가 true면 그 안에 있는 블럭을 실행한다.
const name = 'ellie';
if (name === 'ellie') {
console.log('welcome, Ellie!');
} else if (name === 'coder') {
console.log('You are amazing coder');
} else {
console.log('unkwnon');
}
const name이 'coder'일 경우 if를 건너 뛰고 else if 안의 블럭 실행
const name이 'ellie'도 'coder'도 아닐 경우 else 안의 블럭 실행
조건이 true이면 왼쪽의 값을 false이면 오른쪽의 값을 가짐
console.log(name === 'ellie' ? 'yes' : 'no');
스위치 안에 있는 값이 일치할 때 해당하는 값을 출력함
const browser = 'IE';
switch (browser) {
case 'IE':
console.log('go away!');
break;
case 'Chrome':
case 'Firefox':
console.log('love you!')
break;
default:
case 'Chrome':
console.log('same all!')
break;
}
while은 statement가 false가 나오기 전까지 반복함
let i = 3;
while (i > 0) {
console.log(`while: ${i}`);
i--;
}
// while: 3
// while: 2
// while: 1
먼저 블럭을 실행한 다음, 출력이 된 후에 조건의 참 거짓을 판단한 다음 멈춤
do {
console.log(`do while: ${i}`);
i--;
} while (i > 0);
// do while: 0
for (begin; condition; step)
처음에 begin을 한번만 호출하고 블럭을 실행하기 전에 컨디션이 참인지 거짓인지 검사한 다음 블럭이 실행되면 스텝을 진행함
for (i = 3; i > 0; i--) {
console.log(`for: ${i}`);
}
inline variable declaration
블럭 안에 지역 변수를 선언해서 작성하는 방법
for (let i = 3; i > 0; i = i - 2) {
console.log(`inline variable for: ${i}`);
}
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
console.log(`i: ${i}, j:${j}`);
}
}
for문 안에 다시 for문을 작성하게 되면 i가 0일 때 j가 0부터 9까지 반복하게 되고 다시 i가 1일 때 j가 0부터 9까지 반복하게 된다.
정보처리기사 공부 안 했으면 연산자 파트 보면서 한숨 쉬고 있었을텐데 미리 공부 해놔서 정말 다행이다. 뭐든지 공부해놓으면 쓸모가 있다...