[자바스크립트] 자료형에 대한 메소드

2020년 10월 26일, 23:17

원시값에 대한 메소드들이 존재할 수 있는 이유?

우리는 string이나 number를 할당한 변수에 여러가지 메소드를 사용할 수 있다.

이때, 원시값을 가지는 특별한 객체를 만들었다가 객체에서 메소드를 실행하고 새로운 값이 반환되는 것이다.

숫자형에서의 메소드들

num.toString(base)

  • base에 바꿀 진수를 넣으면 된다.(기본값은 10, 2~36까지 가능)

부정확한 계산

숫자는 내부적으로 64비트 형식 IEEE-754으로 표현되기 때문에 숫자를 저장하려면 정확히 64비트가 필요합니다. 64비트 중 52비트는 숫자를 저장하는 데 사용되고, 11비트는 소수점 위치를(정수는 0), 1비트는 부호를 저장하는 데 사용됩니다.

이유

숫자는 0과 1로 이루어진 이진수로 변환되어 연속된 메모리 공간에 저장됩니다. 그런데 10진법을 사용하면 쉽게 표현할 수 있는 0.10.2 같은 분수는 이진법으로 표현하면 무한 소수가 됩니다.

0.1은 1을 10으로 나눈 수인 1/10입니다. 10진법을 사용하면 이러한 숫자를 쉽게 표현할 수 있죠. 1/10과 1/3을 비교해봅시다. 1/3은 무한 소수 0.33333(3)이 됩니다.

이렇게 10의 거듭제곱으로 나눈 값은 10진법에서 잘 동작하지만 3으로 나누게 되면 10진법에서 제대로 동작하지 않습니다. 같은 이유로 2진법 체계에서 2의 거듭제곱으로 나눈 값은 잘 동작하지만 1/10같이 2의 거듭제곱이 아닌 값으로 나누게 되면 무한 소수가 되어버립니다.

10진법에서 1/3을 정확히 나타낼 수 없듯이, 2진법을 사용해 0.1 또는 0.2를 정확하게 저장하는 방법은 없습니다.

IEEE-754에선 가능한 가장 가까운 숫자로 반올림하는 방법을 사용해 이런 문제를 해결합니다. 그런데 반올림 규칙을 적용하면 발생하는 '작은 정밀도 손실’을 우리가 볼 수는 없지만 실제로 손실은 발생합니다.

배열의 메서드

  • reduceRight
    • reduce와 반대로 배열의 마지막 원소부터 실행
  • find, filter, map 의 경우 두 번째 인자로 bind할 대상을 넘겨줄 수 있다.

Object

Object.entries 함수는 객체를 맵으로 바꿔줌.

Object.fromEntries 함수는 맵을 객체로 바꿔줌.

const m = new Map([
    ["a",1],
    ["b",2],
    ["c",3]
]);

console.log(m.get("a")); // 1

const obj = {
    a:1,
    b:2,
    c:3
};

const m2 = new Map(Object.entries(obj));
console.log(m2.get("a")); // 1

const obj2 = Object.fromEntries(m2.entries());
console.log(obj2); // { a: 1, b: 2, c: 3 }

Weak map과 weak set

자바스크립트의 가비지 컬렉터는 해당 값으로 도달 가능하면 메모리에서 삭제하지 않는다.

그래서 Map, set의 원소로 객체를 저장하게 되면 객체를 null로 바꿔준다 하더라도 삭제가 일어나지 않는다.

하지만, weak map,set은 객체만 저장할 수 있고 객체의 값이 null이 되면 삭제해준다.

Json.stringify

순환 참조가 있는 object에는 사용 불가

let room = {
  number: 23
};

let meetup = {
  title: "Conference",
  participants: [{name: "John"}, {name: "Alice"}],
  place: room // meetup references room
};

room.occupiedBy = meetup; // room references meetup

alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
/*
{
  "title":"Conference",
  "participants":[{"name":"John"},{"name":"Alice"}],
  "place":{"number":23}
}
*/

두 번째 인자로 뽑고 싶은 key를 전달하면 해당 값만 뽑힌다.

세 번째 인자는 space의 유무이다(가독성을 높여줌)

Json.parse

두 번째 인자로 reviver를 사용할 수 있다.

let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

let meetup = JSON.parse(str, function(key, value) {
  if (key == 'date') return new Date(value);
  return value;
});

console.log( meetup.date.getDate() ); // 30

참고

https://ko.javascript.info/object-methods