DAY 5 - javascript

연주·2022년 11월 18일
0

TIL

목록 보기
13/37

22.11.18 금

DAY 5 - javascript (기초다지기)

📌 원시값의 메서드

  • 원시값
    : 원시형의 값
    : 문자, 숫자, bigint, 불린, 심볼, null, undefined 형

  • 객체
    : 프로퍼티에 다양한 종류의 값을 저장 할 수 있음
    : 중괄호를 사용해 만들 수 있고, 함수도 객체의 일종

  1. 원시값을 객체처럼 사용하기
  • 원시값은 원시값 그대로 남겨둬 단일 값 형태를 유지

  • 문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근할 수 있도록 언어 차원에서 허용

  • 이를 가능 하기 위해, 원시값이 메서드나 프로퍼티에 접근하려 하면 추가 기능을 제공해주는 특수한 객체
    원시 래퍼 객체(Object wrapper)를 만들어주고, 이 객체는 곧 삭제된다.

    예를 들면,

let str = "Hello";

alert( str.toUpperCase() ); // HELLO

1 / 문자열 str은 원시값이므로 원시값의 프로퍼티에 접근하는 순간 특별한 객체가 만들어진다.
2 / 메서드가 실행되고, 새로운 문자열이 반환 (alert창에 출력)
3 / 특별한 객체는 파괴되고, 원시값 str만 남는다.

💬 단어가 익숙하지 않았는데, 쓰면서 다시 읽으니까 이해가 되고있다.
각 원시타입에 맞는 매서드를 쓸 수 있고, 매서드를 쓸 수 없는 원시 타입도 있다.
원시값에 메서드를 실행하면, 객체에 잠시 저장되고 원하는대로 출력이된다.


📌 숫자형

  1. 다양한 숫자 접근법
숫자 사이에 'e'를 넣으면 'e' 만큼 0을 붙이면 된다.  

let billion = 1e9;  // 10억, 1과 9개의 0

alert( 7.3e9 );  // 73억 (7,300,000,000)

let ms = 0.000001;
let ms = 1e-6; // 1에서 왼쪽으로 6번 소수점 이동

소수점 일떄난, 소수점은 n번 이동하는 것

2.16진수, 2진수, 8진수

alert( 0xff ); // 255

let a = 0b11111111; // 255의 2진수
let b = 0o377; // 255의 8진수

alert( a == b ); // true, 진법은 다르지만, a와 b는 같은 수임
  1. toString(base)
    : base진법으로 num 을 표현한 후, 문자형으로 변환해 반환

  2. parseInt와 parseFloat
    : 불가능할 때까지 숫자를 읽는다
    : 숫자를 읽는 도중에 오류가 발생하면 이미 수집한 숫자를 반환

💬 숫자로 바뀌는거로 알고 있었는데, 저런 원리로 바뀌는 거를 새로 알게되었다.

📖 풀어보기

✏️ 수를 입력받아 덧셈하기
사용자에게 두 수를 입력받고, 두 수의 합을 출력해주는 스크립트를 작성해보세요
➡️

let num1 = +prompt ('첫번째 숫자를 입력하세요')
let num2 = +prompt ('두번째 숫자를 입력하세요')
alert(num1 + num2)

✏️6.35.toFixed(1) == 6.3인 이유는 무엇일까요?

➡️ toFixed 매서드로인 해, 소수점 첫번째자리까지 남긴다.
그래서 6.3이 된다.

<예시>

alert( 1.35.toFixed(1) ); // 1.4

<문제>

alert( 6.35.toFixed(1) ); // 6.3

위 예시와 유사한 아래의 경우, 6.35가 6.4가 아닌 6.3으로 반올림되는 이유는 무엇일까요?

<해답>

💬해답을 보고도 이해가 어렵다.
일단 2진법 무한소수라는 말도 너무 생소하고, 16진법 2진법을 잘 모르겠다.

✏️숫자를 입력할 때까지 반복하기

  • 사용자가 유효한 숫자형 값을 입력할 때까지 계속 입력받는 함수 readNumber 를 만들어보세요.
  • 반환되는 값은 꼭 숫자형 값이어야 합니다.
  • 사용자가 아무 입력도 하지 않거나 '취소’를 누르면 입력받기를 멈추고 null을 반환하세요.

➡️

❌ 오답

function readNumber () {
  let num = +prompt('숫자를 입력하세요')
  
  if ( typeof(num) === 'number') {
    alert(num)
  } else if (num === null) {
    readNumber()
  } else{
    alert('숫자를 입력해주세요')
  }
}

readNumber()

문제점
자꾸 틀려서 짜증난다ㅠ
입력 할때까지 prompt창을 띄어야하니까 반복문을 돌려야한다.
무조건 prompt는 띄어야하니까 do while문을 사용해
먼저 do를 하고 조건에 맞지 않으면 반복을 멈춘다.
그래서 멈춘 후, if문을 실행한다.

⭕️ 정답

function readNumber() {
  let num;

  do {
    num = prompt("Enter a number please?", 0);
  } while ( !isFinite(num) );

  if (num === null || num === '') return null;

  return +num;
}

alert(`Read: ${readNumber()}`);

✏️ 최소에서 최대까지 임의의 숫자
-내장 함수 Math.random()는 에서 까지 임의의 값을 생성합니다 (0에서 1 / 1은 포함하지 않음)

-random(min, max)에서 까지 임의의 부동 소수점 숫자를 생성하는 함수를 작성하십시오 ( min 과 max 사이 / max는 포함하지 않음)

// Math.random() 꼭 이용해서 임의의 값 생성 
// 0~1사이에 값이 생성된다.

// min ~ max 사이에 값만 출력되야함
function random(min, max) {
  return min + Math.random() * (max - min);
}

➡️ 어떻게 해야 나오나 고민을 했는데, 해답은 저것이였다.
0.n 에 (최대값 - 최소값)을 곱하면 최대값보다 무조건 작고, min은 최소 1일텐데 1 보다 작아서 꼭 최소값을 더해줘야한다.

✏️최소에서 최대까지 임의의 정수
randomInteger(min, max)minmax사이에 값을 나오게 하는데 가능한 min 과 max 값을 모두 포함하는
min..max 간격의 모든 숫자 동일한 확률로 나타나야 합니다.

작업의 예:

alert( randomInteger(1, 5) ); // 1
alert( randomInteger(1, 5) ); // 3
alert( randomInteger(1, 5) ); // 5

➡️

function randomInteger(min, max) {
  let num = min + Math.random() * (max - min)
  // 위에서 계산함
  // min.nnnnnn ~ max.nnnn
  let result =  Math.round(num)
  return result;
}
alert( randomInteger(1, 3) );

값은 나오지만, 문제는 동일한 확률로 나타내는것

⭕️ 동일한 확률로 나오려면

function randomInteger(min, max) {
  // here rand is from min to (max+1)
  let rand = min + Math.random() * (max + 1 - min);
  return Math.floor(rand);
}

alert( randomInteger(1, 3) );

💬 설명을 봐도 이해가 되지 않는다.. 이정도면..수학문제아닌가....


💬 오늘의 느낀점
일단 처음에 원시값이 이해가 잘 안되었는데, 한번 따라 치면서 읽으니까
평소에 쓰고 있던 것들이 원시값이였는데 개념 정리가 부족했던 거 같다.
숫자형에 다양한 메서드는 자주 쓰는것이였는데, 어떻게 작동되나 확인 할 수 있었다.
요즘 학습했던 코딩테스트에서 쓰고 응용했었는데, 막상 위에 문제들을 풀려니까 적용이 너무 안되었다..😡😭

profile
성장중인 개발자🫰

0개의 댓글