
자바스크립트 완벽 가이드 7판 스터디
책의 목차를 따라가며 관련 내용을 학습하고 공유하는 스터디입니다.
이 장에서 기억해야 할 핵심은 다음과 같습니다.
- 자바스크립트에서 숫자와 문자열을 만들고 조작하는 법
- 자바스크립트법의 다른 기본 타입인 불, 심벌, null, undefined를 다루는 법
- 불변인 기본 타입과 가변인 참조 타입의 차이
- 자바스크립트가 묵시적으로 타입을 변환하는 과정, 그리고 프로그램에서 직접 변환하는 법
- 상수 변수를 선언하고 초기화하는 법(분해 할당 포함), 선언하는 변수와 상수의 어휘적 스코프
자바스크립트 완벽 가이드 7판, p.68
1. 데이터 타입 분류
2. Number Type
3. String Type
4. Boolean Type
5. null, undefined
6. 타입 체크
7. 타입 변환
8. 변수 선언과 할당
9. let, const
10. Scope, Scope Chain
11. 호이스팅
12. 구조 분해 할당
Primitive(기본형) & Reference(참조형)Number, String, Boolean, null, undefined, Symbol, BigIntObjectArray, Function, RegExp, Set, Map, Date 등부호(1비트), 가수부(11비트), 지수부(52비트) = 64비트number 타입 하나만 있음_ 구분자 사용 가능console.log(Number(123));
const integer = 789; // 789 (정수)
const negative = -789; // -789 (음수)
const double = 7.89; // 7.89 (실수)
const binary = 0b1101; // 13 (2진수)
const octal = 0o733; // 475 (8진수)
const hex = 0x6b; // 107 (2진수)
const splited = 1_000_000; // 1000000
NaN을 확인하기위해서는 isNaN을 사용console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(789 / 'code'); // NaN
console.log(0 / 0); // NaN
console.log(Infinity / -Infinity); // NaN
const nan = 789 / 'code';
console.log(isNaN(nan)); // true
const study = Number('스터디'); // 문자열 '스터디'를 숫자형으로 변환 시도
console.log(study); // NaN
Infinity 반환-Infinity 반환0과 -0은 같다.console.log(0 === -0); // true
console.log(Infinity / -Infinity); // false
console.log(1 / 0); // Infinity
console.log(1 / -0); // -Infinity
2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체n을 붙이거나(10n) 함수 BigInt()를 호출해 생성const theBiggestInt = 9007199254740991n; // 9007199254740991n
const alsoHuge = BigInt(9007199254740991); // 9007199254740991n
console.log(theBiggestInt === alsoHuge); // true
console.log(theBiggestInt + alsoHuge); // 18014398509481982n
console.log(theBiggestInt + 789); // TypeError: Cannot mix BigInt and other types, use explicit conversions
// 0이상 ~ 1미만의 랜덤한 숫자
console.log(Math.random());
// 최대값, 최소값
console.log(Math.max(5, 10, 3)); // 10
console.log(Math.min(5, 10, 3)); // 3
// 올림, 반올림, 내림, 소수점 아래 자르기
console.log(Math.ceil(-3.3)); // -3
console.log(Math.round(-3.4)); // -3
console.log(Math.floor(-3.7)); // -4
console.log(Math.trunc(-3.7)); // -3
// 절대값
console.log(Math.abs(-5.5)); // 5.5
// -1, 0, 1 반환
console.log(Math.sign(-123)); // -1
console.log(Math.sign(0)); // 0
console.log(Math.sign(123)); // 1
// 1 ~ 9 중에 뽑기
console.log(Math.floor(Math.random() * 10));
length 프로퍼티를 갖음const str1 = "큰따옴표 안에 '작은따옴표' 있다";
const str2 = '작은따옴표 안에 "큰따옴표" 있다';
const empty_string = '';
const length = 'abcd'; // 4
const a = 'str';
const b = 'ing';
console.log(a + b); // string
console.log(a.concat(b)); // string
==, === 사용const str = '123';
const num = 123;
console.log(str === num); // false
console.log(str == num); // true
const str1 = 'abcd';
const str2 = 'ab';
const str3 = 'abd';
const str4 = 'aba';
const str5 = 'bbcd';
console.log(str1 > str2); // true
console.log(str1 < str3); // true
console.log(str1 > str4); // true
console.log(str1 < str5); // true
${} 가로 안에 표현식을 넣음const today = new Date();
const templated = `오늘 날짜: ${today}`;
console.log(templated);
const stringWithEscape = 'Hello\nWorld!!\t\t\tCode\\\u005C';
console.log(stringWithEscape);
// Hello
// World!! Code\
substring, slice, splitindexOf, lastIndexOf, startsWith, endsWith, includes, charAtreplace, toLowerCase, toUpperCaserepeattrim, trimStart, trimEndpadStart, padEnd!! 사용let 참 = true;
let 거짓 = false;
console.log(참); // true
console.log(거짓); // false
값이 없거나 0, -0, null, false, NaN, undefined, 빈 문자열 ("")이라면 객체의 초기값은 false가 됩니다.
문자열 "false"를 포함한 그 외 모든 다른 값은 초기값을 true로 설정합니다.
console.log(!!0, !!-0, !!null, !!false, !!NaN, !!undefined, !!''); // 전부 false
console.log(!!123, !!-123, !![], !!{}, !!' ', !!-Infinity, !!'str'); // 전부 true
true 는 1false 는 0console.log(true > false); // true (1 > 0)
console.log(true == false); // false (1 == 0)
console.log(true < false); // false (1 < 0)
console.log(true == 1); // true
console.log(false == 0); // true
undefined 대신 null을 사용하는 것이 좋다.let value;
console.log(value); // undefined
value = null;
console.log(value); // null
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof 123); // number
console.log(typeof NaN); // number
console.log(typeof 'str'); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof [1, 2, 3]); // object
console.log(typeof { 1: 'one' }); // object
// 배열 체크
console.log(Array.isArray([1, 2, 3])); // true
Number(), String(), (Boolean(), !! , +toString() valueOf() : 대부분의 자료형에 내장console.log(typeof Number('123')); // number
console.log(typeof String(123)); // string
console.log(Boolean(123)); // true
console.log(!!0); // false;
console.log(typeof +'111'); // number
console.log(typeof (2 - '1')); // number (1)
console.log(typeof (2 * '111')); // number (222)
console.log(typeof (2 / 'a')); // number (NaN)
if (1) {
console.log(true);
} else if (0) {
console.log(false);
}
var, let, const// let a = 1;
let a; // 변수 선언 : let은 키워드, a는 변수이름 또는 식별자
a = 1; // 할당: 변수 a에 값 1 할당, =는 할당연산자
a = 10; // 재할당: 변수 a에 값 2 재할당

book를 선언하면,1002을 확보book를 지정
guide를 book에 할당하면,guide를 우선 비어있는 메모리 공간에 저장(5002)book가 가리키는 주소로 이동

Definitive를 book에 재할당하면,
book를 찾아서 값을 5005로 변경함
자바스크립트 완벽 가이드가 두 곳에 할당되어 있음
study.title === study.books[0] => 비교하는데 오래 걸림

불변값var는 함수 스코프)let : 재할당 가능const : 재할당 불가능const 사용 : 불필요한 오류 가능성을 남길 필요가 없음let 사용let a = 1;
a = 2;
const b = 2;
b = 3; // TypeError: Assignment to constant variable.
// 상수: 대문자로 작성하는 경우가 많음
const API_KEY = '12341234';
// 상수 변수
const man = {
name: 'Hee',
age: '10',
};
man = { name: 'Go', age: '20' }; // TypeError: Assignment to constant variable.
man.name = 'Go';
console.log(man); // { name: 'Go', age: '10' };
// 객체 내부 데이터 변경은 가능하다. => 참조형 데이터의 할당에서 같이 봐야함
식별자(변수, 함수, 클래스)가 유효한 범위Block Scope, Function Scope{...} 자체가 Block Scope가 된다.const d = 5;
if (true) {
var a = 1;
const b = 2;
let c = 3;
}
console.log(a); // 1
console.log(d); // 5
console.log(b); // ReferenceError: b is not defined
console.log(c); // ReferenceError: c is not defined
let sum = 0;
for (let i = 0; i < 10; i++) {
sum += i; // {}밖에 있지만 내부에서 동작
}
console.log('sum:', sum); // sum: 45
console.log('i:', i); // ReferenceError: i is not defined
{
let a = 10;
{
let a = 20;
console.log(a); // 20 : 현재 스코프에서 찾음
}
console.log(a); // 10 : 1단계 위 스코프에서 찾음
}
console.log(a); // ReferenceError: a is not defined : 최상위 스코프까지 탐색헀는데 없음
function hasValue(p) {
if (p) {
var v = 'blue';
console.log(v); // blue
}
console.log(v); // blue
}
hasValue(true);
// 함수의 선언문 전에 호출이 가능하다.
hello('a'); // Hello a
function hello(name) {
console.log('Hello ' + name);
}
hello('b'); // Hello b
// apple이 초기화되기 전에 접근할 수 없다.
// apple이 선언되기 전인데 apple을 알고있음 => 호이스팅
// let, const, class는 선언만 호이스팅되고 초기화는 안된다.
// 자바스크립트는 초기화되지 않은 변수에 접근할 수 없다.
console.log(apple); // ReferenceError: Cannot access 'apple' before initialization
let apple = 'iphone';
console.log(apple); // iphone
const apple = 'iphone';
{
console.log(apple); // ReferenceError: Cannot access 'apple' before initialization
let apple = 'galuxy';
}
const person = { nickname: 'aaa', age: 20, job: 'developer' };
const { nickname, age, job } = person;
console.log(nickname, age, job); // aaa, 20, developer
console.log(person.nickname, person.age, person.job); // aaa, 20, developer