thor.kim·2020년 1월 25일
0

I don't know JS

목록 보기
2/3
post-thumbnail

배열, 유사배열, 문자열 차이점

배열유사배열문자열
DescriptionArrayDOM으로 부터 받은 유사배열"abcde"
형식가변 값가변 값불변 값
Index접근OOO
배열메소드사용OOX
문자열메소드사용OOO

문자열의 순서를 뒤집는 코드 (abc => cba)

배열

var a = ["a", "b", "c"];
a.reverse(); // ["c", "b", "a"]

문자열

배열로 변경 후 reverse() 후에 다시 join으로 문자열로 병합
단 유니코드 문자가 섞여있는 경우(특수문자, 멀티바이트 문자) 동작하지 않음

var a = "abc";
var c = a.split("").reverse().join(""); // "cba"

Esrever 라이브러리(reverse를 거꾸로 명명) 참조

숫자

Javascript 는 모든 숫자타입을 number 하나로 사용하도록 하고 있다.

작은 소수 값

잘 알려진 예외상황인 0.1 + 0.2 !== 0.3 에 대해서는 ES6에서 동등함을 비교할 수 있는 허용오차를 제공한다. 허용오차 값인 EPSILON을 사용하면 되는데, 아래와 같이 사용한다.

// Polyfill
if (Number.EPSILON) {
  Number.EPSILON = Math.pow(2, -52);
}

function numbersCloseEnoughToEqual(n1, n2) {
  return Math.abs(n1 - n2) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual(a, b); // true
numbersCloseEnoughToEqual(0.0000001, 0.0000002); // false

정수인지 확인

ES6에서는 정수를 확인할 수 있는 방법을 제공한다.
Number.isInteger() 를 사용하는데, ES6 이전 버전을 위한 Polyfill 은 다음과 같다.

if (!Number.isInteger) {
  Number.isInteger = function (num) {
    return typeof num == "number" && num % 1 == 0;
  }
}

숫자의 type이 number 이고 1로 나누었을때 나머지가 0인 값

안전한 정수인지 확인

안전한 정수란, 표현할 수 있는 범위 내의 정수인지 확인하는 것이다.
ES6에서는 Number.isSafeInteger()를 사용하는데, ES6이전 버전을 위한 Polyfill은 다음과 같다.

if (!Number.isSafeInteger) {
  Number.isSafeInteger = function (num) {
    return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER;
  }
}

특수 값

undefined

추천하지 않지만 undefined 라는 변수를 생성하여 값을 할당할 수 있다. 절대 비추

function foo() {
	var undefined = 2;
	console.log(undefined);
}
foo();	// 2

void 연산자

값이 존재하는 곳에서 그 값이 undefined가 되어야 좋을 경우에만 사용.

var a = 2;
console.log(void a, a); // undefined 2

특수 숫자

NaN

null === null // true
undefined === undefined // true
NaN === NaN // false

위와 같이 사실상 자신과 자신이 같이 않다고 식별되는 유일한 값이다.

그럼 NaN을 확인하는 방법은? isNaN() 으로 확인이 가능할까?

var a = 2 / "가나다";
var b = "가나다";

a; // NaN
b; // "a"

typeof a; // "number"
typeof b; // "string"

isNaN(a); // true
isNaN(b); // true

가나다 는 숫자가 아니지만 NaN도 아니어야 한다. ES6에서부터 제공하는 Number.isNaN을 보자.

var a = 2 / "가나다";
var b = "가나다";

a; // NaN
b; // "a"

typeof a; // "number"
typeof b; // "string"

Number.isNaN(a); // true
Number.isNaN(b); // false

다행히 기존의 window.isNaN()에서 있던 버그를 Number.isNaN()을 통해 수정되었다.

무한대

0 / 1; // 0
1 / 0; // Infinity
-1 / 0; // -Infinity
Infinity / 0; // 0
0 / Infinity; // 0
Infinity / Infinity; // NaN
-1 / Infinity; // -0
-1 / -Infinity; // 0

영(0)

-0+0
덧셈과 뺄셈에서는 -0이 나올일이 없지만, 특정 수식에서는 -0이 나온다.

var a = 0 / -3; // -0
var b = 0 * -3; // -0

명세에 의하면 -0을 문자열화 하게되면 항상 0이다.

a; // -0
a.toString(); // "0"
a + ""; // "0"
String(a); // "0"
JSON.stringify(a); // "0"

그러나, 반대의 경우

+"-0"; // -0
Number("-0"); // -0
JSON.parse("-0"); // -0

비교하는 구문에서조차

var a = 0;
var b = 0 / -3;

a == b; // true
-0 == 0; // true

a === b; // true
-0 === 0; // true

0 > -0; // false
a > b; // false

그리하여 정확히 -00을 구분하려한다면 다음과 같이 사용해야 한다.

function isNegZero(n) {
  n = Number(n);
  return (n===0) && (1 / n === -Infinity);
}

특이한 동등비교

ES6에서는 Object.is() 함수를 제공하여 이러한 상황을 해결할 수 있도록 제공된다.

Object.is(NaN, NaN); // true
Object.is(-0, -0); // true
Object.is(0, -0); // false

특이한 비교에서 위와 같이 쓰는것을 추천할 뿐 항상 쓰는것은 효율이 좋지 않기 때문에 바람직하지 않다.

값 vs 레퍼런스

어떤 값을 할당, 전달하는 경우 값-복사(value-copy) 또는 레퍼런스-복사(reference-copy)의 형태
자바스크립트는 사용하는 값의 타입에 따라 자동으로 결정되어진다.

// 값-복사
null
undefined
string
number
boolean
symbol

// 레퍼런스-복사
object
function
array
profile
회사원에서 개발자로

0개의 댓글