자바스크립트 배열에는 이상한 짓을 할 수 있다. (이런 짓은 하지 말자)
빈 슬롯을 만들 수 있다.
var a = [];
a[0] = 1;
// a[1]은 건너 뛰고
a[2] = [3];
a[1]; // undefined;
a.length; // 3
매열에 문자열 타입의 키/프로퍼티를 둘 수 있다.
var a = [];
a["13"] = 42;
a.length; // 14
function foo() {
// ES6 이전의 코드
var arr = Array.prototype.slice.call(arguments);
// ES6 부터의 코드
var arr = Array.from(arguments);
arr.push("bam");
console.log(arr);
}
foo("bar", "baz"); // ["bar", "baz", "bam"]
c = a.toUpperCase(); a === c; // false a; // “foo” c; // “FOO”
b.push(“!”); b; // [“f”, “o”, “o”, “!”] ```
불변 배열 메서드 : 사용해도 배열이 변하지 않는 메서드 ```javascript a.join; // undefined a.map; // undefined
var c = Array.prototype.join.call(a, “-“); var d = Array.prototype.map.call(a, function(v) { return v.toUpperCase() + “.”; })
c; // “f-o-o” d; // “F.O.O”
// a 자체가 변한게 아니라는 점에 주목하자!!
a.reverse; // undefined b.reverse(); // [”!”, “o”, “O”, “f”] (변한 값을 리턴) b; // [”!”, “o”, “O”, “f”] (배열 자체가 변함)
// reverse는 가변 메서드라서 빌려쓰는것조차 불가능!!! Array.prototype.reverse.call(a); ```
toExponential()
메서드의 결과값과 같다.
var a = 5E10;
a; // 50000000000
a.toExponential(); // "5e+10"
var b = a * a;
b; // 2.5e+21
var c = 1 / a;
c; // 2e-11
Number.porototype
메서드로 접근할 수도 있다.toFixed()
메서드 (지정한 소수점 이하 자릿수까지 나타냄)
var a = 42.59;
a.toFixed(0); // "43"
a.toFixed(1); // "42.6"
a.toFixed(2); // "42.59"
a.toFixed(3); // "42.590"
0.1 + 0.2 === 0.3; // false
// Number.EPSILON 폴리필
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
Number.MAX_VALUE
(1.798e+308)보다 훨씬 작은 수준에서 안전 값의 범위가 정해져 있다.Number.MAX_SAFE_INTEGER
로 정의한다.// Number.isInteger() 사용 (ES6부터만 지원)
// 아래는 폴리필
if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == "number" && num % 1 == 0;
};
}
Number.isInteger(42); //
void __
는 어떤 값이든 무효로 만들어, 항상 결과값을 undefined로 만든다.
var a = 42;
console.log(void a, a); // undefined 42
function doSomething() {
// 'APP.ready'는 이 애플리케이션에서 제공한 값이다.
if (!APP.ready) {
// 나중에 다시해라!!
return void setTimeout(doSomething, 100);
}
var result;
// 별더 처리 수행
return result;
}
// 제대로 처리 했나?
if (doSomething()) {
// 다음 작업 바로 실행
}
if (!APP.ready) {
// 나중에 다시해라!!
setTimeout(doSomething, 100);
return;
}
var a = 2 / "foo"; // NaN
typeof a === "number" // true
ㅋㅋㅋㅋㅋ 숫자가 아님은 숫자다 ㅋㅋㅋ ```javascript var a = 2 / “foo”;
a == NaN; // false a === NaN; // false
>NaN은 너무 귀하신 몸이라 다른 어떤 NaN과도 동등하지 않다. ( 자기 자신과도 같지 않다;; )
- `isNaN()`이라는 함수로 NaN 여부를 구별할 수 있으나, 진짜 숫자가 아니면 전부 true를 반환해버린다 ;; ㅠㅠ
```javascript
a = 2 / "foo";
b = "foo";
a; // NaN
b; // "foo"
window.isNaN(a); // true
window.isNaN(b); // true ;;;;;;
Number.isNaN()
을 사용하면 된다.
// ES6이전 버전 - Number.isNaN() 폴리필
if (!Number.isNaN) {
Number.isNaN = function(n) {
return (
typeof n === "number" && window.isNaN(n)
);
};
}
Object.is()
// Ojbect.is() 폴리필
if (!Object.is) {
Object.is = function (v1, v2) {
// "-0" 테스트
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
// "NaN" 테스트
if (v1 !== v1) {
return v2 !== v2;
}
// 기타
return v1 === v2;
};
}
var a = 2/ "foo";
var b = -3 * 0;
Object.is(a, NaN); // true
Object.is(b, -0); // true
Object.is(b, 0); // false
function foo() {
x = x + 1; // 이 과정에서 다시 언박싱되어서 더이상 Number로 박싱된 객체가 아님
x; // 3
}
var a = 2;
var b = new Number(a);
foo(b);
console.log(b); // 3이 아닌 2