본문으로 건너뛰기

Ch2. 값

2.1 배열

  • 여러 타입을 담을 수 있음
  • delete 연산자 가능

구멍난 배열

var a = [];
a[0] = 1;
a[2] = [3];

a[1]; // undefined
a.length; // 3

문자열 index

var a = [];
a[0] = 1;
a["footbar"] = 2;

a.length; // 1
a["footbar"]; // 2
a.footbar; // 2

string 타입 숫자 index

var a = [];
a["13"] = 42;
a.length; // 14

→ 해로운 버그, 그냥 쓰지 말자…

유사 배열

function aaa(a, b, c) {
console.log(arguments);
console.log(typeof arguments); // object
}
  • arguments는 유사 배열
  • Array.from()으로 변환 가능

2.2 문자열

  • 배열처럼 보이지만 immutable
  • a[1] = "O" 은 변경되지 않음

Array 메서드 차용

var a = "foo";

var c = Array.prototype.join.call(a, '-'); // "f-o-o"
var d = Array.prototype.map.call(a, v => v.toUpperCase() + '.'); // ["F.", "O.", "O."]

→ 유니코드 문자열은 주의 (2바이트)


2.3 숫자

  • JS는 정수/실수 구분 없이 number 타입 하나

부동 소수점 이슈

0.1 + 0.2 === 0.3 // false

function closeEnough(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}

안전한 정수

  • Number.isSafeInteger() 사용
  • 64bit 정수는 문자열로 다루는 게 일반적

2.4 특수 값

undefined

undefined = 3;
console.log(undefined); // 3 (non-strict mode)

void 연산자

<a href="javascript:void(0)">???</a>

NaN

typeof NaN // "number"
NaN === NaN // false

2.5 값 vs 레퍼런스

값 복사

  • null, undefined, string, number, boolean, symbol

참조 복사

  • object, array, function, 기타 합성 타입

함수 내 참조

function foo(x) {
x.push(4);
}
var a = [1, 2, 3];
foo(a);
console.log(a); // [1, 2, 3, 4]

박싱과 값 복사

function foo(x) {
x = x + 1;
}
var a = new Number(2);
foo(a);
console.log(a); // 2

2.6 정리

  • 값에는 다양한 타입이 있다
  • 원시값과 참조값의 복사 방식이 다르다
  • 숫자 관련 연산은 항상 정확하지 않을 수 있다 (부동소수점, EPSILON 활용)