[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() 함수를 지원함.
그러나 == 나 ===를 사용하고 특수한 경우에만 사용하자.
'Javascript' 카테고리의 다른 글
reducer - 리듀서 (0) | 2020.12.29 |
---|---|
[js] Promise API 의 3가지 상태 (0) | 2020.09.04 |
[js] 자바스크립트 원시타입 (0) | 2020.05.23 |
[문제 풀이] 모든 단어 거꾸로 뒤집기 (0) | 2020.01.17 |
[React] webpack 빌드 순서 이해하기 (0) | 2019.12.31 |