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