{name : "John", age : 30}
와 같이 대괄호 {}를 사용해 만들 수 있습니다. 자바스크립트에는 여러 종류의 객체가 있는데, 함수도 객체의 일종임str.toUpperCase()
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
String/Number/Boolean를 생성자론 쓰지 맙시다.
몇몇 상황에서 혼동을 불러일으킴
null/undefined는 메서드가 없습니다.
특수 자료형인null
과undefined
의 원시값(null/undefined)은 위와 같은 법칙을 따르지 않습니다. 이 자료형과 연관되는 "래퍼 객체"도 없고, 메서드도 제공하지 않습니다. 어떤 의미에서는 두 자료형이 "가장 원시적"이라 할 수 있음
요약
0이 많이 붙은 큰 숫자는 다음과 같은 방법을 사용해 씁니다.
- 0의 개수를 'e' 뒤에 추가합니다. 123e6은 0이 6개인 숫자, 123000000을 나타냅니다.
- 'e' 다음에 음수가 오면, 음수의 절댓값 만큼 10을 거듭제곱한 숫자로 주어진 숫자를 나눕니다. 123e-6은 0.000123을 나타냅니다.
다양한 진법을 사용할 수도 있습니다.
- 자바스크립트는 특별한 변환 없이 16진수(0x), 8진수(0o), 2진수(0b)를 바로 사용할 수 있게 지원합니다.
- parseInt(str, base)를 사용하면 str을 base진수로 바꿔줍니다(단, 2 ≤ base ≤ 36).
- num.toString(base)는 숫자를 base진수로 바꾸고, 이를 문자열 형태로 반환합니다.
12pt나 100px과 같은 값을 숫자로 변환하는 것도 가능합니다.
- parseInt/parseFloat를 사용하면 문자열에서 숫자만 읽고, 읽은 숫자를 에러가 발생하기 전에 반환해주는 ‘약한’ 형 변환을 사용할 수 있습니다.
소수를 처리하는 데 쓰이는 메서드는 다음과 같습니다.
- Math.floor, Math.ceil, Math.trunc, Math.round, num.toFixed(precision)를 사용하면 어림수를 구할 수 있습니다.
- 소수를 다룰 땐 정밀도 손실에 주의하세요.
e
왼쪽의 수에 e
오른쪽에 있는 수만큼의 10의 거듭제곱을 곱하는 효과let billion = 1e9; // 10억, 1과 9개의 0
alert( 7.3e9 ); // 73억 (7,300,000,000)
let ms = 1e-6; // 1에서 왼쪽으로 6번 소수점 이동
// 16진수
alert( 0xff ); // 255
alert( 0xFF ); // 255 (대·소문자를 가리지 않으므로 둘 다 같은 값을 나타냅니다.)
// 2진수
let a = 0b11111111; // 255의 2진수
// 8진수
let b = 0o377; // 255의 8진수
num.toString(base)
메서드는 base
진법으로 num
을 표현한 후, 이를 문자형으로 변환해 반환함base
는 2~36
, 기본값은 10
let num = 255;
alert( num.toString(16) ); // ff
alert( num.toString(2) ); // 11111111
점 두 개와 메서드 호출
123456..toString(36)
(123456).toString(36)
Math.floor
Math.ceil
Math.round
Math.trunc
(IE에서 지원하지 않음)소수점
n-th
번째 수를 기준으로 어림수를 구할 때
곱하기와 나누기
소수점 두 번째 자리 숫자까지만 남기고 싶은 경우, 숫자에 100 또는 100보다 큰 10의 거듭제곱 수를 곱한 후, 원하는 어림수 내장 함수를 호출하고 처음 곱한 수를 다시 나누면 됩니다.let num = 1.23456; alert( Math.floor(num * 100) / 100 ); // 1.23456 -> 123.456 -> 123 -> 1.23
toFixed(n)
소수점 n 번째 수까지의 어림수를 구한 후 이를 문자형으로 반환해주는 메서드
Math.round와 유사하게 가장 가까운 값으로 올림 혹은 버림)
toFixedd의 반환값은 문자열이기 때문에 소수부의 길이가 인수보다 작으면 끝에 0이 추가됨let num = 12.36; alert( num.toFixed(1) ); // "12.4"
Infinity
로 처리됩니다.alert( 0.1 + 0.2 ); // 0.30000000000000004
let sum = 0.1 + 0.2;
alert( +sum.toFixed(2) ); // 0.3
Infinity
와 -Infinity
– 그 어떤 숫자보다 큰 혹은 작은 특수 숫자 값NaN
– 에러를 나타내는 값isNaN(value)
– 인수를 숫자로 변환한 다음 NaN인지 테스트함alert( NaN === NaN ); // false
isFinite(value)
– 인수를 숫자로 변환하고 변환한 숫자가 NaN
/Infinity
/-Infinity
가 아닌 일반 숫자인 경우 true
를 반환함
Object.is
와 비교하기Object.is는 ===처럼 값을 비교할 때 사용되는 특별한 내장 메서드인데, 아래와 같은 두 가지 에지 케이스에선 ===보다 좀 더 신뢰할만한 결과를 보여줍니다.
- NaN을 대상으로 비교할 때:
Object.is(NaN, NaN) === true
- 0과 -0이 다르게 취급되어야 할 때:
Object.is(0, -0) === false
숫자를 나타내는 비트가 모두 0이더라도 부호를 나타내는 비트는 다르므로 0과 -0은 사실 다른 값이긴 합니다.
이 두 에지 케이스를 제외하곤,Object.is(a, b)
와a === b
의 결과는 같습니다.이런 식의 비교는 자바스크립트 명세서에서 종종 찾아볼 수 있습니다. 내부 알고리즘에서 두 값을 비교해야 하는데, 비교 결과가 정확해야 하는 경우
Object.is
를 사용하죠.
+
또는 Number()
를 사용하여 숫자형으로 변형할 때, 피연산자가 숫자가 아니면 형 변환이 실패alert( +"100px" ); // NaN
parseInt
와 parseFloat
두 함수는 불가능할 때까지 문자열에서 숫자를 읽음parseInt
는 정수, parseFloat
는 부동 소수점 숫자를 반환alert( parseInt('100px') ); // 100
alert( parseFloat('12.5em') ); // 12.5
alert( parseInt('12.3') ); // 12, 정수 부분만 반환됩니다.
alert( parseFloat('12.3.4') ); // 12.3, 두 번째 점에서 숫자 읽기를 멈춥니다.
parseInt(str, radix)의 두 번째 인수
radix
는 원하는 진수를 지정해 줄 때 사용
Math.random()
Math.max(a, b, c...)
/ Math.min(a, b, c...)
n
을 power번 거듭제곱한 값을 반환합니다.
- 자바스크립트엔 세 종류의 따옴표가 있는데, 이 중 하나인 백틱은 문자열을 여러 줄에 걸쳐 쓸 수 있게 해주고 문자열 중간에 ${…}을 사용해 표현식도 넣을 수 있다는 점이 특징입니다.
- 자바스크립트에선 UTF-16을 사용해 문자열을 인코딩합니다.
- \n 같은 특수 문자를 사용할 수 있습니다. \u...를 사용하면 해당 문자의 유니코드를 사용해 글자를 만들 수 있습니다.
- 문자열 내의 글자 하나를 얻으려면 대괄호 [index]를 사용하세요.
- 부분 문자열을 얻으려면 slice나 substring을 사용하세요.
- 소문자로 바꾸려면 toLowerCase, 대문자로 바꾸려면 toUpperCase를 사용하세요.
- indexOf를 사용하면 부분 문자열의 위치를 얻을 수 있습니다. 부분 문자열 여부만 알고 싶다면 includes/startsWith/endsWith를 사용하면 됩니다.
- 특정 언어에 적합한 비교 기준 사용해 문자열을 비교하려면 localeCompare를 사용하세요. 이 메서드를 사용하지 않으면 글자 코드를 기준으로 문자열이 비교됩니다.
이외에도 문자열에 쓸 수 있는 유용한 메서드 몇 가지가 있습니다.
- str.trim() – 문자열 앞과 끝의 공백 문자를 다듬어 줍니다(제거함).
- str.repeat(n) – 문자열을 n번 반복합니다.
${…}
로 감싸고 이를 백틱으로 감싼 문자열 중간에 넣어주면 해당 표현식을 문자열 중간에 쉽게 삽입할 수 있음function sum(a, b) {
return a + b;
}
alert(`1 + 2 = ${sum(1, 2)}.`); // 1 + 2 = 3.
let guestList = `손님:
* John
* Pete
* Mary
`;
alert(guestList); // 리스트를 여러 줄에 걸쳐 작성
특수 문자 | 설명 |
---|---|
\n | 줄 바꿈 |
\', \" | 따옴표 |
\ | 역슬래시 |
\t | 탭 |
alert( 'I\'m the Walrus!' ); // I'm the Walrus!
// 백틱을 사용하면 좀 더 우아하게 표현 가능
alert( `I'm the Walrus!` ); // I'm the Walrus!
length
프로퍼티엔 문자열의 길이가 저장됨length는 프로퍼티입니다.
자바스크립트 이외의 언어를 사용했던 개발자들은 str.length가 아닌 str.length()로 문자열의 길이를 알아내려고 하는 경우가 있습니다. 하지만 원하는 대로 동작하지 않습니다.
length는 함수가 아니고, 숫자가 저장되는 프로퍼티라는 점에 주의하시기 바랍니다. 뒤에 괄호를 붙일 필요가 없습니다.
let str = `Hello`;
// 첫 번째 글자
alert( str[0] ); // H
alert( str.charAt(0) ); // H
// 마지막 글자
alert( str[str.length - 1] ); // o
// 접근하려는 위치에 글자가 없는 경우
alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (빈 문자열)
for..of
를 사용하면 문자열을 구성하는 글자를 대상으로 반복 작업 가능for (let char of "Hello") {
alert(char); // H,e,l,l,o (char는 순차적으로 H, e, l, l, o가 됨)
}
toLowerCase()
와 toUpperCase()
는 대문자를 소문자로, 소문자를 대문자로 변경(케이스 변경)시킴alert( 'Interface'.toUpperCase() ); // INTERFACE
alert( 'Interface'.toLowerCase() ); // interface
str.indexOf(substr, pos)
str
의 pos
에서부터 시작해, 부분 문자열 substr
이 어디에 위치하는지를 찾아줌let str = 'Widget with id';
alert( str.indexOf('Widget') ); // 0, str은 'Widget'으로 시작함
alert( str.indexOf('widget') ); // -1, indexOf는 대·소문자를 따지므로 원하는 문자열을 찾지 못함
alert( str.indexOf("id") ); // 1, "id"는 첫 번째 위치에서 발견됨 (Widget에서 id)
str.indexOf(substr, pos)
의 두 번째 매개변수 pos
는 선택적으로 사용할 수 있는데, 이를 명시하면 검색이 해당 위치부터 시작
문자열 내 부분 문자열 전체를 대상으로 무언가를 하고 싶다면 반복문 안에 indexOf
를 사용하면 됩니다. 반복문이 하나씩 돌 때마다 검색 시작 위치가 갱신되면서 indexOf
가 새롭게 호출됨
let str = 'As sly as a fox, as strong as an ox';
let target = 'as'; // as를 찾아봅시다.
let pos = 0;
while (true) {
let foundPos = str.indexOf(target, pos);
if (foundPos == -1) break;
alert( `위치: ${foundPos}` );
pos = foundPos + 1; // 다음 위치를 기준으로 검색을 이어갑니다.
}
let str = "As sly as a fox, as strong as an ox";
let target = "as";
let pos = -1;
while ((pos = str.indexOf(target, pos + 1)) != -1) {
alert( `위치: ${pos}` );
}
str.lastIndexOf(substr, position)
str.lastIndexOf(substr, position)는 indexOf와 유사한 기능을 하는 메서드입니다. 문자열 끝에서부터 부분 문자열을 찾는다는 점만 다릅니다.
let str = "Widget with id";
if (str.indexOf("Widget")) {
alert("찾았다!"); // 의도한 대로 동작하지 않습니다.
}
str.indexOf("Widget")
은 0을 반환하는데, if문에선 0
을 false
로 간주하므로 alert
창이 뜨지 않음-1
과 비교해야 함let str = "Widget with id";
if (str.indexOf("Widget") != -1) {
alert("찾았다!"); // 의도한 대로 동작합니다.
}
~
를 사용한 기법~n
은 -(n+1)
indexOf
가 -1을 반환하지 않는 경우를 if ( ~str.indexOf("...") )
로 검사하면 아래와 같이 리팩토링 가능let str = "Widget";
if (~str.indexOf("Widget")) {
alert( '찾았다!' ); // 의도한 대로 동작합니다.
}
str.includes(substr, pos)
는 str
에 부분 문자열 substr이
있는지에 따라 true
나 false
를 반환함str.startsWith
와 str.endsWith
는 메서드 이름 그대로 문자열 str이 특정 문자열로 시작하는지(start with) 여부와 특정 문자열로 끝나는지(end with) 여부를 확인할 때 사용 가능alert( "Widget with id".includes("Widget") ); // true
alert( "Hello".includes("Bye") ); // false
alert( "Widget".includes("id") ); // true
alert( "Widget".includes("id", 3) ); // false, 세 번째 위치 이후엔 "id"가 없습니다.
alert( "Widget".startsWith("Wid") ); // true, "Widget"은 "Wid"로 시작합니다.
alert( "Widget".endsWith("get") ); // true, "Widget"은 "get"으로 끝납니다.
start
부터 end
까지(🚨 end
는 미포함)를 반환let str = "stringify";
alert( str.slice(0, 5) ); // 'strin', 0번째부터 5번째 위치까지(5번째 위치의 글자는 포함하지 않음)
alert( str.slice(0, 1) ); // 's', 0번째부터 1번째 위치까지(1번째 위치의 자는 포함하지 않음)
start
와 end
에 음수를 넘기면 문자열 끝에서부터 카운팅을 시작start
와 end
사이에 있는 문자열을 반환substring
은 slice
와 아주 유사하지만 start
가 end
보다 커도 괜찮음start
에서부터 시작해 length
개의 글자를 반환substr
은 끝 위치 대신에 길이를 기준 으로 문자열을 추출한다는 점에서 substring
과 slice
와 차이메서드 | 추출할 부분 문자열 | 음수 허용 여부(인수) |
---|---|---|
slice(start, end) | start부터 end까지(end 미포함) | 음수 허용 |
substring(start, end) | start와 end 사이(end 미포함) | 음수는 0으로 취급함 |
substr(start, length) | start부터 length개의 글자 | 음수 허용 |
UTF-16
을 사용해 인코딩 됨str.codePointAt(pos)
: pos
에 위치한 글자의 코드를 반환String.fromCodePoint(code)
: 숫자 형식의 code
에 대응하는 글자를 만들어줍니다.alert( "z".codePointAt(0) ); // 122
alert( "Z".codePointAt(0) ); // 90
alert( String.fromCodePoint(90) ); // Z
str.localeCompare(str2)
를 호출하면 ECMA-402에서 정의한 규칙에 따라 str
이 str2
보다 작은지, 같은지, 큰지를 나타내주는 정수가 반환됨alert( 'Österreich'.localeCompare('Zealand') ); // -1