poiemaweb / javascript스터디 8

김정빈·2021년 10월 8일
0

스터디

목록 보기
8/8

1. Number 래퍼 객체

1-1. Number Constructor

  • Number 객체는 Number() 생성자 함수를 통해 생성할 수 있다.

    var x = new Number(123);
    var y = new Number('123');
    var z = new Number('str');
    
    console.log(x); // 123
    console.log(y); // 123
    console.log(z); // NaN
  • Number() 생성자 함수를 new 연산자를 붙이지 않고 사용하면 원시타입 Number를 반환한다. 이때 형 변환이 발생할 수 있다.

1-2. Number Property

1-2-1 Number.EPSILON (ES6)

  • Number.EPSILON은 JavaScript에서 표현할 수 있는 가장 작은 수이다. 이는 임의의 수와 그 수보다 큰 수 중 가장 작은 수와의 차이와 같다. Number.EPSILON은 약 2.2204460492503130808472633361816E-16 또는 2-52이다.

  • 부동소수점의 비교는 Number.EPSILON을 사용하여 비교 기능을 갖는 함수를 작성하여야 한다.

    • 부동소수점 산술 연산 비교는 정확한 값을 기대하기 어렵다. 정수는 2진법으로 오차없이 저장이
      가능하지만 부동소수점을 표현하는 가장 널리 쓰이는 표준인 IEEE 754은 2진법으로 변환시
      무한소수가 되어 미세한 오차가 발생할 수밖에 없는 구조적 한계를 갖는다.
    console.log(0.1 + 0.2);        // 0.30000000000000004
    console.log(0.1 + 0.2 == 0.3); // false!!!
    
    function isEqual(a, b){
      // Math.abs는 절댓값을 반환한다.
      // 즉 a와 b의 차이가 JavaScript에서 표현할 수 있는 가장 작은 수인 Number.EPSILON보다 작으면 같은 수로 인정할 수 있다.
      return Math.abs(a - b) < Number.EPSILON;
    }
    
    console.log(isEqual(0.1 + 0.2, 0.3));
    

1-2-2 Number.MAX_VALUE (ES1)

  • 자바스크립트에서 사용 가능한 가장 큰 숫자(1.7976931348623157e+308)를 반환한다. MAX_VALUE보다 큰 숫자는 Infinity이다.

1-2-3 Number.MIN_VALUE (ES1)

  • 자바스크립트에서 사용 가능한 가장 작은 숫자(5e-324)를 반환한다. MIN_VALUE는 0에 가장 가까운 양수 값이다. MIN_VALUE보다 작은 숫자는 0으로 변환된다.

1-2-4 Number.POSITIVE_INFINITY (ES1)

  • 양의 무한대 Infinity를 반환한다.

1-2-5 Number.NEGATIVE_INFINITY (ES1)

  • 음의 무한대 -Infinity를 반환한다.

1-2-6 Number.NaN (ES1)

  • 숫자가 아님(Not-a-Number)을 나타내는 숫자값이다. Number.NaN 프로퍼티는 window.NaN 프로퍼티와 같다.

1-3. Number Method

1-3-1 Number.isFinite(testValue: number): boolean (ES6)

  • 매개변수에 전달된 값이 정상적인 유한수인지를 검사하여 그 결과를 Boolean으로 반환한다.

    /**
     * @param {any} testValue - 검사 대상 값. 암묵적 형변환되지 않는다.
     * @return {boolean}
     */
    Number.isFinite(testValue)
    Number.isFinite()는 전역 함수 isFinite()와 차이가 있다. 전역 함수 isFinite()는 인수를 숫자로 변환하여 검사를 수행하지만 Number.isFinite()는 인수를 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false가 된다.
    
    Number.isFinite(Infinity)  // false
    Number.isFinite(NaN)       // false
    Number.isFinite('Hello')   // false
    Number.isFinite('2005/12/12')   // false
    
    Number.isFinite(0)         // true
    Number.isFinite(2e64)      // true
    Number.isFinite(null)      // false. isFinite(null) => true

1-3-2 Number.isInteger(testValue: number): boolean (ES6)

  • 매개변수에 전달된 값이 정수(Integer)인지 검사하여 그 결과를 Boolean으로 반환한다. 검사전에 인수를 숫자로 변환하지 않는다.
    /**
     * @param {any} testValue - 검사 대상 값. 암묵적 형변환되지 않는다.
     * @return {boolean}
     */
    Number.isInteger(testValue)
    Number.isInteger(123)   //true
    Number.isInteger(-123)  //true
    Number.isInteger(5-2)   //true
    Number.isInteger(0)     //true
    Number.isInteger(0.5)   //false
    Number.isInteger('123') //false
    Number.isInteger(false) //false
    Number.isInteger(Infinity)  //false
    Number.isInteger(-Infinity) //false
    Number.isInteger(0 / 0) //false

1-3-3 Number.isNaN(testValue: number): boolean (ES6)

  • 매개변수에 전달된 값이 NaN인지를 검사하여 그 결과를 Boolean으로 반환한다.

    /**
     * @param {any} testValue - 검사 대상 값. 암묵적 형변환되지 않는다.
     * @return {boolean}
     */
    Number.isNaN(testValue)
    Number.isNaN()는 전역 함수 isNaN()와 차이가 있다. 전역 함수 isNaN()는 인수를 숫자로 변환하여 검사를 수행하지만 Number.isNaN()는 인수를 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false가 된다.
    
    Number.isNaN(NaN)       // true
    Number.isNaN(undefined) // false. undefined → NaN. isNaN(undefined) → true.
    Number.isNaN({})        // false. {} → NaN.        isNaN({}) → true.
    Number.isNaN('blabla')  // false. 'blabla' → NaN.  isNaN('blabla') → true.
    
    Number.isNaN(true)      // false
    Number.isNaN(null)      // false
    Number.isNaN(37)        // false
    Number.isNaN('37');     // false
    Number.isNaN('37.37');  // false
    Number.isNaN('');       // false
    Number.isNaN(' ');      // false
    Number.isNaN(new Date())             // false
    Number.isNaN(new Date().toString())  // false. String → NaN. isNaN(String) → true.

1-3-4 Number.isSafeInteger(testValue: number): boolean (ES6)

  • 매개변수에 전달된 값이 안전한(safe) 정수값인지 검사하여 그 결과를 Boolean으로 반환한다. 안전한 정수값은 -(2^53 - 1)와 2^53 - 1 사이의 정수값이다. 검사전에 인수를 숫자로 변환하지 않는다.
    /**
     * @param {any} testValue - 검사 대상 값. 암묵적 형변환되지 않는다.
     * @return {boolean}
     */
    Number.isSafeInteger(testValue)
    Number.isSafeInteger(123)   //true
    Number.isSafeInteger(-123)  //true
    Number.isSafeInteger(5-2)   //true
    Number.isSafeInteger(0)     //true
    Number.isSafeInteger(1000000000000000)  // true
    Number.isSafeInteger(10000000000000001) // false
    Number.isSafeInteger(0.5)   //false
    Number.isSafeInteger('123') //false
    Number.isSafeInteger(false) //false
    Number.isSafeInteger(Infinity)  //false
    Number.isSafeInteger(-Infinity) //false
    Number.isSafeInteger(0 / 0) //false

1-3-5 Number.prototype.toExponential(fractionDigits?: number): string (ES3)

  • 대상을 지수 표기법으로 변환하여 문자열로 반환한다. 지수 표기법이란 매우 큰 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승이 곱하는 형식으로 수를 나타내는 방식이다.

    • 1234 = 1.234e+3
    /**
     * @param {number} [fractionDigits] - 0~20 사이의 정수값으로 소숫점 이하의 자릿수를 나타낸다. 옵션으로 생략 가능하다.
     * @return {string}
     */
    numObj.toExponential([fractionDigits])
    var numObj = 77.1234;
    
    console.log(numObj.toExponential());  // logs 7.71234e+1
    console.log(numObj.toExponential(4)); // logs 7.7123e+1
    console.log(numObj.toExponential(2)); // logs 7.71e+1
    console.log(77.1234.toExponential()); // logs 7.71234e+1
    console.log(77.toExponential());      // SyntaxError: Invalid or unexpected token
    console.log(77 .toExponential());     // logs 7.7e+1
  • 자바스크립트 엔진은 숫자 뒤의 .을 부동 소수점 숫자의 일부로 해석한다.

    • 77.toExponential()과 같이 쓰면 .을 소수의 .으로 해석하기 때문에 에러가 발생한다. 그래서 toExponential뿐만 아니라 정수에 대하여 메서드를 쓸때는(77).toExponential()과 같이 숫자를 명시적으로 알려주면 좋다.

1-3-6 Number.prototype.toFixed(fractionDigits?: number): string (ES3)

  • 매개변수로 지정된 소숫점자리에 대하여 숫자를 반올림하여 문자열로 반환한다.

    /**
     * @param {number} [fractionDigits] - 0~20 사이의 정수값으로 소숫점 이하 자릿수를 나타낸다. 기본값은 0이며 옵션으로 생략 가능하다.
     * @return {string}
     */
    numObj.toFixed([fractionDigits])
    var numObj = 12345.6789;
    
    // 소숫점 이하 반올림
    console.log(numObj.toFixed());   // '12346'
    // 소숫점 이하 1자리수 유효, 나머지 반올림
    console.log(numObj.toFixed(1));  // '12345.7'
    // 소숫점 이하 2자리수 유효, 나머지 반올림
    console.log(numObj.toFixed(2));  // '12345.68'
    // 소숫점 이하 3자리수 유효, 나머지 반올림
    console.log(numObj.toFixed(3));  // '12345.679'
    // 소숫점 이하 6자리수 유효, 나머지 반올림
    console.log(numObj.toFixed(6));  // '12345.678900'

1-3-7 Number.prototype.toPrecision(precision?: number): string (ES3)

  • 매개변수로 지정된 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다. 지정된 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다.

    /**
     * @param {number} [precision] - 1~21 사이의 정수값으로 전체 자릿수를 나타낸다. 옵션으로 생략 가능하다.
     * @return {string}
     */
    numObj.toPrecision([precision])
    var numObj = 15345.6789;
    
    // 전체자리수 유효
    console.log(numObj.toPrecision());   // '12345.6789'
    // 전체 1자리수 유효, 나머지 반올림
    console.log(numObj.toPrecision(1));  // '2e+4'
    // 전체 2자리수 유효, 나머지 반올림
    console.log(numObj.toPrecision(2));  // '1.5e+4'
    // 전체 3자리수 유효, 나머지 반올림
    console.log(numObj.toPrecision(3));  // '1.53e+4'
    // 전체 6자리수 유효, 나머지 반올림
    console.log(numObj.toPrecision(6));  // '12345.7'

1-3-8 Number.prototype.toString(radix?: number): string (ES1)

  • 숫자를 문자열로 변환하여 반환한다.

    /**
     * @param {number} [radix] - 2~36 사이의 정수값으로 진법을 나타낸다. 옵션으로 생략 가능하다.
     * @return {string}
     */
    numObj.toString([radix])
    var count = 10;
    console.log(count.toString());   // '10'
    console.log((17).toString());    // '17'
    console.log(17 .toString());     // '17'
    console.log((17.2).toString());  // '17.2'
    
    var x = 16;
    console.log(x.toString(2));       // '10000'
    console.log(x.toString(8));       // '20'
    console.log(x.toString(16));      // '10'
    
    console.log((254).toString(16));  // 'fe'
    console.log((-10).toString(2));   // '-1010'
    console.log((-0xff).toString(2)); // '-11111111'

1-3-9 Number.prototype.valueOf(): number (ES1)

  • Number 객체의 원시 타입 값(primitive value)을 반환한다.

    var numObj = new Number(10);
    console.log(typeof numObj); // object
    
    var num = numObj.valueOf();
    console.log(num);           // 10
    console.log(typeof num);    // number

2. 수학 상수와 함수를 위한 MATH객체

  • Math 객체는 수학 상수와 함수를 위한 프로퍼티와 메소드를 제공하는 빌트인 객체이다.
  • Math 객체는 생성자 함수가 아니다. 따라서 Math 객체는 정적(static) 프로퍼티와 메소드만을 제공한다.

2-1. Math Property

2-1-1 Math.PI

  • PI 값(π ≈ 3.141592653589793)을 반환한다.

2-2. Math Method

2-2-1 Math.abs(x: number): number (ES1)

  • 인수의 절댓값(absolute value)을 반환한다. 절댓값은 반드시 0 또는 양수이어야 한다.
    Math.abs(-1);       // 1
    Math.abs('-1');     // 1
    Math.abs('');       // 0
    Math.abs([]);       // 0
    Math.abs(null);     // 0
    Math.abs(undefined);// NaN
    Math.abs({});       // NaN
    Math.abs('string'); // NaN
    Math.abs();         // NaN

2-2-2 Math.round(x: number): number (ES1)

  • 인수의 소수점 이하를 반올림한 정수를 반환한다.
    Math.round(1.4);  // 1
    Math.round(1.6);  // 2
    Math.round(-1.4); // -1
    Math.round(-1.6); // -2
    Math.round(1);    // 1
    Math.round();     // NaN

2-2-3 Math.ceil(x: number): number (ES1)

  • 인수의 소수점 이하를 올림한 정수를 반환한다.
    Math.ceil(1.4);  // 2
    Math.ceil(1.6);  // 2
    Math.ceil(-1.4); // -1
    Math.ceil(-1.6); // -1
    Math.ceil(1);    // 1
    Math.ceil();     // NaN

2-2-4 Math.floor(x: number): number (ES1)

  • 인수의 소수점 이하를 내림한 정수를 반환한다. Math.ceil의 반대 개념이다.
    • 양수인 경우, 소수점 이하를 떼어 버린 다음 정수를 반환한다.
    • 음수인 경우, 소수점 이하를 떼어 버린 다음 -1을 한 정수를 반환한다.
    Math.floor(1.9);  // 1
    Math.floor(9.1);  // 9
    Math.floor(-1.9); // -2
    Math.floor(-9.1); // -10
    Math.floor(1);    // 1
    Math.floor();     // NaN

2-2-5 Math.sqrt(x: number): number (ES1)

  • 인수의 제곱근을 반환한다.
    Math.sqrt(9);  // 3
    Math.sqrt(-9); // NaN
    Math.sqrt(2);  // 1.414213562373095
    Math.sqrt(1);  // 1
    Math.sqrt(0);  // 0
    Math.sqrt();   // NaN

2-2-6 Math.random(): number (ES1)

  • 임의의 부동 소수점을 반환한다. 반환된 부동 소수점은 0부터 1 미만이다. 즉, 0은 포함되지만 1은 포함되지 않는다.

2-2-7 Math.pow(x: number, y: number): number (ES1)

  • 첫번째 인수를 밑(base), 두번째 인수를 지수(exponent)로하여 거듭제곱을 반환한다.
    Math.pow(2, 8);  // 256
    Math.pow(2, -1); // 0.5
    Math.pow(2);     // NaN
  • 비슷한 기능을 하는 연산자가 있다. Exponentiation operator로 ES7문법이다.
    • 2 ** 8; // 256

2-2-8 Math.max(…values: number[]): number (ES1)

  • 인수 중에서 가장 큰 수를 반환한다.

    // 배열 요소 중에서 최대값 취득
    const arr = [1, 2, 3];
    const max = Math.max.apply(null, arr); // 3
    
    // ES6 Spread operator
    Math.max(...arr); // 3

2-2-9 Math.min(…values: number[]): number (ES1)

  • 인수 중에서 가장 작은 수를 반환한다.

    Math.min(1, 2, 3); // 1
    
    // 배열 요소 중에서 최소값 취득
    const arr = [1, 2, 3];
    const min = Math.min.apply(null, arr); // 1
    
    // ES6 Spread operator
    Math.min(...arr); // 1

0개의 댓글