[js] 자바스크립트 Value

chanto11

·

2020. 5. 23. 23:39

배열

1. 자바스크립트의 배열은 어떤 타입의 값을 가질 수 있다. 

    var arr = [ 1, "2", [3], {4:4}, 0.5 ]

 

2. 배열의 크기를 정하지 않아도 되고, 원하는 값을 추가하면 된다.

    var arr[5] = "hello js"

    var arr[6] = 1234

 

3. 구멍난 배열을 조심하라.

    a[0] = 0
    a[2] = 2
    a.length    // 3

    a.[1]  //  undefined

 

4. 프로퍼티 키 표현식으로 추가할 수 있다. 단 length가 증가하지 않는다.

    a["hello"] = "hello"
    a.length   // 3

 

5. 키로 넣는 문자열이 10진수 숫자 타입으로 바뀌면서 숫자 키를 사용한 것 같다. ※주의※

    a["7"] = 777

    a.length   // 8

 

유사 배열

자바스크립트에서 배열도 객체이다. 그러나 유사배열은 진짜배열은 아닌데 배열처럼 생긴 객체이다.

그래서 유사배열은 배열의 메소드를 사용할 수 없다.

그렇기 때문에 배열의 메소드를 사용하기 위해서는 call이나 apply를 사용하여야 한다.

     ex) Array.prototype.forEach.call(),  [].forEach.call()

     ※ ES6 부터는 Array.from()을 사용한다.  ex) Array.from(유사배열).forEach()

 

문자열

문자열이 문자 배열이 아니였다...

자바스크립트 문자열은 문자 배열과 같지 않다고 한다.

문자열은 앞에서 말한 유사배열이다.

    var b = "hello"
    Array.isArray(b)  //  false

문자열은 Immutable 이지만 배열은 Mutable 이다. 

 

문자열은 Immutable 하기 때문에 배열 메소드를 빌려 사용할 수 없다.

그렇기 때문에 문자열을 배열로 바꾸어 작업을 하여 다시 문자열로 반환해야한다.

이러한 꼼수를 Hack(핵)이라 부른다고 한다.

    var c = b   //  "hello"
    c.split("").reverse().join("")  //  "olleh"

    ※ 복잡한 문자가 썪여 있는 경우 유니코드를 처리하는 라이브러리가 필요하다고 함.

이러한 작업을 빈번하게 사용한다면 문자 배열로 문자열을 처리하는 방법이 있다.

 

숫자

자바스크립트는 모든 숫자를 number 타입 하나로 표시한다.

  •   부동 소수점 값이 없으면 정수다. ( 5.0  ->  5 )
  •   소수점 앞의 값이 0이면 생략가능 ( 0.5  ->  .5 ) ※ 가독성 ↓
  •   소수점 뒤의 값이 0이여도 생략가능 ( 5.0  ->  5. ) ※ 가독성 ↓
  •   아주크거나 아주작은 값은 지수형으로 표기가능 ( 50000000000  ->  5E10  ->  "5e+10" )
  •   아주크거나 아주작은 값을 bigint로 표기가능 (2^53-1) 보다 큰 값 혹은 -(2^53-1) 보다 작은 정수 
      정수 끝에 'n'만 붙이면 사용  ex)  const bigInt = 1234567890123456789012345678901234567890n

  ※  이 글이 작성된 시점에서 IE 와 safari 는 bigint 를 지원하지 않음.

 

  •  소숫점 이하 자릿수 지정 toFixed() 사용. 반올림됨.  ex)  var d = 5.49  -> d.toFixed(1) // 5.5
  •  toPrecision()도 비슷하지만  toFixed()는 소숫점이하 갯수지정    toPrecision()는 전체 숫자갯수 지정

  ※  5 .toFixed( 3 ) 이나 5..toFixed( 3 ) 같이 쓸 수 있지만 그러지말자.... 제발...

 

  •  다른 진법 표기가능  ex)  0x□,  0o□,  0b11110011    ※  0o -> 0O으로 사용은 되나 쓰지말자 소문자로 사용.

  ※  ES6 에서 엄격모드 사용시 8진수 표기 제한

 

  • 작은 소수 값  0.1 + 0.2 === 0.3 // false 다  0.1 + 0.2 는 0.30000000000000004 이다. 
  • 미세한 오차를 '머신 입실론'이라고 하는데 ES6 부터는 Number.EPSILON 으로 이미 정의되어 있음.

   ex)  const x = 0.2, y = 0.3, z = 0.1;       let equal = (Math.abs(x - y + z) < Number.EPSILON);

 

  • ES6 에서 안전한 정수 범위를 Number.MAX_SAFE_INTEGER ~ Number.MIN_SAFE_INTEGER 로 정의.
    더 큰 수는 bigint를 사용하여 표기 
    64비트 ID처리할 때 대부분 사용하지만 숫자 타입으로는 정확히 표시할 수 없음으로 string타입을 사용함.
  • 정수 확인 ES6 부터 Number.isIntrger() 로 정수 여부 확인
    안전한 정수 확인
    ES6 부터 Number.isSafeIntrger() 로 정수 여부 확인

특수 값

  • undefined 과 null 은 타입과 값이 항상 같다.
  • null은 식별자가 아닌 특별한 키워드이다 그러나 undefined는 식별자로 쓸 수 있다 하지만 사용하지 말자.
  • void 연산자는 어떤 값이든 항상 결과를 undefined로 만든다.   ex)  void 1 === undefined

특수 숫자

  • NaN 는  Not A Number '숫자 아님'이지만 Invalid '유효하지 않는 숫자'가 더 정확한 의미
    NaN 는 숫자 타입이다.      typeof NaN === "number"  //  true
    수학 연산 실패 후 실패한 숫자(NaN)을 반환한다.
    NaN 는 어떤 NaN과 동등하지 않다. 유일무이한 값이다. 
    isNaN()을 통해 확인해야한다. 하지만 숫자만 아니면 모두 NaN으로 인식한다.
    ES6 부터는 Number.isNaN()을 사용하면 더 안전하게 체크할 수 있다.
  •  1 / 0  ->  Infinity      1 / Infinity  ->  0         
  • -1 / 0  -> -Infinity     -1 / Infinity  -> -0 
  •  JSON.parse("-0")  ->  -0 이지만 JSON.stringify(-0)  ->  "0" 이다
  •  0 === -0  //  true      0  > -0  //  false
  • +0, -0 개념은 변수의 이동 방향성을 알기위해 존재
  • -0을 확인하기위해 isNegZero함수를 사용. ES6부터는 두 값을 절대적으로 동등한지 알려주는 Object.is() 함수를 지원함.
    그러나 == 나 ===를 사용하고 특수한 경우에만 사용하자.