
This is what I learned:
▪️ 자바스크립트에서 사용하는 자료는 크게 기본자료형(primitives)/ 객체 자료형(object)로 구분할 수 있다.
> const a = [] //a라는 이름의 배열을 선언
undefined
> a.내맘대로속성 = 10 // 배열에 속성 지정
10
> a.sample // 배열이 속성을 가질 수 있다는 것을 알 수 있음
10
> function b () { } // 함수 b를 선언
undefined
> b.내맘대로속성 = 10 // 함수에 속성 지정
10
> b.sample // 함수가 속성을 가질 수 있다는 것을 알 수 있음
10
> const c = 10 // 기본 자료형인 숫자로 만들어 봄 시도
undefined
> c.sample = 20 // c.sample = 20이 들어간 것처럼 보이지만
20
> c.sample // 실제로 출력해봤을때 제대로 된 값이 나오지 않음
undefined
💡 짚고 넘어가기
- 기본 자료형: 속성과 메소드 가질 수 X
- 객체 자료형 : 속성과 메소드 가질 수 O
이때 어떤 대상이 배열인지 확인하려면 “Array.isArray()” 메소드를 사용함
> const a = []
undefined
>typeof(a)
"object"
> Array.isArray(a)
true
> Array.isArray(10)
false
> Array.isArray({})
false
— 이전에 자료형변환을 할 때 Number(), Boolean(), String() 함수를 사용했는데, 이 앞에 new 를 붙여주게 되면 기본 자료형을 넣었을 때 객체로 만들게 됨. (ex. new Number())
> const a = new Number(10)
undefined
> const b = new String('문자열')
undefined
> const c = new Boolean(true)
undefined
> typeof(a) + ' ' + typeof(b) + ' ' + typeof(c)
"object object object" // typeof(a)typeof(b)typeof(c) 모두 object로 뜸
//new Number()을 사용해서 숫자를 생성하면 숫자와 관련된 연산자도 모두 활용 가능,속성과 메소드 활용 가능
> const f new Number(273)
undefined
> typeof f
"object"
> f.sample = 10
10
> f.sample // 속성을 가질 수 있음
10
> f
Number {273, sample: 10} //콘솔에서 단순하게 f를 출력하면 객체형태로 출력됨
//숫자와 똑같이 활용할 수 있고 valueOf()메소드를 사용해 값 또한 추출 가능
> f + 0
273
> f.valueOf()
273
⚠️ WARNING ⚠️ : new 키워드를 사용하지 않을 시, 함수가 자료형 변환 기능으로 작동됨
> const g = Number(273)
undefined
> typeOf g
"number" // 객체 아님
문자열 자료형 등을 생성하고 뒤에 온점을 찍으면 다음과 같이 자동 완성 기능으로 메소드들이 나오는 것을 알 수 있다.
또한 실행도 가능하다.
> '안녕하세요'.anchor('greeting')
"<a name="greeting">안녕하세요</a>"
> '안녕하세요'.bold()
"<b>안녕하세요</b>"
앞에서 설명했듯이 기본 자료형은 속성과 메소드를 가질 수 없는데 이와 같이 가지고 있는 이유는?
자바스크립트는 사용의 편리성을 위해서 기본 자료형의 속성과 메소드를 호출할 때 (기본 자료형 뒤에 온점을 찍고 무언가 하려고 하면) 일시적으로 기본 자료형을 객체로 승급시킨다. ⇒ 속성과 메소드를 사용 가능
BUT, 이러한 승급은 일시적!
sample 속성에 기본 자료형이 추가되는것 처럼 보이지만 실제로는 추가되지 않은 현상이 일어남
> const h = 'Hello'
undefined
> h.sample = 10 // 일시적으로 객체가 승급되어 sample 속성 추가 가능
10
> h.sample // 일시적으로 승급된 것이라 추가했던 sample 속성은 이미 사라지는 현상 발생
undefined
이는 승급때 잠시 속성이라는 새 옷을 입었다가 바로 뺏긴다고 생각하면 이해하기 쉽다.
따라서 기본 자료형의 경우 속성과 메소드를 사용할 수는 있지만, 속성과 메소드를 추가로 가질 수는 없다고 생각하면 된다.
그렇다면 승급 때 일시적으로 입는 새 옷 자체를 변경하면 어떻게 될까?
아래 프로토타입(prototype)으로 메소드 추가하기에서 알아보자.
객체 자료형 이름.prototype.메소드 이름 = function () {
} // 객체 자료형 이름 = Number , String, Boolean
[example]
> Number.prototype.sample = 10 // Number.prototype에 sample이라는 속성 추가하면
10
> const i = 273
undefined
> i.sample //sample 속성을 갖고 있음
10
몇가지 예를 살펴보자면,
최신 자바스크립트에는 제곱 연산자(**)가 있다. 이를 사용하면 아래와 같이 숫자를 n제곱할 수 있다

이를 활용해 숫자 자료형에 n제곱하는 메소드를 추가해보자면,

코드에서 this.valueOf()로 숫자 값을 꺼냈다.그냥 this ** n 을 해도 아무 문제없이 계산된다.
하지만 객체 내부에서 값을 꺼내 쓰는 것임을 명확하게 하기 위해서는 valueOf() 메소드를 사용하는 것이 일반적이다.
이렇게 프로토타입에 메소드를 추가하면 이를 활용해서 숫자를 제곱할 수 있다.
함수를 생성 할 때 기본 매개변수도 사용했다.
여기서 기본 매개변수란 ->function (n=2) -> n = 2 === let n = 2 같은 말이다.
[example]
indexOf() 메소드를 사용한다.
자바스크립트에는 어떠한 문자열 내부에 어떠한 문자열이 포함되어 있는지를 알수 있는 메소드가 따로 없다. 그래서 어떠한 문자열 내부에 어떠한 문자열이 포함되어 있는지를 알수있는 방법은 indexOf() 메소드를 활용을 해서
문자열.indexOf('찾을 문자열') >= 0로 알아볼 수 있다.
문자열의 indexOf() 메소드를 사용하는 예를 알아보자.

프로토타입(prototype)이란 일시적으로 승급이 일어나는 옷이며 여기다가 메소드를 추가해서 기본자료형이 추가적인 메소드를 활용할 수 있게 하는 녀석이다! 라는 것을 꼭 기억해두자
🔻 toFixed()
Number 객체에서 자주 사용하는 메소드 toFixed() 이다소수점을 가진 숫자.toFixed(나타낼 소수점자리수)
[example]

'string'이다isNaN() , isFinite()
🔻 isNaN()

어떤 숫자가 NaN(Not a Number)인지 또는 infinity(무한)인지 확인할 때는
Number.isNaN()
Number.isFinite()
메소드를 사용한다.
이 메소드들은 숫자 자료형 뒤에 온점을 찍고 사용하는 것이 아니라 Number 뒤에 점을 찍고 사용한다.
우선 isNaN() 을 알아본다.
🔖 isOO() 로 시작되는 메소드들은 true 또는 false를 리턴함, 나중에 이러한 메소드를 보면 이게 무엇을 리턴하는지 예상할 수 있다.
위 같이 NaN과 비교해서는 NaN인지 확인할 수 없다.그래서 NaN인지 확인할 때는isNaN() 메소드를 써준다.
> const m = Number('숫자로 변환할 수 없는 경우')
undefined
> m // NaN을 생성한다
NaN
> m === NaN // NaN과 비교해서는 NaN인지 확인할 수 없음
false
> Number.isNaN(m)
true
🔻 isFinite()
Infinity는 무한대 숫자를 의미한다.Infinity라고 표현한다.isFinite() 는 말그대로 유한한가? 라는 뜻이기때문에 유한한 숫자인지 확인하는 메소드이다.> const n = 10 / 0
undefined
> n
Infinity // 양의 무한대를 생성함
> const o = -10 / 0
undefined
> o
-Infinity // 음의 무한대를 생성함
// isFinite(유한한 숫자인가?)가 false로 나옴
> Number.isFinite(n)
false
> Number.isFinite(o)
false
// 일반적인 숫자는 셀 수 있으므로 true가 나옴
> Number.isFinite(1)
true
> Number.isFinite(10)
true
무한대 숫자는 양의 무한대 음의 무한대 숫자로 나뉜다.
isFinite()메소드가 false인 경우는 양의 무한대 숫자와 음의 무한대 숫자 2가지 경우이다.
그리고 Infinity와 직접 비교해봐도 확인할 수 있다.
> a === Infinity
true
> b === -Infinity
true