자바스크립트에서 숫자, 문자열, 불, 심벌, null, undefined 중 어느것에도 속하지 않는 값은 모두 객체입니다.
객체는 이름 붙은 값의 순서 없는 집합입니다.
배열은 값의 순서 있는 집합이며 각 값은 숫자로 표현됩니다(이름은 없습니다)
자바스크립트에는 기본적인 객체와 배열 외에도 유용한 객체 타입이 많습니다.
자바스크립트의 함수와 클래스는 그저 문법의 일부분이라고 볼 수는 없는데, 이 점이 다른 정적 언어와의 차이입니다. 자바스크립트의 함수와 클래스는 그 자체가 값이므로 프로그램에서 조작할 수 있습니다.
자바스크립트는 객체 지향 프로그래밍 스타일을 지원합니다.
대략적으로 말하자면, 함수가 다양한 타입의 값을 다루는 것이 아니라 객체(타입 자체)에 그 값을 다루는 메서드를 정의합니다.
예를 들어 배열 a의 요소를 정렬할 때 a를 sort() 함수에 전달하지 않습니다. 대신 다음과 같이 a의 sort() 매서드를 호출합니다.
a.sort()
자바스크립트이 객체 타입(Object Type or Reference Type)은 가변(mutable), 기본 타입(Primitive Type)은 불변(immutable)입니다.
자바스크립트는 값의 타입을 자유롭게 변환합니다.
예를 들어 .... 문자열이 와야할 곳에 숫자를 쓰면 자바스크립트는 자동으로 그 숫자를 문자열로 변환합니다.
자바스크립트는 상수와 변수의 이름을 통해 값을 참조합니다.
추가 공부
간단히 정리하면 우리의 일상 생활 숫자인 10진수를 컴퓨터 숫자인 2진수로 바꿀 때, 10진수로 소수인 수 중 2진수로 바꿀 수 없는 수가 존재한다.(ex. 0.3 => 0.01001100110011......(0011)의 무한 반복입니다.) 이 때 근삿값을 저장하게 되는데, 여기에는 두 가지 방법이 있다: 고정 소수점 표현과 부동 소수점 표현.
- 고정 소수점 표현법: 정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트 만큼만 사용해서 숫자를 표현하는 방식.
이렇게 약속 된 시스템에서 263.3을 표현하면 (0)0000000100000111.010011001100110 이렇게 표현됩니다.- 부동 소수점 표현: 이런 문제를 해결하기 위해서 소수점을 고정하지 않고 둥둥 떠 다닐 수 있게 하는 부동 소수점(floating point)을 사용하고 있습니다.
263.3을 부동 소수점 표현법으로 표현하면 100000111.010011001100110... 으로 표현되던 것을 맨 앞에 있는 1 바로 뒤로 소수점을 옮겨서 표현하도록 변환합니다. 그러면1.00000111010011001100110... * 2^8(2의 8승) 으로 표현 됩니다.
let x = .3-.2;
let y = .2-.1;
x === y; // => false: 두 값은 같지 않습니다.
x === .1; // => false: 0.3-0.2는 0.1과 같지 않습니다.
y === .1; // => true: 0.2-0.1은 0.1입니다.
나중에 체크하자
문자, 코드 포인트, 자바스크립트 문자열:
코드 포인트가 16비트를 넘는 유니코드 문자는 16비트 값 두 개를 연속으로 쓰는 UTF-16 으로 인코드합니다.
let euro = "€";
let love = "💖";
euro.length // => 1: 이 문자는 16비트 요소 하나입니다.
love.length // => 2: 💖는 UTF-16 인코딩으로, \ud83d\udc99 입니다.
문자열 리터럴: '', "", ``
작은 따옴표를 쓸 때는 문자열 안의 '앞에 \처리 해줘야 한다.
문자열 리터럴 안의 이스케이프 시퀀스:
자바스크립트에서 역슬래시()는 특별한 의미를 갖습니다.일반적인 방법으로 문자열에 표시할 수 없는 문자를 표현합니다.
'You\'re right, it can\'t be a quote'
문자열 다루기:
자바크립트는 length 프로퍼티 외에도 다양한 문자열 API가 있습니다.
let s = "Hello, world"; // 이 텍스트를 예제에 사용합니다.
//문자열 일부 가져오기
s.substring(1,4) //=>"ell"
s.slice(1,4) //=>"ell": 같은 결과
s.slice(-3) //=>"rld": 마지막 세 문자
s.split(",") //=>["Hello","world"]
//문자열 검색
s.indexOf("l") //=> 2: l이 처음 나타난 위치
s.indexOf("l",3) //=> 3: 3번 문자부터 시작해 l이 처음 나타난 위치
s.indexOf("zz") //=> -1: s에는 zz라는 문자열이 들어있지 않습니다.
s.lastIndexOf("l") //=> 10: l이 마지막으로 나타나는 위치
//불을 반환하는 검색 함수는 ES6에서 추가됐습니다.
s.startWith("Hell") //=> true: s는 Hell 로 시작.
s.endWith("!") //=> false: s는 !로 끝나지 x
s.includes("or") //=> true: s는 or이 들어있음.
// 문자열을 변경합니다.
s.replace("llo","ya") //=> "Heya, world"
s.toLowerCase() //=> "hello, world"
s.toUpperCase() //=> "HELLO, WORLD"
s.normalize() // 유니코드 NFC 정규화는 ES6에서 추가되었다.
s.normalize("NFD") // NFD 정규화. NFKC, NFKD도 있다.
//문자열의 각 16비트 문자를 검사
// 그냥 대괄호[]를 써서 접근할 수 도 있다. s.chartAt(0) 은 s[0] 의 결과와 같다.
s.charAt(0) //=> "H": 첫 번째 문자
s.charAt(s.length-1) //=> "d": 마지막 문자
s.charCodeAt(0) //=> 72: 주어진 위치의 16비트 숫자
s.codePointAt(0) //=> 72: 16비트보다 큰 코드 포인트에서 동작하는 ES6 기능
// 패딩 함수는 ES2017에서 추가됐습니다.
// *pad: 덧대다
"x".padStart(3) //=> " x": 왼쪽에 스페이스를 3개 더한다.
"x".padEnd(3) //=> "x ": 오른쪽에 스페이스 3개를 더한다.
"x".padStart(3, "*") //=> "**x": *를 왼쪽에 붙여 길이를 3에 맞춘다.
"x".padEnd(3, "-") //=> "x--": -를 오른쪽에 붙여 길이를 3에 맞춘다.
// 공백 제거 trim()은 ES5, 나머지는 ES2019 기능입니다.
" test ".trim() //=> "test": 앞뒤 공백을 제거
" test ".trimStart() //=> "test ": 왼쪽 공백 제거
" test ".trimEnd() //=> " test": 오른쪽 공백 제거
// 그 외의 문자열 메서드
s.concat("!") //=> "Hello, world!": +연산자를 쓰는게 더 간단하다. *concat: 연결하다
"<>".repeat(5) //=> "<><><><><>": n번 복사합니다. ES6에서 추가됐습니다.
템플릿 리터럴:
ES6부터는 백틱으로 감싼 문자열 리터럴을 사용할 수 있습니다. 하지만 이것은 일반적인 문자열 리터럴 문법과는 다르게, 임의의 자바스크립트 표현식을 넣을 수 있는 템플릿 리터럴 입니다.
let name = "Bill";
let greeting = `Hello ${name}.` // greeting == "Hello Bill."
태그된 템플릿 리터럴:
여는 백틱 바로 앞에 함수 이름(태그)이 있으면 템플릿 리터럴의 텍슽와 표현식 값이 함수에 전달됩니다.
// ES6에는 내장된 태그 함수 String.raw()가 있습니다. 역슬래시 이스케이프를 처리하지 않고 백틱 안의 텍스트를 반환합니다.
`\n`.length //=> 1: 이 문자열에는 뉴라인 문자 하나만 있습니다.
String.raw`\n`.length //=> 2: 역슬래시 문자와 n
패턴 매칭:
자바스크립트에는 문자열 내부의 패턴을 정의하고 매칭하는 정규 표현식(RegExp)이라는 데이터 값이 있습니다.
=> 정규식은 따로 공부하자. 책의 예제만 봐서는 모르겠다.
s.substring vs. s.slice
s.normalize() // 유니코드 NFC 정규화는 ES6에서 추가되었다.
s.normalize("NFD") // NFD 정규화. NFKC, NFKD도 있다.
정규표현식은 드림코딩엘리님 강의보면 좋아요! 근데 쓰는 건 저도 정말 힘들어요 ㅜㅜ