자바스크립트에는 int, double 등을 따로 구분하지 않고 하나의 숫자 타입만 존재한다.
따라서 모든 숫자 타입은 실수로 처리되고, 정수만 표현하기 위한 데이터 타입은 별도로 존재하지 않는다.
console.log(1 === 1.0); //true
console.log(3/2); //1.5
2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않기 때문에 이를 참조하면 모두 10진수로 해석된다.
var bin = 0b01000001;
var oct = 0o101;
var hex = 0x41;
console.log(bin); //65
console.log(oct); //65
console.log(hex); //65
console.log(bin === oct); //true
console.log(oct === hex); //true
무한대, 산술연산불가를 표현하기 위한 값도 존재한다.
console.log(10/0); //Infinity: 양의 무한대
console.log(10/-0); //-Infinity: 음의 무한대
console.log(1*'String'); //NaN
💡 Infinity 예외처리
자바스크립트에는 0으로 나눈 결과를 표현하기 위한 값인 Infinity, -Infinity가 있기 때문에 이를 이용해 예외처리를 해 줄 수 있다(달리 말하면 프로그램이 오류를 내지 않고 Infinity로 표현해 버리기 때문에 해 줘야 한다 → 라고 나는 이해했는데 맞나유). 아래 코드 참고!!
try {
var result = 10/0;
if(result == 'Infinity'){ //무한대일 경우 강제 예외 발생
throw 'DivideByZeroException';
}
alert(result);
} catch(exception) {
alert(exception);
}
)로 텍스트를 감싸서 표현할 수 있다.즉, 따옴표로 감싸지 않으면 자바스크립트 엔진은 이를 키워드는 식별자 같은 토큰으로 인식한다.
var str1 = 'hello'; //hello를 문자열로 인식
var str2 = hello; //hello를 식별자로 인식. ReferenceError: hello is not defined
ES6부터 템플릿 리터럴이라고 하는 새로운 문자열 표기법이 도입되었다.
템플릿 리터럴은 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리한다.
백틱(
)으로 감싸서 표현한다.
//멀티라인 문자열(일반 문자열은 개행이 허용되지 않기 때문에 공백을 표현하려면 백슬래시 사용)
var multiLine = `hello
world`;
//표현식
var expression = `1 + 2 = ${1 + 2}`;
💡 라인 피드와 캐리지 리턴
개행 문자에는 라인 피드와 캐리지 리턴, 2가지가 있다(둘다 과거 타자기에서 유래).
라인 피드(\n): 커서를 정지한 상태에서 종이를 한 줄 올리기
캐리지 리턴(\r): 종이를 움직이지 않고 커서를 맨 앞줄로 이동
CRLF: 캐리지 리턴(커서를 맨 앞줄로 이동) 후 라인 피드(종이를 한 줄 올리기)하는 방식으로 개행
운영체제마다 개행 방식이 조금씩 다르다.
윈도우: CRLF(캐리지리턴, \r + 라인피드, \n)
유닉스: LF(라인피드, \r)
macOS: 버전 9까지는 CR(캐리지리턴, \r), 10부터는 LF(라인피드, \n)
그래서 서로 다른 운영체제에서 작성한 텍스트 파일은 서로 개행 문자를 인식하지 못한다. 다만 대부분의 텍스트 에디터는 운영체제에 맞게 개행문자를 자동 변환해주므로 큰 문제는 없다.
자바스크립트에서 LF와 CR 둘 다 개행을 의미하지만, 대부분 라인 피드(\n)를 사용해 개행한다.
💡 태그드 템플릿
템플릿 리터럴의 발전된 형태로써, 함수 형태로 사용할 수 있다. 이 문법은 문자열에서 userName, age와 같은 변수(동적 데이터)와 “hi”, “hello” 같은 문자열(정적 데이터)를 구분지을 수 있다. 아래 코드 참고!!
const meal = 'dinner';
const taste = 'good';
function getSnackTaste(string, meal, taste) {
console.log(string);
console.log(meal);
console.log(taste);
}
getSnackTaste`Today, ${meal} is ${taste}`;
이렇게 함수에 템플릿 리터럴을 넣어 주면, 동적 데이터와 정적 데이터를 파싱해서 보여준다.
const meal = 'dinner';
const taste = 'good';
function getSnackTaste(string, ...values) {
console.log(string);
console.log(values);
}
getSnackTaste`Today, ${meal} is ${taste}`;
Rest Parameters를 활용하면 파라미터(동적데이터)가 아무리 늘어나도 확장성 있게 코드를 사용할 수 있다.
💡 스타일드 컴포넌트
태그드 템플릿 문법을 적극적으로 사용하는 라이브러리 중 하나가 styled-components이다. 정적데이터와 동적데이터를 자동으로 파싱해주는 템플릿 리터럴을 활용해 css 스타일에 관련된 값들을 동적데이터로 넣을 수 있다. (찾아보는 김에 개발자 도구에 외계어 뜨는 이유도 찾아보려 했지만… 못찾음) → css in js가 애초에 자바스크립트에서 편하게 쓰려고 만든거라 원래 css가 아님. 컴파일되어버린 css가 개발자도구에 떠서그럼
성능 면에서는 순수css가 좋음(컴파일 단계를 생략할 수 있어서)
근데 순수css를 안 쓰는 이유: 코드가 더러워짐(따로 css파일생성), 개발자 입장에서 불편함(다 일일이 고쳐야해서)
const Btn = styled.button `
height: 2rem;
font-size: 1rem;
color: ${props => props.color};
background: ${props => props.background};
`
//심벌 값 생성
var key = Symbol('key');
console.log(typeof key); //symbol
//객체 생성
var obj = {};
//이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); //value