자바스크립트를 말하다 (1) 복습
Speaking Javascript 책을 읽으며, 특별히 눈에 들어왔던 내용만 기록
Statement(문)과 Expression(표현식)
1 | var foo; |
문은 ‘동작’을 의미하며, 프로그램은 기본적으로 문의 연속입니다.
1 | // 표현식 |
표현식은 값을 생성하며, 함수 매개변수와 할당문의 오른편을 말합니다.
원시값
다음은 모두 원시 값*입니다.
- 불리언: true, false
- 숫자: 1736, 1.351
- 문자열: ‘abc’
- 값 아닌 값: undefined, null
특징1: 항상 불변
프로퍼티를 변경, 추가, 제거 할 수 없음
1 | let str = 'abc'; |
객체 = 원시값이 아닌 것
종류1: 객체 리터럴
1 | { |
종류2: 배열 리터럴
1 | [1,2,3] |
종류3: 정규표현식 리터럴
1 | /^a+b+$/ |
특징1: 유일성을 비교하며, 값이 같더라도 엄연히 다르다
참조 비교시
1 | const empty1 = {}; |
특징2: 변경이 가능 (원시값과 차별점)
1 | const obj = {}; |
undefined와 null
정보가 없음을 의미하는 두 단위
개인적으로 생각하는 차이점은 undefined는 선언도 되지 않았다. null은 선언되었지만 값이 존재하지 않는다. 로 생각한다.
null은 객체가 아니다라는 뜻
undefined, null 둘다 프로퍼티와 표준 메서드가 존재하지 않음
체크법
1 | if (x === undefined || x === null) { // undefined == null은 true지만, ===은 false이다. |
typeof와 instanceof 로 값 분류
1 | typeof value // boolean or string, function, object(ex. [], {}) |
참고로, typeof null은 object로 반환된다. 자바스크립트 자체 버그잼
1 | value instanceof Constructor |
숫자
1 | 1 === 1.0 // true |
NaN = Not a Number
에러값
1 | Number(`xyz`) // NaN |
Infinity
에러로 생긴 값
1 | 3 / 0 // infinity |
연산자
조금 신기한 함수 연산자
1 | +a(); // 함수는 문자열을 반환하고, 연산자는 이를 숫자!로 변환 |
끌어올림 = hoisting
호이스팅을 한글화하면 끌어올림이라고 하는구나, 처음 앎
자릿수 강제
1 | function pair(x, y) { |
그런데 arguments를 이용한 코딩을 잘 안하는걸로 알고 있는데 좀 알아봐야겠군…
Arguments를 배열로 변환
arguments는 배열이 아님, 조금 특별한 객체일 뿐. 하지만 length가 붙어있음.
그러나, 인덱스를 써서 요소에 접근은 가능하지만, 제거하거나 배열 메서드를 호출할 수는 없다.
그러므로 가끔 배열로 써야할 경우 다음 방법을 사용
1 | function toArray(arrayLikeObject) { |
IIFE 패턴: 새 스코프
IIFE가 뭔지 몰랐었는데 즉시 호출 함수식을 말하는거 였음. 이피 잼
1 | let result = []; |
in 연산자
1 | const taeuk = { |
추출 메서드
주의점: 메서드를 추출하면 객체와의 연결이 사라짐, 함수로 변경되는 것
그러므로, this도 undefined로 변경됨
1 | const taeuk = { |
forEach의 두번째 문구가 this 바꾸는거였음
1 | arr.forEach(callback[, thisArg]); |
매개변수
각 요소에 대해 실행할 함수. 다음 세 가지 인수를 받습니다.
currentValue처리할 현재 요소.
indexOptional처리할 현재 요소의 인덱스.
arrayOptionalforEach()를 호출한 배열.
thisArg Optional
callback을 실행할 때 this로 사용할 값.
정규표현식
1 | /^abc$/ |
test() 메서드: 일치하는 것이 있는지 확인
1 | /^a+b+$/.test(`aaab`) // true |
exec() 메서드: 일치하는 그룹을 캡처
1 | /a(b+)a/.exec(`_abbba_aba_`) // [`abbba`, `bbb`] |
반환된 배열의 인덱스 0은 일치하는 그룹 전체!, 1 이후부터는 캡처한 그룹!
이 메서드를 반복해 일치하는 그룹을 모두 캡처하는 방법도 존재 (추후에 알아볼 듯)
replace() 메서드: 검색과 교체
1 | ` `.replace(/<(.*?)>/g, '[$1]') // [a] [bbb] |
으음 위 코드 정상 작동 안하는거 같은데… replace MDN 참조해봐야 알 듯