<자바스크립트 완벽가이드> 2주차

이현정·2022년 5월 27일
0

🔖 읽은 범위: 3장(~p.68) 타입, 값, 변수

✨ 책갈피

3.1 개요와 정의

  • 자바스크립트에서 숫자, 문자열, 불, 심벌, null, undefined 중 어느것에도 속하지 않는 값은 모두 객체입니다.

  • 객체는 이름 붙은 값의 순서 없는 집합입니다.

  • 배열은 값의 순서 있는 집합이며 각 값은 숫자로 표현됩니다(이름은 없습니다)

  • 자바스크립트에는 기본적인 객체와 배열 외에도 유용한 객체 타입이 많습니다.

  • 자바스크립트의 함수와 클래스는 그저 문법의 일부분이라고 볼 수는 없는데, 이 점이 다른 정적 언어와의 차이입니다. 자바스크립트의 함수와 클래스는 그 자체가 값이므로 프로그램에서 조작할 수 있습니다.

  • 자바스크립트는 객체 지향 프로그래밍 스타일을 지원합니다.
    대략적으로 말하자면, 함수가 다양한 타입의 값을 다루는 것이 아니라 객체(타입 자체)에 그 값을 다루는 메서드를 정의합니다.
    예를 들어 배열 a의 요소를 정렬할 때 a를 sort() 함수에 전달하지 않습니다. 대신 다음과 같이 a의 sort() 매서드를 호출합니다.

    a.sort()
  • 자바스크립트이 객체 타입(Object Type or Reference Type)은 가변(mutable), 기본 타입(Primitive Type)은 불변(immutable)입니다.

  • 자바스크립트는 값의 타입을 자유롭게 변환합니다.
    예를 들어 .... 문자열이 와야할 곳에 숫자를 쓰면 자바스크립트는 자동으로 그 숫자를 문자열로 변환합니다.

  • 자바스크립트는 상수와 변수의 이름을 통해 값을 참조합니다.

3.2 숫자

  • 오버플로와 언더플로 p.31
  • 0으로 나눠도 에러 x
  • NaN 값은 자기 자신을 포함해 어떤 값과도 같지 않다.
  • 부동 소수점 표현:

    추가 공부
    간단히 정리하면 우리의 일상 생활 숫자인 10진수를 컴퓨터 숫자인 2진수로 바꿀 때, 10진수로 소수인 수 중 2진수로 바꿀 수 없는 수가 존재한다.(ex. 0.3 => 0.01001100110011......(0011)의 무한 반복입니다.) 이 때 근삿값을 저장하게 되는데, 여기에는 두 가지 방법이 있다: 고정 소수점 표현과 부동 소수점 표현.

    • 고정 소수점 표현법: 정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트 만큼만 사용해서 숫자를 표현하는 방식.
      이렇게 약속 된 시스템에서 263.3을 표현하면 (0)0000000100000111.010011001100110 이렇게 표현됩니다.
    • 부동 소수점 표현: 이런 문제를 해결하기 위해서 소수점을 고정하지 않고 둥둥 떠 다닐 수 있게 하는 부동 소수점(floating point)을 사용하고 있습니다.
      263.3을 부동 소수점 표현법으로 표현하면 100000111.010011001100110... 으로 표현되던 것을 맨 앞에 있는 1 바로 뒤로 소수점을 옮겨서 표현하도록 변환합니다. 그러면1.00000111010011001100110... * 2^8(2의 8승) 으로 표현 됩니다.
  • 반올림 오류: 이러한 IEEE 754 부동 소수점 표현은 2진 표현이며 1/2, 1/8 같은 분수는 정확히 표현할 수 있지만, 우리가 재무 계산 등 실제로 자주 사용하는 분수 1/10, 1/100 등은 정확히 표현하지 못한다.
    이러한 이유로 아래와 같은 반올림 오류가 생길 수 있다.
    	let x = .3-.2;
    	let y = .2-.1;
    	x === y;        // => false: 두 값은 같지 않습니다.
       x === .1;       // => false: 0.3-0.2는 0.1과 같지 않습니다.
       y === .1;       // => true: 0.2-0.1은 0.1입니다. 
  • BigInt 는 ES2020에서 정의한 자바스크립트의 최신 기능 중 하나로, 값이 정수인 숫자 타입.]

    나중에 체크하자

3.3 텍스트

  • 문자, 코드 포인트, 자바스크립트 문자열:
    코드 포인트가 16비트를 넘는 유니코드 문자는 16비트 값 두 개를 연속으로 쓰는 UTF-16 으로 인코드합니다.

    		let euro = "€";
    		let love = "💖";
    		euro.length       // => 1: 이 문자는 16비트 요소 하나입니다.
    		love.length       // => 2: 💖는 UTF-16 인코딩으로, \ud83d\udc99 입니다.
  • 문자열 리터럴: '', "", ``
    작은 따옴표를 쓸 때는 문자열 안의 '앞에 \처리 해줘야 한다.

  • 문자열 리터럴 안의 이스케이프 시퀀스:
    자바스크립트에서 역슬래시()는 특별한 의미를 갖습니다.일반적인 방법으로 문자열에 표시할 수 없는 문자를 표현합니다.

    		'You\'re right, it can\'t be a quote'
  • 문자열 다루기:
    자바크립트는 length 프로퍼티 외에도 다양한 문자열 API가 있습니다.

    		let s = "Hello, world";   // 이 텍스트를 예제에 사용합니다.
    
    		//문자열 일부 가져오기
    		s.substring(1,4) 	//=>"ell"
    		s.slice(1,4) 		//=>"ell": 같은 결과
    		s.slice(-3)			//=>"rld": 마지막 세 문자
    		s.split(",")		//=>["Hello","world"]
    
    		//문자열 검색
    		s.indexOf("l")		//=> 2: l이 처음 나타난 위치
    		s.indexOf("l",3)	//=> 3: 3번 문자부터 시작해 l이 처음 나타난 위치
    		s.indexOf("zz")		//=> -1: s에는 zz라는 문자열이 들어있지 않습니다.
    		s.lastIndexOf("l")  //=> 10: l이 마지막으로 나타나는 위치
    
    		//불을 반환하는 검색 함수는 ES6에서 추가됐습니다.
    		s.startWith("Hell") 	//=> true: s는 Hell 로 시작.
    		s.endWith("!")			//=> false: s는 !로 끝나지 x
    		s.includes("or")		//=> true: s는 or이 들어있음.
    
    		// 문자열을 변경합니다.
    		s.replace("llo","ya")	//=> "Heya, world"
    		s.toLowerCase()			//=> "hello, world"
    		s.toUpperCase()			//=> "HELLO, WORLD"
    		s.normalize()			// 유니코드 NFC 정규화는 ES6에서 추가되었다.
    		s.normalize("NFD")		// NFD 정규화. NFKC, NFKD도 있다.
    	
    		//문자열의 각 16비트 문자를 검사
    		// 그냥 대괄호[]를 써서 접근할 수 도 있다. s.chartAt(0) 은 s[0] 의 결과와 같다.
    		s.charAt(0)				//=> "H": 첫 번째 문자
    		s.charAt(s.length-1)	//=> "d": 마지막 문자
    		s.charCodeAt(0)			//=> 72: 주어진 위치의 16비트 숫자
    		s.codePointAt(0)		//=> 72: 16비트보다 큰 코드 포인트에서 동작하는 ES6 기능
    
    		// 패딩 함수는 ES2017에서 추가됐습니다. 
    		// *pad: 덧대다 
    		"x".padStart(3)			//=> "   x": 왼쪽에 스페이스를 3개 더한다.
    		"x".padEnd(3)			//=> "x   ": 오른쪽에 스페이스 3개를 더한다.
    		"x".padStart(3, "*")	//=> "**x": *를 왼쪽에 붙여 길이를 3에 맞춘다.
    		"x".padEnd(3, "-")		//=> "x--": -를 오른쪽에 붙여 길이를 3에 맞춘다.
    
    		// 공백 제거 	trim()은 ES5, 나머지는 ES2019 기능입니다.
    		" test ".trim()			//=> "test": 앞뒤 공백을 제거
    		" test ".trimStart()	//=> "test ": 왼쪽 공백 제거
    		" test ".trimEnd()		//=> " test": 오른쪽 공백 제거
    
    		// 그 외의 문자열 메서드
    		s.concat("!")			//=> "Hello, world!": +연산자를 쓰는게 더 간단하다. *concat: 연결하다
    		"<>".repeat(5)			//=> "<><><><><>": n번 복사합니다. ES6에서 추가됐습니다.
  • 템플릿 리터럴:
    ES6부터는 백틱으로 감싼 문자열 리터럴을 사용할 수 있습니다. 하지만 이것은 일반적인 문자열 리터럴 문법과는 다르게, 임의의 자바스크립트 표현식을 넣을 수 있는 템플릿 리터럴 입니다.

       let name = "Bill";
    		let greeting = `Hello ${name}.` // greeting == "Hello Bill."
  • 태그된 템플릿 리터럴:
    여는 백틱 바로 앞에 함수 이름(태그)이 있으면 템플릿 리터럴의 텍슽와 표현식 값이 함수에 전달됩니다.

    		// ES6에는 내장된 태그 함수 String.raw()가 있습니다. 역슬래시 이스케이프를 처리하지 않고 백틱 안의 텍스트를 반환합니다.
    		`\n`.length				//=> 1: 이 문자열에는 뉴라인 문자 하나만 있습니다.
    		String.raw`\n`.length  //=> 2: 역슬래시 문자와 n
  • 패턴 매칭:
    자바스크립트에는 문자열 내부의 패턴을 정의하고 매칭하는 정규 표현식(RegExp)이라는 데이터 값이 있습니다.
    => 정규식은 따로 공부하자. 책의 예제만 봐서는 모르겠다.

❓ 궁금점

s.substring vs. s.slice
s.normalize() // 유니코드 NFC 정규화는 ES6에서 추가되었다.
s.normalize("NFD") // NFD 정규화. NFKC, NFKD도 있다.

정규식 https://songsong.dev/9

1개의 댓글

comment-user-thumbnail
2022년 6월 2일

정규표현식은 드림코딩엘리님 강의보면 좋아요! 근데 쓰는 건 저도 정말 힘들어요 ㅜㅜ

답글 달기