변수(variable)는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 or 그 메모리 공간을 식별하기 위해 붙인 이름 (값의 위치를 가리키는 상징적인 이름)
let a = 10;
const b = 10 + 5; // 15
<<memory>> |
---|
10 (메모리 주소.. 0X0000F2) |
... |
5 |
... |
15 |
{ name: ‘Kim’, age: 12 } |
10 + 5
연산이 수행되어 생성된 15라는 값도 임의의 메모리 주소에 저장되고 15
라는 값을 재사용하기 위해 변수 a
에 값을 할당한다.자바스크립트의 변수는 자료형과 관련없이 모든 값이 할당될 수 있다. 이처럼 동적으로 타입이 변경될 수 있는 언어를 '동적 타입 언어'라고 부른다.
암호 등 큰 숫자가 필요하거나 높은 정밀도를 요하는 작업엔 일반 number(-(253-1) < num < (253-1)(9007199254740991)) 이상의 숫자가 필요하기 때문에 BigInt를 사용한다.
undefined는 자바스크립트 엔진이 값의 초기화를 위해 넣는 값(개발자의 의도적 할당X)
null은 값이 비어있음을 표시하기 위해 개발자가 의도적으로 할당한 값
let a = 1;
console.log(a); // 1
a = 2;
console.log(a); // 2
key-value
로 구성되어 있다.const student = {
name: 'Kim',
age: 12
};
name
, age
'Kim'
, 12
const student = {
name: 'Kim',
age: 12
};
console.log(student.name); // 'Kim'
console.log(student['name']); // 'Kim'
student.name = 'Lee';
console.log(student.name); // 'Lee'
student
라는 변수가 바라보고 있는 메모리 주소는 바뀌지 않았다.name
이라는 key의 value가 변경된 것배열은 여러 값을 순차적으로 나열한 자료구조 (index로 값을 찾는다)
const arr = [1, 2, 3]; // 배열
const obj = { a: 1, b: 2 } // 객체
console.log(arr[1]); // 2
console.log(obj.b); // 2
console.log(obj['b']); // 2
자바스크립트는 타입 변경이 자유롭고 자바스크립트 엔진이 코드를 평가하는 중 개발자의 의도와 무관하게 암묵적 타입 변환이 발생하거나 개발자가 의도를 갖고 명시적 타입 변환을 할 수 있다.
암묵적 타입 변환
1 + '2' // '12'
1 + '' // '1'
-1 + '' // '-1'
0 + '' // '0'
-0 + '' // '0'
NaN + '' // 'NaN'
true + '' // 'true'
false + '' // 'false'
null + '' // 'null'
undefined + '' // 'undefined'
[] + '' // ''
[1, 2] + '' // '1, 2'
+ '' // 0
+ '0' // 0
+ '1' // 1
+ true // 1
+ false // 0
+ null // 0
+ undefined // NaN
if('') // false
if(true) // true
if(0) // false
if('name') // true
if(null) // false
명시적 타입 변환
string 타입으로 변환
String(1) // '1'
String(true); // 'true'
number 타입으로 변환
Number('1') // 1
parseInt('1') // 1
boolean 타입으로 변환
Boolean('a') // true
Boolean('') // false
Boolean('false') // true
Boolean(null) // false
==, ===
== 는 값이 일치하는 지 확인하고, === 는 값과 타입이 모두 일치하는지 확인한다.
느슨한 타입(loosely typed)의 동적(dynamic) 언어의 문제점은 무엇이고 보완할 수 있는 방법에는 무엇이 있을지 생각해보세요.
또한 자바스크립트는 자료형을 미리 선언하는 것이 아니라 런타임에 타입이 결정되는 동적 언어로 의도치 않은 타입 변경이 발생할 수 있다.
if문은 (...) 조건문을 평가하고 결과를 boolean
으로 return한다.
if (year == 2015) {
alert( "정답입니다!" );
alert( "아주 똑똑하시네요!" );
}
피연산자 중 하나라도 true이면 true 반환, 피연산자 모두 false이면 false 반환
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
모든 피연산자가 true이면 true 반환, 그 외에는 false 반환
// 첫 번째 피연산자가 truthy이면, AND는 두 번째 피연산자를 반환
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// 첫 번째 피연산자가 falsy이면, AND는 첫 번째 피연산자를 반환하고 두 번째 피연산자는 무시
alert( null && 5 ); // null
alert( 0 && "아무거나 와도 상관없습니다." ); // 0
if를 ||나 &&로 대체하지 말 것
let x = 1;
(x > 0) && alert( '0보다 큽니다!' );
(if문)
let x = 1;
if (x > 0) alert( '0보다 큽니다!' );
AND 연산자 &&를 if문을 ‘짧게’ 줄이는 용도로 사용하는 경우가 있다. &&를 사용한 코드가 더 짧긴 하지만 if문을 사용한 예시가 코드에서 무엇을 구현하고자 하는지 더 명백히 드러내고, 가독성도 좋다.
(원래 개인적으로 자주 쓰던 방식이었는데 왠만하면 안 써야겠다. 안 좋은 방식이라는 걸 이제야 알았다.)
NOT 연산자는 인수를 하나만 받고, 다음 순서대로 연산을 수행한다.
alert( !true ); // false
alert( !0 ); // true
함수란 어떤 작업을 수행하기 위해 필요한 문(statement)들의 집합을 정의한 코드 블록이다.
자바스크립트의 함수는 일급 객체이다.
함수 선언문
function square(number) {
return number * number;
}
함수 표현식
const square = function(number) {
return number * number;
};
화살표(=>
)를 사용하여 기존 함수 표현식보다 간결한 방식으로 표현한 함수
// 화살표 함수
const func = (arg1, arg2, ...argN) => expression
// 함수 표현식
const func = function(arg1, arg2, ...argN) {
return expression;
};
https://ko.javascript.info/first-steps
https://poiemaweb.com/js-data-type-variable
https://poiemaweb.com/js-function
https://poiemaweb.com/js-this