자바스크립트 완벽 가이드 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
, BigInt
Object
Array
, 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
, split
indexOf
, lastIndexOf
, startsWith
, endsWith
, includes
, charAt
replace
, toLowerCase
, toUpperCase
repeat
trim
, trimStart
, trimEnd
padStart
, 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
는 1
false
는 0
console.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