원시값
: 원시형의 값
: 문자, 숫자, bigint, 불린, 심볼, null, undefined 형
객체
: 프로퍼티에 다양한 종류의 값을 저장 할 수 있음
: 중괄호를 사용해 만들 수 있고, 함수도 객체의 일종
원시값은 원시값 그대로 남겨둬 단일 값 형태를 유지
문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근할 수 있도록 언어 차원에서 허용
이를 가능 하기 위해, 원시값이 메서드나 프로퍼티에 접근하려 하면 추가 기능을 제공해주는 특수한 객체
원시 래퍼 객체(Object wrapper)
를 만들어주고, 이 객체는 곧 삭제된다.
예를 들면,
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
1 / 문자열 str은 원시값이므로 원시값의 프로퍼티에 접근하는 순간 특별한 객체가 만들어진다.
2 / 메서드가 실행되고, 새로운 문자열이 반환 (alert창에 출력)
3 / 특별한 객체는 파괴되고, 원시값 str만 남는다.
💬 단어가 익숙하지 않았는데, 쓰면서 다시 읽으니까 이해가 되고있다.
각 원시타입에 맞는 매서드를 쓸 수 있고, 매서드를 쓸 수 없는 원시 타입도 있다.
원시값에 메서드를 실행하면, 객체에 잠시 저장되고 원하는대로 출력이된다.
숫자 사이에 '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는 같은 수임
toString(base)
: base
진법으로 num
을 표현한 후, 문자형으로 변환해 반환
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진법을 잘 모르겠다.
✏️숫자를 입력할 때까지 반복하기
➡️
❌ 오답
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)
는 min
과 max
사이에 값을 나오게 하는데 가능한 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) );
💬 설명을 봐도 이해가 되지 않는다.. 이정도면..수학문제아닌가....
💬 오늘의 느낀점
일단 처음에 원시값이 이해가 잘 안되었는데, 한번 따라 치면서 읽으니까
평소에 쓰고 있던 것들이 원시값이였는데 개념 정리가 부족했던 거 같다.
숫자형에 다양한 메서드는 자주 쓰는것이였는데, 어떻게 작동되나 확인 할 수 있었다.
요즘 학습했던 코딩테스트에서 쓰고 응용했었는데, 막상 위에 문제들을 풀려니까 적용이 너무 안되었다..😡😭