JavaScript의 값은 항상 특정 유형입니다. 예를 들어 문자열이나 숫자입니다.
JavaScript에는 8가지 기본 데이터 유형이 있습니다. 여기서는 일반적인 내용을 다루고 다음 장에서는 각각에 대해 자세히 설명하겠습니다.
변수에는 어떤 유형이든 넣을 수 있습니다. 예를 들어, 변수는 한때 문자열이었다가 숫자를 저장할 수 있습니다.
// 오류 없음 메시지 = "안녕하세요"; 메시지 = 123456;
JavaScript와 같이 이러한 기능을 허용하는 프로그래밍 언어를 "동적 유형"이라고 합니다. 즉, 데이터 유형이 존재하지만 변수는 그 어느 것에도 바인딩되지 않습니다.
n = 123이라고 하자; n = 12.345;
숫자 유형은 정수와 부동 소수점 숫자를 모두 나타냅니다.
숫자에는 곱하기 *
, 나누기 /
, 더하기 +
, 빼기 -
등과 같은 많은 연산이 있습니다.
일반 숫자 외에도 이 데이터 유형에 속하는 소위 "특수 숫자 값"이 있습니다: Infinity
, -Infinity
및 NaN
.
Infinity
수학적 무한대(Infinity)를 나타냅니다. 어떤 숫자보다 큰 특별한 값입니다.
0으로 나눈 결과를 얻을 수 있습니다.
경고( 1 / 0 ); // 무한대
아니면 직접 참조하세요.
경고(무한대); // 무한대
NaN
계산 오류를 나타냅니다. 이는 부정확하거나 정의되지 않은 수학 연산의 결과입니다. 예를 들면 다음과 같습니다.
경고( "숫자가 아닙니다." / 2 ); // NaN, 이러한 나누기는 잘못된 것입니다.
NaN
은 끈적합니다. NaN
에 대한 추가 수학 연산은 NaN
반환합니다.
경고( NaN + 1 ); // NaN 경고( 3 * NaN ); // NaN 경고( "숫자가 아닙니다." / 2 - 1 ); // NaN
따라서 수학 표현식 어딘가에 NaN
이 있으면 전체 결과로 전파됩니다(단 한 가지 예외가 있습니다: NaN ** 0
is 1
).
수학 연산은 안전합니다
수학을 하는 것은 JavaScript에서 "안전"합니다. 우리는 무엇이든 할 수 있습니다: 0으로 나누기, 숫자가 아닌 문자열을 숫자로 처리하기 등.
스크립트는 치명적인 오류("죽음")로 인해 결코 멈추지 않습니다. 최악의 경우 결과적으로 NaN
얻게 됩니다.
특수 숫자 값은 공식적으로 "숫자" 유형에 속합니다. 물론 이 단어의 상식적인 숫자는 아닙니다.
숫자 장에서 숫자 작업에 대해 더 자세히 알아볼 것입니다.
JavaScript에서 "숫자" 유형은 (2 53 -1)
( 9007199254740991
)보다 크거나 음수의 경우 -(2 53 -1)
보다 작은 정수 값을 안전하게 나타낼 수 없습니다.
정확하게 말하면 "숫자" 유형은 더 큰 정수(최대 1.7976931348623157 * 10 308
)를 저장할 수 있지만 안전한 정수 범위 ±(2 53 -1)
를 벗어나면 모든 숫자가 맞지 않기 때문에 정밀도 오류가 발생합니다. 고정 64비트 저장소로 이동합니다. 따라서 "대략적인" 값이 저장될 수 있습니다.
예를 들어 다음 두 숫자(안전 범위 바로 위)는 동일합니다.
console.log(9007199254740991 + 1); // 9007199254740992 console.log(9007199254740991 + 2); // 9007199254740992
즉, (2 53 -1)
보다 큰 모든 홀수 정수는 "number" 유형에 전혀 저장될 수 없습니다.
대부분의 경우 ±(2 53 -1)
범위이면 충분하지만 때로는 암호화 또는 마이크로초 정밀도 타임스탬프와 같이 매우 큰 정수의 전체 범위가 필요할 때도 있습니다.
BigInt
유형은 최근 임의 길이의 정수를 표현하기 위해 언어에 추가되었습니다.
BigInt
값은 정수 끝에 n
추가하여 생성됩니다.
// 끝에 있는 "n"은 BigInt임을 의미합니다. const bigInt = 1234567890123456789012345678901234567890n;
BigInt
숫자는 거의 필요하지 않으므로 여기서는 다루지 않고 별도의 BigInt 장에서 다루겠습니다. 이렇게 큰 숫자가 필요할 때 읽어보세요.
JavaScript의 문자열은 따옴표로 묶어야 합니다.
str = "안녕하세요"; let str2 = '작은따옴표도 괜찮습니다.'; letphrase = `다른 ${str}을 삽입할 수 있습니다`;
자바스크립트에는 3가지 유형의 따옴표가 있습니다.
큰따옴표: "Hello"
.
작은따옴표: 'Hello'
.
역따옴표: `Hello`
` .
큰 따옴표와 작은 따옴표는 "간단한" 따옴표입니다. JavaScript에서는 사실상 차이가 없습니다.
백틱은 "확장된 기능" 인용문입니다. 이를 통해 변수와 표현식을 ${…}
로 래핑하여 문자열에 포함할 수 있습니다. 예를 들면 다음과 같습니다.
이름 = "John"으로 설정; //변수 삽입 경고( `안녕하세요, ${name}!` ); // 안녕, 존! // 표현식 삽입 경고( `결과는 ${1 + 2}` ); // 결과는 3
${…}
내부의 표현식이 평가되고 결과는 문자열의 일부가 됩니다. 여기에는 name
과 같은 변수나 1 + 2
와 같은 산술 표현식 또는 더 복잡한 것 등 무엇이든 넣을 수 있습니다.
이 작업은 백틱에서만 수행할 수 있습니다. 다른 인용문에는 이러한 삽입 기능이 없습니다!
Alert( "결과는 ${1 + 2}" ); // 결과는 ${1 + 2}입니다(큰따옴표는 아무 작업도 수행하지 않음).
문자열 장에서 문자열에 대해 더 자세히 다룰 것입니다.
문자 종류가 없습니다.
일부 언어에는 단일 문자에 대한 특별한 "문자" 유형이 있습니다. 예를 들어 C 언어와 Java에서는 "char"라고 합니다.
JavaScript에는 그러한 유형이 없습니다. 유형은 string
뿐입니다. 문자열은 0개 문자(비어 있음), 1개 문자 또는 여러 문자로 구성될 수 있습니다.
부울 유형에는 true
와 false
두 가지 값만 있습니다.
이 유형은 일반적으로 예/아니요 값을 저장하는 데 사용됩니다. true
"예, 정확함"을 의미하고 false
"아니요, 부정확함"을 의미합니다.
예를 들어:
nameFieldChecked = true로 설정합니다. // 예, 이름 필드가 확인되었습니다. ageFieldChecked = false로 설정합니다. // 아니요, 연령 필드는 확인되지 않습니다.
부울 값은 비교의 결과로도 나타납니다.
isGreater = 4 > 1로 설정합니다. 경고( isGreater ); // true(비교 결과는 "yes")
논리 연산자 장에서 부울에 대해 더 자세히 다룰 것입니다.
특수 null
값은 위에 설명된 유형 중 어느 것에도 속하지 않습니다.
이는 null
값만 포함하는 별도의 자체 유형을 형성합니다.
나이 = null로 둡니다.
JavaScript에서 null
다른 언어처럼 "존재하지 않는 객체에 대한 참조"나 "널 포인터"가 아닙니다.
이는 "아무것도 없음", "비어 있음" 또는 "알 수 없는 값"을 나타내는 특별한 값일 뿐입니다.
위의 코드에서는 age
알 수 없다고 명시되어 있습니다.
undefined
특별한 값도 눈에 띕니다. null
과 마찬가지로 자체 유형을 만듭니다.
undefined
의 의미는 "값이 할당되지 않았습니다"입니다.
변수가 선언되었지만 할당되지 않은 경우 해당 값은 undefined
.
나이를 먹다; 경고(나이); // "정의되지 않음"을 표시합니다.
기술적으로는 변수에 undefined
명시적으로 할당하는 것이 가능합니다.
나이 = 100으로 둡니다. // 값을 정의되지 않음으로 변경합니다. 나이 = 정의되지 않음; 경고(나이); // "한정되지 않은"
…하지만 그렇게 하는 것은 권장되지 않습니다. 일반적으로 변수에 "빈" 또는 "알 수 없는" 값을 할당하기 위해 null
사용하는 반면, undefined
은 할당되지 않은 항목에 대한 기본 초기 값으로 예약되어 있습니다.
object
유형이 특별합니다.
다른 모든 유형은 해당 값이 단 하나의 항목(문자열, 숫자 등)만 포함할 수 있기 때문에 "원시"라고 합니다. 대조적으로, 객체는 데이터 컬렉션과 더 복잡한 엔터티를 저장하는 데 사용됩니다.
그만큼 중요한 물건은 특별한 대우를 받을 가치가 있습니다. 프리미티브에 대해 더 많이 배운 후 나중에 객체 장에서 이에 대해 다룰 것입니다.
symbol
유형은 객체의 고유 식별자를 생성하는 데 사용됩니다. 완전성을 위해 여기서 언급해야 하지만, 객체를 알 때까지 세부 사항을 연기합니다.
typeof
연산자는 피연산자의 유형을 반환합니다. 서로 다른 유형의 값을 다르게 처리하거나 빠르게 확인하고 싶을 때 유용합니다.
typeof x
호출하면 유형 이름이 포함된 문자열이 반환됩니다.
정의되지 않은 유형 // "정의되지 않음" 유형 0 // "숫자" 10n 유형 // "bigint" typeof true // "부울" typeof "foo" // "문자열" typeof Symbol("id") // "기호" 수학 유형 // "객체"(1) typeof null // "객체"(2) 경고 유형 // "함수" (3)
마지막 세 줄에는 추가 설명이 필요할 수 있습니다.
Math
수학적 연산을 제공하는 내장 객체입니다. 우리는 민수기 장에서 그것을 배울 것입니다. 여기서는 객체의 예 역할을 합니다.
typeof null
의 결과는 "object"
입니다. 이는 공식적으로 인식된 typeof
오류로, JavaScript 초창기부터 발생했으며 호환성을 위해 유지되었습니다. 확실히 null
객체가 아닙니다. 이는 자체 유형이 분리된 특별한 값입니다. 여기서는 typeof
의 동작이 잘못되었습니다.
typeof alert
의 결과는 "function"
입니다. alert
함수이기 때문입니다. 우리는 다음 장에서 JavaScript에 특별한 "함수" 유형이 없다는 것을 알게 될 함수를 연구할 것입니다. 함수는 객체 유형에 속합니다. 그러나 typeof
이를 다르게 처리하여 "function"
반환합니다. 그것은 또한 JavaScript 초기부터 나온 것입니다. 기술적으로 이러한 동작은 올바르지 않지만 실제로는 편리할 수 있습니다.
typeof(x)
구문
또 다른 구문인 typeof(x)
접할 수도 있습니다. typeof x
와 동일합니다.
명확히 말하면 typeof
함수가 아니라 연산자입니다. 여기의 괄호는 typeof
의 일부가 아닙니다. 수학적 그룹화에 사용되는 일종의 괄호입니다.
일반적으로 이러한 괄호에는 (2 + 2)
와 같은 수학 표현식이 포함되지만 여기서는 인수 (x)
하나만 포함됩니다. 구문론적으로 typeof
연산자와 인수 사이에 공백을 피할 수 있으며 일부 사람들은 이를 좋아합니다.
typeof x
구문이 훨씬 더 일반적이지만 어떤 사람들은 typeof(x)
선호합니다.
JavaScript에는 8가지 기본 데이터 유형이 있습니다.
7가지 기본 데이터 유형:
모든 종류의 숫자에 대한 number
: 정수 또는 부동 소수점, 정수는 ±(2 53 -1)
로 제한됩니다.
임의 길이의 정수에 대한 bigint
.
문자열을 위한 string
. 문자열에는 0개 이상의 문자가 포함될 수 있으며 별도의 단일 문자 유형은 없습니다.
true
/ false
에 대한 boolean
.
알 수 없는 값인 경우 null
– 단일 값이 null
인 독립형 유형입니다.
할당되지 않은 값에 대해 undefined
- 단일 값이 있는 독립형 유형 undefined
.
고유 식별자에 대한 symbol
.
그리고 하나의 비원시 데이터 유형:
더 복잡한 데이터 구조를 위한 object
.
typeof
연산자를 사용하면 변수에 어떤 유형이 저장되어 있는지 확인할 수 있습니다.
일반적으로 typeof x
로 사용되지만 typeof(x)
도 가능합니다.
"string"
과 같이 유형 이름이 포함된 문자열을 반환합니다.
null
"object"
반환하는 경우 이는 언어 오류이며 실제로는 객체가 아닙니다.
다음 장에서는 기본 값에 집중하고 일단 익숙해지면 객체로 넘어갈 것입니다.
중요도: 5
스크립트의 출력은 무엇입니까?
let name = "일리아"; 경고( `안녕하세요 ${1}` ); // ? 경고( `안녕하세요 ${"name"}` ); // ? 경고( `안녕하세요 ${name}` ); // ?
백틱은 ${...}
내부의 표현식을 문자열에 포함합니다.
let name = "일리아"; // 표현식은 숫자 1입니다. 경고( `안녕하세요 ${1}` ); //안녕하세요 1 // 표현식은 문자열 "name"입니다. 경고( `안녕하세요 ${"name"}` ); // 안녕하세요 이름 // 표현식은 변수이므로 포함하세요. 경고( `안녕하세요 ${name}` ); // 안녕 일리아