배열 | 유사배열 | 문자열 | |
---|---|---|---|
Description | Array | DOM으로 부터 받은 유사배열 | "abcde" |
형식 | 가변 값 | 가변 값 | 불변 값 |
Index접근 | O | O | O |
배열메소드사용 | O | O | X |
문자열메소드사용 | O | O | O |
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 라는 변수를 생성하여 값을 할당할 수 있다. 절대 비추
function foo() {
var undefined = 2;
console.log(undefined);
}
foo(); // 2
값이 존재하는 곳에서 그 값이 undefined가 되어야 좋을 경우에만 사용.
var a = 2;
console.log(void a, a); // undefined 2
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
이 나온다.
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
그리하여 정확히 -0
과 0
을 구분하려한다면 다음과 같이 사용해야 한다.
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
특이한 비교에서 위와 같이 쓰는것을 추천할 뿐 항상 쓰는것은 효율이 좋지 않기 때문에 바람직하지 않다.
어떤 값을 할당, 전달하는 경우 값-복사(value-copy) 또는 레퍼런스-복사(reference-copy)의 형태
자바스크립트는 사용하는 값의 타입에 따라 자동으로 결정되어진다.
// 값-복사
null
undefined
string
number
boolean
symbol
// 레퍼런스-복사
object
function
array